Курс лекций по дисциплине Программирование на языке Фортран
Скачать 0.98 Mb.
|
[sattrs]] [ ( [nformal [[attrs]][, nformal [[attrs]]...] ) ] Sname – определенное пользователем, глобальное внешнее имя п/п. Sattrs – список атрибутов (через запятую и в квадратных скобках [ ]). Nformal – определенное пользователем имя формального параметра. Если их несколько, то разделение запятыми. Attrs – список атрибутов (через запятую и в квадратных скобках [ ]). Вызов п/п осуществляется по ее имени оператором CALL. CALL sname ( [nfact] [, nfact] ... ) Nfact – определенное пользователем имя фактического параметра. При вызове п/п между фактическими и формальными параметрами устанавливается соответствие. Фактические параметры: выражения; буквальные и символические константы; переменные; элементы массивов и массивы; строки; встроенные функции. Формальные параметры: переменные п/п; массивы; символы *. Требования к фактическим параметрам: количество фактических параметров д.б. равно числу формальных; типы и длины фактических и формальных параметров должны совпадать. Соответствие между параметрами устанавливается по порядку их следования в списках (1-му формальному параметру соответствует 1-й фактический и т.д.); если формальный параметр – имя массива, то соответствующий фактический параметр – имя массива или элемент массива;
если формальный параметр – имя переменной, то соответствующий фактический параметр м.б. переменной, выражением (в т.ч. с использованием функций) или константой (если формальный параметр не получает новых значений в п/п). При обращении к п/п фактические параметры могут ассоциироваться с формальными по значению (1 – value) или по ссылке (2 – reference). 1) Фактические и формальные параметры обмениваются значениями, т.е. при вызове п/п значения фактических параметров присваиваются соответствущим формальным, после завершения выполнения п/п, наоборот (если фактические параметры не функции или константы). Т.о. передаваемые значения дублируются в ОЗУ. 2) Формальным параметрам передается не значение, а ссылка (адрес в ОЗУ) на значение фактического параметра. Т.о. все действия над формальным параметром есть в действительности действия над соответствующим фактическим параметром. Если фактический параметр – выражение, то тип и длина формального параметра берутся равными типу и длине выражения.
Если фактический параметр – строка, то формальным параметром м.б. строка перенимающая длину. CALL WriteText(‘abcdef’) ... SUBROUTINE WriteText(text) CHARACTER text*(*) Как видно из примеров тип и длина формальных параметров задаются внутри п/п операторами описания. Пример вычисления функции с использованием п/п ! Вычислить функцию: y=f(x)+2f(x)/(x-f¤(x+0.5)), где f(x)=sinx-exp(-x) ! с помощью подпрограммы program pp real y,y1,y2,y3,x write(5,*)'Введите значение аргумента x' read(5,*)x call p(x,y1) call p(2.*x,y2) call p(x+.5,y3) y=(y1+2.*y2)/(x-y3*y3) write(5,*)' Y=',y ! x=3, y=-0.165492 read* ! x=12, y=-0.1957164 end subroutine p(a,z) real a,z z=sin(a)-exp(-a) end Суть метода простой итерации заключается в том, что решение, полученное на предыдущем шаге является исходным значением для следующего шага. При определенных условиях данная последовательность сходится и ее предел является решением. Условия сходимости простых итераций: f’’(x)<1 и f’’<0. ! Программа вычисления корня уравнения методом простой итерации Real root, r ! Корень функции Real a,b ! Интервал для поиска корня Real eps ! Погрешность определения корня Integer imax,i Write(5,*) 'Введите ограничение количества итераций' read(5,*)imax Write(5,*) 'Введите интервал (a,b) для поиска корня' read(5,*)a,b Write(5,*) 'Введите погрешность определения корня' read(5,*)eps r=root(a,b,eps,i,imax) ! Вызов функции определения корня if (i.gt.imax) then Write(5,*)'Корень не найден. Превышено допустимое число итераций' else Write(5,*)'Корень функции:',r Write(5,*)'Потребовавшееся количество итераций',i end if read* end ! Уравнение 0=(exp(-x)-sqrt(exp(x))+3.7)/3.-x function f(x) ! имеет корень х=0.8614 real x,f ! Уравнение 0=(1./(1.2*atan(x)+sqrt(x+1))-x real*8 y ! имеет корень х1=0.5435 y=(exp(-x)-sqrt(exp(x))+3.7)/3. ! y=(1./(1.2*atan(x)+sqrt(x+1)) if (y.gt.huge(f)) stop 'Процесс итераций расходится' f=y end ! П/п поиска корня функции function root(a,b,eps,i,imax) real root,f Real a,b ! Интервал для поиска корня Real eps ! Погрешность определения корня Real x,x0 Integer imax,i ! Ограниченное количество итераций x0=0.5*(a+b) ! Начальное значение аргумента примем в середине интервала x=f(x0) i=0 do while(abs(x-x0).gt.eps.and.i.le.imax) x0=x x=f(x0) i=i+1 end do root=x end Пропущено – см. рукописный конспект со стр. 17!!!!!!!!!!!!!! Продолжение рукописного конспекта Обычно при окончании "контроллера формата" происходит конец передачи данных текущей записи. Если последним редакционным дескриптором, воспринятым "контроллером формата" является обратный слеш (\) то автоматический конец записи запрещается, что позволяет последующим операторам ввода/вывода продолжать чтение (или запись) с (или на) этой же записи. Этот механизм широко используется для получения на экране запроса и ответа на одной и той же строке, например: WRITE (*,'(A\)') 'Ввод целой величины->' READ (*,'(BN,I6)')I Примеры по форматному вводу/выводу ! Каждый WRITE выводит знаки между слешами: /ABC'DEF/ ! Спецификация апостроф WRITE (*,970) 970 FORMAT ('ABC"DEF') WRITE (*,'("ABC""DEF")') 2.9.1 Оператор FORMAT Пропущено! Со стр.42 конспекта Print ‘(1x,80a1)’,(‘-‘,k=1,80) ! Вывод горизонтальной линии (в списке 80 элементов) Или Print ‘(1x,80(‘-‘))’ ! Вывод горизонтальной линии Print ‘(10(/))’ ! Отступ 9 строк Integer j, k, n, a(10), b(10) Read (*,’(2I8,5(I2,I3),5(I4,1x,I1))’) k, n, a,(b(j),j=1,10) Integer a(10) Open (9,file=’a.txt’) Read (9,1)a Write(5,1)a 1 Format(5I3/3I3/2I3) Файл a.txt Результат 1234567 12345 8910111213 8910 14151617 1415 OPEN!!! 13. Стандартные функции Fortran Встроенная функция – подпрограмма, обращение к которой в языке программирования стандартизовано. Функция имеет имя и список входных параметров, указываемых в скобках. Одновременно имя функции является и переменной, через которую возвращается ее значение. Например, функция косинуса числа COS(x) имеет имя COS и входной параметр х. Входные параметры могут быть числовым выражением, переменной или константой. Параметры некоторых встроенных функций ограничены назначением этих функций. Например, логарифм отрицательного числа математически не определен и поэтому недопустим. 12.1 Функции преобразования типов
Аббревиатура для обозначения различных типов данных:
Примеры. Int(3.67)=3 (отсечение дробной части), Real(4)=4.0, Sngl(0.3333333333333333)=0.3333333 Dble(1./3.)=0.3333333333333333 Dble(1./3.)=Dble(1/3.)=Dble(1./3)=Dble(Real(1)/3) Dble(1/3)=0.0 Напомним, что 27**(1/3)=1 Cmplx(3)=3.0+0.0i Cmplx(3,4)=3.0+4.0i Int(Dble(1/3))=0 ! Печать всех ASCII символов в два столбца write(*,*)’Код символ код символ’ Do i=1,254,2 Write(*,*) i, char(i), i+1,char(i+1) End do Функция ICHAR преобразует символьную величину в целую. Целая величина символа - внутреннее представление символа в коде ASCII, лежащее в диапазоне от 0 до 255. Для любых двух символов С1 и С2 (С1.LE.C2) будет .TRUE. тогда и только тогда если (ICHAR(C1).LE.ICHAR(C2)) есть .TRUE. Функция CHAR(I) возвращает 1-й символ таблиц ASCII. Это величина типа CHARACTER длиной один символ, при этом I должно быть целым выражением, величина которого принадлежит диапазону 0 Выражение ICHAR(CHAR(I))=I для 0 Выражение CHAR(ICHAR(C))=C для любого символа С из набора ASCII. ! Программа подсчета суммы цифр числа ! Программа работает также при вводе любой символьной информации Character*80 num Integer Length, Sum, i, Code Write(*,*) 'Введите число ' Read(*,'(A\)') num Length=Len_trim(num) Sum=0 do i=1,Length Code=Ichar(num(i:i))-48 if (Code.Gt.0.and.Code.Le.9) Sum=Sum+Code end do Write(5,*) 'Сумма цифр ',Sum end 12.2 Функции возвращения информации о типах данных
Примеры. Функция Epsilon позволяет задать наименьшее из возможных приращений в итерационных задачах. Задание приращений, меньших, чем возвращаемый функцией Epsilon результат, делает алгоритм неработоспособным.
12.3 Функции взятия целой части и округления
Примеры. Real a(3) /2.8, -2.8, 1.3/ Write(*,*) anint(a) ! 3.000000 –3.000000 1.000000 Write(*,*) nint(2.8), nint(2.2) ! 3 2 Write(*,*) nint(a(2)), nint(-2.2) ! -3 -2 Write(*,*) aint(2.6), aint(-2.6) ! 2.000000 -2.000000 12.4 Математические функции
Примечание. ** - Х является арифметическим выражением, переменной или константой. Некоторые другие математические функции можно вычислить по известным формулам, используя стандартные. Например, секанс – sec(x)=1/cos(x), косеканс - csc(x)=1/sin(x), котангенс – cot(x)=1/tan(x), арксинус - , арккосинус - , гиперболический косинус - cosh(x)=(ex+e‑x)/2. Z=(3.0,4.0) ! Комплексное Abs(z)=5.0 Sin(z)=(3.853738,-27.01681i) Conjg(z)=(3.0,-4.0) ! Комплексное сопряженное AIMAG(z)=4.0 Z+z=(6.0,8.0) ! z1z2=(a1+ib1)(a2+ib2)=a1a2+ib1a2+ia1b2+ib1b2=(a1a2-b1b2)+i(b1a2+a1b2) Z*z=(-7.0,24.0) ! Умножение комплексно сопряженных чисел: =(a+ib)(a-ib)=a2-iba+iba-i2b2=a2+b2 z*conjg(z)=(25.0,0.0) z/z=1.0 Write(*,*) mod(5,3), mod (5.3,3.0) ! 2 2.300000 Sind(30.)=0.5 Dim(5,3)=2 Когда параметрами логарифмических и тригонометрических функций являются комплексные числа, то функции возвращают комплексное число, аргумент которого равен главному значению аргумента комплексного числа в радианах (-<). 12.5 Лексические функции сравнения
LGE(X,Y) возвращает .TRUE., если Х=Y или если Х следует за Y в таблице кодов ASCII; иначе возвращается .FALSE. LGT(X,Y) возвращает .TRUE., если Х следует за Y в таблице кодов ASCII; иначе возвращается .FALSE. LLE(X,Y) возвращает .TRUE., если X=Y или если Х предшествует Y в таблице ASCII; иначе возвращается .FALSE. LLT(X,Y) возвращает .TRUE., если Х предшествует Y в таблице ASCII; иначе возвращается .FALSE. Если у операндов неравная длина, то более короткий дополняется справа пробелами. Write(*,*) LGE('a','b'), LGT('a','b'), LLE('a','b'), LLT('a','b') ! F F T T 12.6 Функции операций над строками Подстроки. Var([first]:[last]) Var – символьная переменная или элемент символьного массива. First – арифметическое выражение, определяющее первый символ в подстроке. Значение first округляется до целого и по умолчанию равно 1. Last – арифметическое выражение, определяющее последний символ в подстроке. Значение first округляется до целого и по умолчанию равно 1. Длина подстроки равна last–first+1 A=’yahoo’ A(:3)=’yah’ a(3:)=’hoo’ a(2:4)=’aho’ a(:)=’yahoo’ Пример использования: Поиск символа “а” в символьной переменной text j=Len_trim(text) ! Определение длины переменной text Do i=1,j If(text(i:i).eq.’a’) exit End do Если на выходе из цикла i=j+1, то символ ‘a’ не найден, иначе он найден в позиции i переменной text.
Встроенная функция INDEX возвращает целое число, соответствующее позиции CharB в CharA. Если длина CharА меньше длины CharB, или CharB не входит в CharA, то значение равно нулю. Если CharB входит более одного раза в CharB, то возвращается положение первого вхождения. Параметр log, если он задан .TRUE., обозначает, что поиск ведется от конца строки CharA к началу. Обе функции SCAN и VERIFY сравнивают строку с группой символов в charset. SCAN возвращает позицию первого символа строки, совпадающего с одним из символов charset. VERIFY возвращает позицию первого символа строки, который не совпадает ни с одним из символов, заданных в charset. Если символы не обнаружены или строка имеет нулевую длину, то SCAN возвращает ноль. Если нет несовпадающих символов или строка имеет нулевую длину, то VERIFY возвращает ноль. Параметр log, если он задан .TRUE., обозначает, что поиск ведется от конца строки к началу.
VERIFY ('MathCAD','Maple')=3 ! Символа p нет в Char и его позиция 3. ! Смена любого расширения файла на for расширение Integer i, j Character*20 ch1, ch2 ch1='C:\Windows\temp.bas' do i = Len(ch1), 1, -1 ! Просмотр с конца If (ch1(i:i).eq.'\') Then ch2 = ch1(i+1:) ! Имя файла (Возврат подстроки) do j = Len(ch2), 1, -1 If (ch2(j:j).eq.'.') Then ! Текущий символ ch2 = ch2(:j) // 'for' ! Присоединение расширения Exit End If end do Exit End If end do If (Index(ch2,'.').eq.0) ch2 = ch2(1:) // '.for' write(*,*) ‘Новое имя файла ’, ch2 end ! Пример вычисления символьного выражения, содержащего 2 операнда и оператор +, -, * или /. program SimbCalc implicit none real LeftOperand, RightOperand real res character InputString character Operator character ListOperator(4) Integer i, k InputString = "-2*-9.2" ListOperator(1) = "+" ListOperator(2) = "-" ListOperator(3) = "*" ListOperator(4) = "/" do i = 1, 4 k = Index(InputString, ListOperator(i)) ! Определение позиции оператора If (k.ne.0.And.k.ne.1) Then ! Если оператор не найден или стоит вначале, Operator = ListOperator(i) ! например минус перед числом ! Конструкция с open для перевода строки в число open(3) ! Открытие временного файла write(3,*) InputString(:k-1) write(3,*) InputString(k+1:) rewind(3) ! Репозиционирование для считывания read(3,*) LeftOperand read(3,*) RightOperand close(3) Exit End If end do If (k.eq.0) Then ! Оператор не найден write(*,*) InputString stop else Select Case (Operator) Case ("+") res = LeftOperand + RightOperand Case ("-") res = LeftOperand - RightOperand Case ("*") res = LeftOperand * RightOperand Case ("/") If (RightOperand.ne.0) Then res = LeftOperand / RightOperand Else write(*,*) "Деление на 0" stop End If End Select write(*,*) res end if End 12.7 Функция возвращения конца файла
EOF(X) возвращает .TRUE. если устройство, определенное этим параметром находится на или после записи конец-файла; иначе возвращается .FALSE. Величина Х должна соответствовать открытому файлу или нулю, что соответствует экрану или клавиатуре. 12.8 Адресные функции
write(*,*) Loc(1.53) ! 4395376 12.9 Операции с битами
IOR (intA,intB) ‑ если n-й бит в первом |