Курс лекций по дисциплине Программирование на языке Фортран
Скачать 0.98 Mb.
|
или втором аргументе равен 1, то в результате на это место устанавливается 1. Пример: IOR (240,90) = 250, IOR
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 на противоположный. Примеры операций с битами:
! Битовые функции 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
Числовые справочные и преобразующие функции Каждая разновидность целого типа моделируется множеством: , где s=1, q – положительное целое число, r – целое число>1 (обычно каждое из Wk – целое число в интервале 0Wkr). =‑1(120+121+122+123+124+125+...)=‑(1+2+4+8+16+...) Каждая разновидность вещественного типа моделируется множеством: , где s=1, p и b – целые числа>1, e – целое число emineemax, каждое из fk – целое число 0fkb, кроме 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, т.е. AINT(A/P)*P, где A и P – целые числа. П: A=5, P=2 – INT(5/2)*2=5-4=1 – остаток. MODULO (A,P) – возвращает A по модулю P (A и P – оба целые или вещественные), т.е. AFLOOR(A/P)*P для вещественных и AFLOOR(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 (S0). RRSPACING(X) – возвращает вещественное значение с параметром типа как у Х, равное обратной величине относительного расстояния между числами модели в области Х, т.е. |