Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книга Фортран Павловец 2008

.pdf
Скачиваний:
128
Добавлен:
31.05.2015
Размер:
1.55 Mб
Скачать

Внимательно просмотрите эту запись. Все символы: запятые, апострофы текстовых констант, должны четко стоять на своих местах. Эту форму вывода можно считать предпочтительной при бесформатном выводе.

При использовании номера канала вывода 5 вместо обычно используемого канала номер 6, вывод все равно будет осуществляться на экран дисплея. Это не является ошибкой.

24. Подпрограммы

Кподпрограммам относятся:

1)оператор-функция, т.е., функция, задаваемая пользователем;

2)подпрограмма FUNCTION;

3)подпрограмма SUBROUTINE.

25. Оператор-функция

Оператор-функция используется в тех случаях, когда по одной и той же формуле необходимо производить большое количество вычислений с различными данными.

В общем виде оператор-функция записывается:

имя(список формальных параметров) = выражение

Пример:

SFUN(X,Y)=EXP(X)+SQRT(X+Y)+ALOG(Y)*2.*D

имя формальные

выражение

функции параметры

 

Задавая различные значения X и Y, эта оператор-функция всегда будет вычислять арифметическое выражение по заданной формуле.

Примечание:

В арифметических выражениях кроме переменных, указанных в списке формальных параметров, могут присутствовать и другие переменные (например, переменная D, используемая в предыдущем примере). Значение этой переменной D будет извлекаться из памяти ЭВМ.

Обращение к оператор-функции осуществляется путём указания имени функции и записи в скобках фактических параметров.

Например, вычислим арифметическое выражение с использованием оператор-функции:

Z=2.*SIN(X)+SFUN(A,B)+SFUN(4.5,SIN(C))**2

фактические

 

 

параметры

фактические

выражение

константа

параметры

 

 

 

При обращении к оператор-функции SFUN фактические параметры А и В будут подставляться вместо формальных параметров X и Y, затем будет осуществляться вычисление

51

арифметического выражения оператор-функции. Результатом вычисления будет являться одно число. И это одно число возвращается на то место в программе, откуда осуществляется обращение к оператор-функции.

Затем идёт повторное обращение к оператор-функции SFUN. Во втором случае фактическими параметрами являются константа(4.5) и выражение (SIN(C)). Константа подставится вместо X, а вычисленное значение выражения будет подставляться вместо Y. Производится новое вычисление арифметического выражения оператор-функции. В результате мы получим новое число, которое возвращается в программу на то место, откуда операторфункция вызывалась второй раз.

Переменная Z вычислится как 2.*SIN(X) + результат SFUN1+ результат SFUN2 в квадрате.

Правило:

Оператор-функция записывается в самом начале программы до первого выполняемого оператора. Желательно после оператора DIMENSION. Операторфункция действует только в данной программной единице, в которой она описана. Тип функции (целый, вещественный …) определяется по правилам определения имен переменных или в операторах описания.

В одной программной единице может быть большое количество оператор-функций. Формальными параметрами могут быть только переменные. Фактическими параметрами могут быть:

1)Переменные.

2)Константы.

3)Выражения.

4)Элементы массивов.

Правило:

Список формальных параметров оператор-функции должен соответствовать списку фактических параметров при обращении к оператор-функции по:

-очерёдности следования;

-по типу данных.

Имя оператор-функции должно соответствовать правилам формирования имён языка ФОРТРАН. Все оператор-функции считаются вещественного типа, за исключением тех, имя которых начинается на буквы I, J, K, L, M, N. Тип оператор-функции может быть задан в одном из операторов описания REAL, INTEGER, COMPLEX, CHARACTER.

Задача:

Вычислить следующие выражения, используя оператор-функцию: d = a2 +b2

e = a2 + d 2 + 2 d 2 +b2

f =

a2

+(3.5 e2 + d 2 )2

q =

f 2

+ sin2 x +cos2 y

Как можно заметить, во всех выражения можно выделить общую часть, которую можно записать в виде z2 +t 2 . Эту общую часть можно записать в виде оператор-функции, к которой

52

мы будем часто обращаться при вычислениях. Это избавит нас от необходимости громоздкой записи для вычисления каждой формулы.

СПрограмма №16

C Описываем оператор-функцию

FOP(Z,T)=SQRT(Z*Z+T*T) C Ввод исходных данных

WRITE(6,*)'Введите исходные данные' READ(5,*) A,B,X,Y

D=FOP(A,B) Обращаемся к оператор-функции FOP. Фактические параметры А и В при обращении подставляются вместо формальных Z и T и с ними производится вычисление. Результат вычислений в виде вещественного числа возвращается на место обращения к оператор-функции и затем присваивается переменной D.

E=FOP(A,D)+FOP(D,B)*2.

F=FOP(A,3.5*FOP(E,D)) Первый раз обращение к оператор-функции идет как FOP(E,D), полученный результат умножается на 3.5 и становится вторым фактическим параметром при втором обращении к этой же оператор-функции.

Q=SQRT(F*F + FOP(SIN(X),COS(Y))) При обращении к оператор-функции фактическими параметрами являются выражения SIN(X) и COS(Y).

WRITE(6,*)'D=',D,' E=',E,' F=',F,' Q=',Q PAUSE

STOP

END

В строке F=FOP(A,3.5*FOP(E,D)) первое обращение к оператор-функции происходит для FOP(E,D), затем второе обращение для вычисления FOP(A,3.5*результатFOP(E,D)) и затем результат присваивается переменной F.

Можно, но нежелательно использовать имена формальных параметров оператор-функции внутри текста программы. При обращении к оператор-функции в ячейку с именем формального параметра (например, Z в предыдущем примере) будет помещено значение фактического параметра. При первом и втором обращении это будет переменная А. При третьем обращении переменная D. При четвертом обращении переменная Е. При пятом обращении переменная А. При шестом обращении SIN(X). Если в промежутке между этими операциями мы будем использовать переменную Z (например, W=2.5*Z), то необходимо учитывать, что она может содержать разные значения в разных местах программы.

Рекомендация: формальные параметры оператор-функций использовать только для описания оператор-функции и не использовать в других местах программы.

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

26. Подпрограмма FUNCTION

В общем виде подпрограмма-функция записывается:

[тип] FUNCTION имя подпрограммы (список формальных параметров)

тип может быть REAL

53

INTEGER

COMPLEX

CHARACTER

выполняемые операторы

.

.

.

имя подпрограммы = результат

RETURN END

[тип] – REAL, INTEGER, COMPLEX, CHARACTER. Скобки [ ] означают, что содержимое этих скобок можно не записывать.

После оператора FUNCTION в подпрограмме следуют выполняемые операторы. Подпрограмма FUNCTION обязательно заканчивается операторами RETURN и END.

Имя подпрограммы должно записываться по правилам языка ФОРТРАН. Все подпрограммы-функции считаются вещественного типа, за исключением тех, имя которых начинается на буквы I, J, K, L, M, N.

Список формальных параметров может состоять из имён переменных, имён массивов. Операторы. Внутри подпрограммы-функции могут быть любые операторы языка

ФОРТРАН (включая DIMENSION, ввод-вывод данных, циклы: DO, IF). Подпрограмма-функция может содержать свои оператор-функции, может обращаться к другим подпрограммам и подпрограммам FUNCTION.

Примечание:

Особенностью работы подпрограммы FUNCTION является то, что результатом вычисления является одно число и этот результат должен быть присвоен имени функции.

Оператор RETURN служит для выхода из подпрограммы FUNCTION и передачи результата вычисления в головную программу на то место, откуда шло обращение к подпрограмме-функции.

Подпрограмма-функция может быть включена в один файл с головной подпрограммой и размещаться до начала головной подпрограммы или после оператора END головной программы.

Подпрограмма-функция транслируется отдельно от головной программы. Но в файл *.LST, который создаётся на этапе трансляции, текст и ошибки головной программы записываются отдельно от текста и ошибок подпрограммы.

Чтобы обратиться к подпрограмме-функции необходимо (как и в случае с операторфункцией) указать имя подпрограммы-функции и список фактических параметров. Результатом работы подпрограммы-функции является одно число и это число возвращается в программу на то место, откуда осуществляется вызов.

Правило:

Список фактических параметров должен соответствовать списку формальных параметров по:

-количеству;

-очерёдности следования;

-типу данных;

-по размерности массивов.

54

Размерность одного и того же массива в подпрограмме-функции не должна превышать размерности соответствующего массива головной программы.

Пример:

10 20 15

Вычислить: β = 1 Ai 1 Bi + 21 Ci , используя подпрограммы-функции для вычисления

Amax Bmax Cmax2

суммы и максимального значения массива.

Решение:

Прежде, чем написать подпрограмму-функцию, необходимо определить список формальных параметров, то есть перечень всех значений параметров, от которых зависит вычисление этой функции.

Вданном примере функцию вычисления суммы нужно будет использовать три раза для трёх разных массивов. Функцию нахождения максимального элемента массива необходимо использовать также три раза для трёх разных массивов.

Чтобы вычислить сумму элементов массива нам нужно знать количество элементов массива и иметь численные значения этих элементов массива. При нахождении максимального элемента массива нам необходимо иметь те же данные.

Для нахождения суммы всех элементов массива Х создадим подпрограмму-функцию SUMF(X,N), где Х – имя обрабатываемого массива, а N – размерность массива. Для нахождения максимального элемента массива Х создадим подпрограмму-функцию FMAX(X,N), где Х – обрабатываемый массив, а N – количество элементов этого массива.

Вголовной программе мы будем вводить исходные данные для решения задачи, засылать массивы А, В, С с количеством элементов этих массивов, в подпрограммы (SUMF или FMAX), там будут производиться необходимые вычисления, а назад будут возвращаться результаты этих вычислений.

СПрограмма №17

СГоловная программа

DIMENSION A(10),B(20),C(15) READ (5,*) A,B,C

BET=SUMF(A,10)/FMAX(A,10)-SUMF(B,20)/FMAX(B,20)

* +2.*SUMF(C,15)/FMAX(C,15)**2

Вычисление выражения сводится к обращениям к подпрограмме-функции SUMF и вычислениям сумм всех элементов массивов и к обращениям к подпрограммефукции FMAX и вычислениям максимальных значений. Фактическими параметрами являются имена массивов и количество элементов этих массивов.

WRITE (6,*) ’Бета =’,BET PAUSE

STOP

END

CПодпрограмма-функция SUMF FUNCTION SUMF(X,N)

Вподпрограмму-функцию передаётся массив Х и этот массив обязательно нужно описать, хотя он и описан в головной программе. Описание осуществлено при помощи DIMENSION.

55

DIMENSION X(100) SUMF=0.

DO 2 I=1,N

Несмотря на то, что метка 2 уже используется в головной программе, эту метку можно использовать и в подпрограмме. Имена переменных и номера меток в головной программе и в подпрограммы независимы. Стыковка головной программы и подпрограммы осуществляется только через список формальных – фактических параметров.

2SUMF=SUMF+X(I) RETURN

END

CПодпрограмма-функция FMAX FUNCTION FMAX(X,N) DIMENSION X(N)

Здесь выполнено динамическое описание массива Х (описание массива переменной размерности). Такое описание массивов возможно ТОЛЬКО в подпрограммах и

только в тех случаях, когда имя массива и его размерность записаны в списке формальных параметров. В головной программе так описывать массивы нельзя. (Типичная ошибка!).

FM=X(1)

DO 3 I=2,N

3FM=AMAX1(FM,X(I))

FMAX=FM результат сначала получили в переменной FM, а затем его присвоили имени функции

RETURN END

Правило:

Массивы можно описывать динамически только в подпрограммах и только в том случае, когда имя массива и его размерность находятся в списке формальных параметров. В головной программе динамически описывать массивы нельзя.

Оперативная память ЭВМ отводится динамическим массивам подпрограмм при работе головной программы. Эти массивы располагаются на месте реальных массивов, описанных в головной программе. Размерность динамического массива может меняться, но не может превосходить размерность соответствующего массива головной программы.

Если нужно вывести на печать только результат работы оператор-фукции или подпрограммы-функции, то этот результат не обязательно присваивать переменной, а обращение к функции записать прямо в операторе вывода информации WRITE.

Например: WRITE (6,*) SUMF(A,10)

Текст подпрограммы-функции представляет собой отдельную программу. Её можно транслировать отдельно. Но лучше головную программу и подпрограмму-функцию записывать

56

в одном текстовом файле. Причём подпрограмму можно располагать после оператора END головной программы или до начала головной программы. Транслироваться они будут поотдельности и в файле с распечатками ошибок также будут расположены поотдельности.

Задача:

Написать подпрограмму-функцию, которая описывает заданный графиком физический процесс и использовать эту подпрограмму-функцию для вычисления определённого интеграла,

т.е. площади, ограниченной этой фигурой при любых значениях выходных параметров.

Y

Y1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y=X2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X1 X2 X3

 

 

 

X4

y1 = x3 x3

 

 

 

R = y1

если

 

x < x1

 

 

 

или

x > x4 + R,

если

 

x

 

<

 

x3

 

 

,

 

 

то

y = x2

 

 

 

 

 

 

если

 

x

 

 

x3

 

 

 

 

 

и

x x4 или x

 

 

 

 

 

 

 

 

R

X

то

y =0

x2 ,

то y = y1

если

 

x

 

 

x

2

 

и x x

, то y =

 

y1

(x

x)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

1

 

 

 

 

 

 

 

 

 

 

 

x1

x2

 

Для определения значения y на этом отрезке мы использовали соотношение:

y

=

x1 x

 

 

y

 

x

x

2

 

 

1

1

 

 

 

(x x4 )2 + y2 = R2

 

y2 = R2 (x x4 )2

 

 

x4 x x4 + R,

y = R2 (x x4 )2

Зная значения Х1, Х2, Х3, Х4 мы сможем вычислить значения Y в любой точке. Y=f(X, X1, X2 ,X3, X4).

С

Программа №18

 

FUNCTION Y(X,X1,X2,X3,X4)

 

Y=0.

 

R=X3*X3

 

IF(ABS(X).LT.ABS(X3)) Y=X*X

 

IF(ABS(X).GE.ABS(X3).AND.X.LE.X4.OR.ABS(X).GE.X3.AND.X.GE.X2) Y=R

 

IF(X.LE.X2.AND.X.GE.X1) Y=R*(X1–X)/(X1–X2)

 

IF(X.GT.X4.AND.X.LE.X4+R) Y=SQRT(R*R–(X–X4)**2)

 

RETURN

 

END

57

Задача:

Сформировать одномерный массив численных значений функций, определённых графиком из предыдущей задачи, в пределах изменения аргумента от а до b. Массив из 100 элементов.

С

Программа №19

 

DIMENSION Y1(100)

 

Массив с именем Y нельзя использовать, так как в программе будут два

 

одинаковых имени (массива и подпрограммы-функции), поэтому используем имя

 

массива Y1.

 

WRITE (6,*)’ Введите параметры графика : X1, X2 ,X3, X4’

 

READ (5,*) X1,X2,X3,X4

 

WRITE (6,*)’Введите пределы изменения Х : A, B’

 

READ (5,*) A,B

 

DX=(B-A)/(100.–1.) Для получения правильного шага цикла, используем (100.-1.).

 

X=A

 

DO 2 I=1,100

 

Y1(I)=Y(X,X1,X2,X3,X4)

 

Идёт обращение к подпрограмме-функции Y, куда посылаются фактические

 

параметры Х, Х1, X2, X3, X4, которые случайно совпали с именами, описанными в

 

FUNCTION. После каждого обращения к подпрограмме-функции мы получаем

 

результат – одно число, которое возвращается назад в головную программу на то

 

место, откуда осуществился вызов подпрограммы-функции и этот результат

 

записывается в массив Y1. По окончании этого цикла (повторится 100 раз) мы

 

имеем заполненный массив Y1, в котором содержатся значения координат Y

 

графика в пределах от а до b.

 

2 X=X+DX

 

PAUSE

 

STOP

 

END

Мини задача 1:

По методу прямоугольников вычислить значение интеграла, т. е. определить площадь фигуры, описанной в предыдущем примере..

SINT=0.

DO 2 I=1,100–1

Цикл до 100-1 потому. что последняя площадь не суммируется.

2 SINT=SINT+Y1(I)*DX WRITE (6,*)’Интеграл =’,SINT

Мини задача 2:

Вычислить значение интеграла, по методу трапеции.

STR=0.

DO 3 I=1,100–1

3 STR=STR+(Y1(I)+Y1(I+1))/2.*DX

58

Мини задача 3:

Найти максимальное значение элементов массива и его порядковый номер.

REAL MAX Если для хранения максимального значения используется переменная с именем МАХ, то это имя дложно быть описано в операторе REAL. Иначе эта переменная будет сохранять только целую часть числа, а дробная часть числа будет отбрасываться. Обратите внимание на эту типичную ошибку.

MAX=Y1(1)

N=1

DO 4 I=2,100 IF(MAX.GE.Y1(I)) GO TO 4 MAX=Y1(I)

N=I

4 CONTINUE

Мини задача 4 Найти значения всех локальных максимумов фигуры, численные значения которой

хранятся в массиве Y1.

IF(Y1(1).GT.Y1(2)) WRITE(*,*)'Максимум на левой границе отрезка=',Y1(1) DO 8 J=2,99

8 IF(Y1(J).GT.Y1(J-1).AND.Y1(J).GT.Y1(J+1))WRITE(*,*)'Локальный максимум=',Y1(J) IF(Y1(100).GT.Y1(99)) WRITE(*,*)'Максимум на правой границе отрезка=',Y1(100)

27. Подпрограмма SUBROUTINE.

Общий вид записи подпрограммы SUBROUTINE:

SUBROUTINE имя (список формальных параметров) операторы описания …выполняемые операторы

RETURN END

Вызов подпрограммы SUBROUTINE осуществляется при помощи оператора CALL:

CALL имя (список фактических параметров)

Отличия подпрограммы SUBROUTINE от подпрограммы-функции:

имя подпрограммы SUBROUTINE не имеет значения типа;

результатом работы подпрограммы SUBROUTINE могут быть одно или несколько чисел, массив, несколько массивов. Эти результаты могут передаваться в головную программу, а могут и не передаваться.

список формальных параметров может отсутствовать вообще.

Подпрограмма типа SUBROUTINE – основной объект программирования на языке ФОРТРАН. Любая большая задача разбивается на подпрограммы, эти программы отлаживаются и тестируются по отдельности. Головная программа служит лишь для ввода исходных данных, поочерёдного обращения к различным подпрограммам, записи и обработки

59

полученных результатов. В программировании признан рациональным модульный принцип построения программ (разбиением на подпрограммы).

Правила соответствия формальных и фактических параметров:

Так же, как и в подпрограмме-функции, эти параметры должны соответствовать:

по количеству;

очереди следования;

по типу данных;

массивы должны соответствовать по размерности.

Формальными параметрами подпрограммы могут быть:

переменные;

имена массивов;

имена функций;

символ « * », обозначающий метку.

При обращении к подпрограмме с помощью оператора CALL необходимо указать имя подпрограммы и список фактических параметров.

Фактическими параметрами могут быть:

константы;

арифметические выражения;

переменные;

массивы;

имена функций;

номера меток.

Всписке фактических (формальных) параметров должны быть величины, которые служат как исходными данными для работы подпрограммы, так и величины, которые являются результатами работы подпрограммы.

Результатом работы подпрограммы могут быть:

одно число;

несколько чисел;

массивы данных;

файлы.

При выполнении оператора CALL головной программы управление передаётся в подпрограмму, где происходят все вычислительные действия. При достижении оператора RETURN осуществляется выход из подпрограммы и управление передаётся в головную программу к оператору, следующему после оператора CALL.

Примечания:

Списки имён переменных и имена меток каждой подпрограммы и головной программы независимы друг от друга и могут повторяться.

Вычислительный процесс каждой подпрограммы также независим от головной программы.

Одна подпрограмма может обращаться к нескольким другим подпрограммам, подпрограммам-функциям и может содержать оператор-функции.

Стыковка между подпрограммами осуществляется только через список формальных

– фактических параметров или посредством оператора COMMON.

60