Главная страница

Курс лекций по дисциплине Программирование на языке Фортран


Скачать 0.98 Mb.
НазваниеКурс лекций по дисциплине Программирование на языке Фортран
Дата02.09.2019
Размер0.98 Mb.
Формат файлаdoc
Имя файлаFortran01.doc
ТипКурс лекций
#85698
страница5 из 15
1   2   3   4   5   6   7   8   9   ...   15
или втором аргументе равен 1, то в результате на это место устанавливается 1.

Пример: IOR (240,90) = 250, IOR


ISHL (intA,intB)

ISHFT (intA,intB)

Если intB больше либо равен нулю, производится логический сдвиг влево intA на intB позиций. Если intB меньше нуля, производится логический сдвиг вправо intA на intB позиций.

ISHA (intA,intB) ‑ если intB больше либо равен нулю, производится арифметический сдвиг влево intA на intB позиций. Если intB меньше нуля, производится арифметический сдвиг вправо intA на intB позиций.

ISHC (intA,intB) ‑ если intB больше либо равен нулю, производится циклический сдвиг влево intA на intB позиций. Если intB меньше нуля, производится циклический сдвиг вправо intA на intB позиций

IEOR (intA,intB) ‑ если n-ые биты в первом и втором аргументе равны друг другу, то в результате на это место устанавливается 0, в противном случае n-ый бит равен 1.

Пример: IEOR (240,90) = 170, IEOR

IAND (intA,intB) ‑ если n-ые биты в первом и втором аргументе равны 1 то в результате на это место устанавливается 1, в противном случае n-ый бит равен нулю.

Пример: IAND (240,90) = 80, IAND

NOT (intA) ‑ если n-ый бит в аргументе равен 1 то в результате на это место устанавливается 0, в противном случае n-ый бит равен единице.

IBCLR (intA,intB) ‑ очистка бита номер intB в числе intA.

IBSET (intA,intB) ‑ установка бита номер intB в числе intA.

IBCHNG (intA,intB) ‑ замена бита номер intB в числе intA на противоположный.

Примеры операций с битами:

функция

IntA

результат

ISHFT (intA,2)

10010000 11000101

01000011 00010100

ISHFT (intA,-2)

10010000 11000101

00100100 00110001

ISHA (intA,3)

10000000 11011000

00000110 11000000

ISHA (intA,-3)

10000000 11011000

11110000 00011011

ISHC (intA,3)

01110000 00000100

10000000 00100011

ISHC (intA,-3)

01110000 00000100

10001110 00000000

NOT (intA)

00011100 01111000

11100011 10000111

IBCLR (intA,4)

00011100 01111000

00011100 01101000

IBSET (intA,14)

00011100 01111000

01011100 01111000

IBCHNG (intA,5)

00011100 01111000

00011100 01011000

BTEST (intA,2)

00011100 01111000

.FALSE.

BTEST (intA,3)

00011100 01111000

.TRUE.

! Битовые функции

10 write(*,*) IOR (240,90) ! 250

write(*,*) IEOR (240,90) ! 170

write(*,*) IAND (240,90) ! 80

write(*,*) ISHL (2,1) ! 4

write(*,*) ISHFT (2,1) ! 4

write(*,*) ISHA (2,1) ! 4

write(*,*) ISHC (240,90) ! -1073741821

Битовые функции могут использоваться при шифровании:

! Простейшее шифрование заменой

program Crypt01

implicit none

Character*20 ch1, ch2

Integer i
ch1='Hello World!' ! Исходная строка

ch2='' ! Зашифрованная строка

ch3='' ! Расшифрованная строка

do i=1,len(ch1) ! Цикл по символам

ch2(i:i)=char(NOT(ichar(ch1(i:i))))

end do

write(*,*)’Зашифрованная строка: ', ch2 ! '·љ““ђЯЁђЌ“›НЮЯЯЯЯЯЯЯ'
do i=1,len(ch2) ! Цикл по символам

ch3(i:i)=char(NOT(ichar(ch2(i:i))))

end do

write(*,*)’Расшифрованная строка: ', ch3

end



! XOR шифрование (сложением по модулю два)

! Зашифрованная информация: z = (x XOR y), х - исходная, y - ключ.

! Восстановление по ключу: x = (z XOR y)

subroutine Crypt02

implicit none

Character*24 ch1, ch2, ch3, chkey

Character*24 keygen

Integer*4 i
ch1= 'Hello World!' ! Исходная строка

chkey=keygen(len(ch1)) ! Генерация случайного ключа той же длины что исходная строка

!chkey='Privet Mir!!' ! Ключ (желательно такой же длины)

write(*,*)

write(*,*)'Сгенерированный случайным образом ключ: ', chkey

do i=1,len(ch1) ! Цикл по символам

ch2(i:i)=char(ieor(ichar(ch1(i:i)),ichar(chkey(i:i))))

end do

write(*,*)'Зашифрованная строка: ', ch2
do i=1,len(ch2) ! Цикл по символам

ch3(i:i)=char(ieor(ichar(ch2(i:i)),ichar(chkey(i:i))))

end do

write(*,*)'Расшифрованная строка: ', ch3

end
function keygen(n)

character*24 keygen

integer*4 n

Integer*2 i1,i2,i3,i4,n1*4,n2*4

Real*4 r
call gettim(i1,i2,i3,i4) ! Получение времени

call seed(i4) ! "Затравка" долями секунды

n1=1 ! Нижний предел случайного кода символа

n2=255 ! То же верхний

do i=1,n

call random(r) ! Случайное число от 0 до 1

keygen(i:i)=char(int4(n1+(n2-n1)*r)) ! Случайный символ

end do

end



! Функция перевода целого 8-ми битового числа из десятичной системы

! счисления в двоичную. (-128
character*8 function To2(d10)

integer*1 i, d10

To2='00000000'

do i=1,8

if (BTEST(d10,i-1)) To2(i:i)='1' ! Запись 1 в позиции бита

end do

end
! Функция BTEST

Integer*1 iarr(2) /2#10101010, 2#11010101/

Logical result(2)

Result=btest(iarr,

Write(*,*)btest(2#0001110001111000,2) ! F

Write(*,*)btest(2#0001110001111000,3) ! T

! Функция IBITS

k=ibits(2#1010,1,3) ! Возвращает 2#101=5

print ‘(b8)’ ! 101

! Функции IAND, IEOR, IOR

Integer*2 k/198/ ! 198 (=2#11000110)

Integer*2 mask/129/ ! 129 (=2#10000001)

Write(*,*) iand(k,mask) ! 128 (=2#10000000)

Write(*,*) ieor(k,mask) ! 71 (=2#01000111)

Write(*,*) ior(k,mask) ! 199 (=2#11000111)
! Функции ISHA, ISHL, ISHC, ISHFT, ISHFTC

Integer*1 k/-64/ ! -64 (=2#11000000)

Integer*1 i/10/ ! 10 (=2#00001010)

Integer*2 j/10/ ! 10 (=2#0000000000001010)

! Функция ISHA (правый сдвиг)

Print ‘(1x,b8.8)’, isha(k,-3) ! 11111000 (=-8)

! Функция ISHL (правый сдвиг)

Print ‘(1x,b8.8)’, ishl(k,-3) ! 00011000 (=24)

! Функция ISHC (левый сдвиг)

Print ‘(1x,b8.8)’, ishс(i,5) ! 01000001 (=65)
! Решение задачи отсечения отрезков выходящих за пределы экрана с использованием алгоритма Сазерленда-Кохена

! Окно вывода разбивает своими сторонами и их продолжениями растровую плоскость на 9 областей. ! Для каждой области устанавливается 4-битовый код

! с1, с2 – коды расположения соответственно первой и второй вершин отрезка (x1,y1)-(x2,y2)

! XL, XR, YB, YT – координаты границ окна вывода.

! Если IOR(c1,c2)=0, то отрезок внутри окна

! Если IAND(c1,c2)>0, то отрезок не пересекает окна

! Если IOR(c1,c2)>0 и IAND(c1,c2)=0, то отрезок может пересекать окно

! Для сокращения кода программы сначала выполним все отсечения для одной вершины, затем поменяем их местами и повторим действия
program ClipLine

implicit none

integer*2 xl, xr, yb, yt

integer*2 x1, y1, x2, y2

integer*2 c1, c2, code

logical fl/.false./

! Тестовые значения

xl=0

xr=1

yb=0

yt=1

x1=-1

y1=-1

x2=3

y2=2
c1=code(x1,y1,xl,xr,yb,yt)

c2=code(x2,y2,xl,xr,yb,yt)

do while(iand(c1,c2).eq.0.and.ior(c1,c2).gt.0)

if(c1.eq.0)then

fl=.not.fl

call swap(x1,x2) ! Обмен вершинами отрезка

call swap(y1,y2)

call swap(c1,c2)

end if

if(x1.lt.xl) then ! Отсечение слева

y1=y1+dfloat(y2-y1)*dfloat(xl-x1)/dfloat(x2-x1)

x1=xl

elseif(y1.lt.yb) then ! Отсечение снизу

x1=x1+dfloat(x2-x1)*dfloat(yb-y1)/dfloat(y2-y1)

y1=yb

elseif(x1.gt.xr) then ! Отсечение справа

y1=y1+dfloat(y2-y1)*dfloat(xr-x1)/dfloat(x2-x1)

x1=xr

elseif(y1.gt.yt) then ! Отсечение сверху

x1=x1+dfloat(x2-x1)*dfloat(yt-y1)/dfloat(y2-y1)

y1=yt

end if

c1=code(x1,y1,xl,xr,yb,yt) ! Код вершины 2 не изменился

end do

if (fl) then ! Обмен вершин отрезка

call swap(x1,x2)

call swap(y1,y2)

call swap(c1,c2)

end if

if (ior(c1,c2).eq.0) then

write(*,*)'(x1,y1)-(x2,y2):', x1,y1,x2,y2

else

write(*,*)'Отрезок вне окна'

end if

end program ClipLine
subroutine swap(a,b) ! Перестановка значений

integer*2 a, b, hold

hold=a

a=b

b=hold

end subroutine swap

! Вычисление кода области расположения вершины с координатами x,y

function code(x,y,xl,xr,yb,yt)

integer*2 x,y,xl,xr,yb,yt,code

code=0

if(x.lt.xl) code=ior(code,2#1000)

if(y.lt.yb) code=ior(code,2#0001)

if(x.gt.xr) code=ior(code,2#0010)

if(y.gt.yt) code=ior(code,2#0100)

end function code
Встроенные функции Fortran





RND[(n#)]




Возвращает случайное число одинарной точности между 0 и 1. N# - первое число, задающее последовательность генерируемых случайных чисел.



Числовые справочные и преобразующие функции

Каждая разновидность целого типа моделируется множеством: , где s=1, q – положительное целое число, r – целое число>1 (обычно каждое из Wk – целое число в интервале 0Wkr). =‑1(120+121+122+123+124+125+...)=‑(1+2+4+8+16+...)

Каждая разновидность вещественного типа моделируется множеством: , где s=1, p и b – целые числа>1, e – целое число emineemax, каждое из fk – целое число 0fkb, кроме f1, которое должно быть вдобавок ненулевым.

DIGITS(x) – для вещественных или целых х возвращает стандартное целое, значением которого является число значащих цифр в модели, включающей в себя х, т.е. p или q.

EPSILON(x) – для вещественного х возвращает вещественную величину с таким же параметром типа, как и у х, значение которой почти пренебрежимо по сравнению с единицей в модели, включающей в себя х, т.е. b1-p (это минимальное положительное число в данной модели, сумма которого с единицей еще представима в этой модели как число, отличное от 1).

MAXEXPONENT(x) (MINEXPONENT(x)) – для вещественного х возвращает стандартную целую величину emax (emin), максимальный (минимальный) показатель степени в модели, включающей в себя х.

PRECISION(x) – для вещественного или комплексного х возвращает целое, содержащее эквивалентную десятичную точность в модели, представляющей вещественные числа с таким же параметром типа, как и у х. Это значение равно INT((p-1)*LOG10(b))+k, где k=1, если b равно целой степени 10 и 0 – в противном случае.

AINT (A[,Kind]) – обрезает вещественную величину А в сторону нуля до целого числа и выдает это число в вещественном виде.

ANINT (A[,Kind]) – возвращает в вещественном виде целое число, ближайшее к значению вещественного аргумента А.

CEILING (A) – возвращает наименьшее стандартное целое, большее или равное значению вещественного аргумента А.

FLOOR (A) – возвращает наименьшее стандартное целое, меньшее или равное значению вещественного аргумента А.

NINT (A[,Kind]) – возвращает значение целого типа, ближайшее к вещественному А.

MAX (A1,A2[,A3,…]) – возвращает max (min) из двух или более целых или вещественных значений. П: a=max(5.5,4E2,99E-1)a=400.

MOD(A,P) – возвращает остаток от А по модулю P, т.е. AINT(A/P)*P, где A и P – целые числа. П: A=5, P=2 – INT(5/2)*2=5-4=1 – остаток.

MODULO (A,P) – возвращает A по модулю P (A и P – оба целые или вещественные), т.е. AFLOOR(A/P)*P для вещественных и AFLOOR(A/P)*P для целых.

SIGN(A,B) – возвращает абсолютную величину А, умноженную на +1, если В0; -1, если В<0.

Некоторые символьные функции

ADJUSTL(String) – смещает исходную строку влево, но сохраняет ее длину, перемещая все ее начальные пробелы в конец строки.

ADJUSTR(String) – смещает исходную строку вправо, но сохраняет ее длину, перемещая все ее начальные пробелы в начало строки.

LEN_TRIM(String) – возвращает стандартное целое, значение которого равно длине строки String за вычетом конечных пробелов.

Преобразование логического типа

LOGICAL(L[,KIND]) – возвращает логическое значение аргумента L.

Преобразующие функции для строк

REPEAT(String,nc) – формирует путем конкатенации (объединения) строку, состоящую из nc копий заданной строки String. Nc – неотрицательный аргумент целого типа.

TRIM(String) – возвращает строку String без конечных пробелов.

RADIX(X) – для вещественного или целого Х возвращает целое, равное основанию в модели, включающее в себя Х, т.е. b или r.

RANGE(X) – для целого, вещественного и комплексного Х возвращает целое, содержащее эквивалентный десятичный степенной диапазон в моделях, представляющих целые или вещественные числа с такими же значениями параметра типа, как Х. Значение равно INT(LOG10(HUGE)) для целого и INT(MIN(LOG10(HUGE),-LOG10(TINY))).

TINY(X) – для вещественного Х возвращает минимальное положительное значение в модели, включающей в себя Х, т.е. . Тип и параметр результата те же, что у Х.

Элементарные функции для действий над вещественными числами

EXPONENT(X) – возвращает целое значение равное степенной части модельного представления числа Х, т.е. e. Если Х=0, то результат равен нулю.

FRACTION(X) – возвращает стандартное значение, равное дробной части модельного представления числа Х, т.е. Xb-e.

NEAREST(X,S) – возвращает вещественное значение с таким же параметром типа, как у Х, равное ближайшему к Х отличному от него машинному числу, в направлении, заданном знаком вещественного аргумента S (S0).

RRSPACING(X) – возвращает вещественное значение с параметром типа как у Х, равное обратной величине относительного расстояния между числами модели в области Х, т.е.
1   2   3   4   5   6   7   8   9   ...   15


написать администратору сайта