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

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

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

Задача:

Найти значение β из выражения:

 

10

20

 

 

Ai2

Bi2

15

β = sin

1

+cos2 1

2 Ci2 / Cmax

 

Amax Amin

Cmax +Cmin

1

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

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

СПодпрограмма MAMIS

SUBROUTINE MAMIS(A,N,SUM2,MAX,MIN)

Хотя имя подпрограммы и начинается на букву М, в подпрограммах SUBROUTINE первая буква подпрограммы не задает типа функции (целого или вещественного). В списке формальных параметров: А – имя массива; N – размерность массива; SUM2, MAX, MIN – значения суммы квадратов элементов массива, максимального элемента массива, минимального элемента массива (эти данные из подпрограммы передадутся в головную программу).

REAL MAX,MIN

Описываются переменные MAX, MIN как вещественного типа, так как действует правило имён переменных языка ФОРТРАН (I, J, K, L, M, N), иначе эти переменные получатся целого типа.

DIMENSION A(N)

Динамическое описание массива (см. выше)

SUM2=A(1)**2

MAX=A(1)

MIN=A(1)

DO 3 I=2,N Цикл можно начинать с индекса 2, т.к. выше сделаны необходимые присваивания переменным

SUM2=SUM2+A(I)**2 IF(A(I).GT.MAX) MAX=A(I)

3 MIN=AMIN1(A(I),MIN)

RETURN Осуществляется выход из подпрограммы в головную программу. Управление будет предано оператору, следующему после CALL.

END

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

DIMENSION A(10), B(20), C(15) Массивы описываются с реальными размерностями

READ (5,*) A,B,C

CALL MAMIS(A,10,ASUM,AMA,AMI)

Здесь и далее в подпрограмму MAMIS посылаем в качестве фактических параметров: имя массива – А; количество элементов этого массива – N=10; обратно получим сумму квадратов элементов засланного массива – ASUM; максимальный элемент массива – АМА; минимальный элемент массива – AMI. Значения ASUM, AMA, AMI мы можем использовать далее в головной программе. Например: рассчитать первое слагаемое.

61

BET=SIN(ASUM/(AMA–AMI))

CALL MAMIS(B,20,BSUM,BMA,BMI)

CALL MAMIS(C,15,CSUM,CMA,CMI) BET=BET+COS(BSUM/(CMA+CMI))**2–2.*SQRT(CSUM/CMA)

Отметим, что переменные BMA, BMI в головной программе не используются. Но при обращении к подпрограмме их необходимо указать, чтобы не нарушить правила соответствия формальных и фактических параметров.

WRITE (6,*) BET PAUSE

STOP

END

Текст подпрограммы SUBROUTINE представляет собой отдельную программу. Её можно транслировать отдельно. После трансляции объектный модуль с расширением .OBJ можно записать в библиотеку стандартных программ и потом только обращаться к этой подпрограмме через оператор CALL. Но поначалу лучше головную программу и подпрограмму записывать в одном текстовом файле. Причём, подпрограмму можно располагать после оператора END головной программы или до начала головной программы. Транслироваться они будут по отдельности и в файле с распечатками ошибок также будут расположены по отдельности.

28. Способы передачи данных в подпрограмму.

Существуют два способа передачи данных в подпрограмму:

a.Посредством списка формальных – фактических параметров;

b.Посредством оператора COMMON (“общий”).

Пример первого способа:

SUBROUTINE SUB1(A,B,C,REZ1,REZ2,FUN1,FUN2,*,*) DIMENSION C(100)

где А, В, С – исходные дынные

REZ1, REZ2 – результаты работы подпрограммы

FUN1, FUN2 – имена функций, которые передаются в подпрограмму.

В качестве имён функций могут быть имена встроенных стандартных функций (из библиотеки), а также имена подпрограмм-функций, написанные пользователем. Символ «*» обозначает метки, по которым происходит возврат в головную программу. Если имеется символ «* » в списке формальных параметров, то в теле подпрограммы должен быть оператор RETURN дополнительного выхода из программы для возврата на эту метку.

IF (логическое выражение 1) RETURN 1

IF (логическое выражение 2) RETURN 2

Если выполняется (истинно) логическое выражение 1, то идёт возвращение на первый символ « * » списка формальных параметров (первую метку), если истинно логическое выражение 2 – на второй символ « * » (вторую метку).

RETURN END

62

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

Продолжение примера:

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

EXTERNAL SIN, COS DIMENSION C1(100) READ(*,*)A1,B1,C1

CALL SUB1(A1,B1,C1,RE1,RE2,SIN,COS,*25,*35)

исходные результаты имена метки данные функций

25 IF(RE1.GT…)…

35 DO 8 J=1,N …

На метки 25 и 35 передаётся управление, когда выход из подпрограммы осуществляется по RETURN 1 или RETURN 2. Передача происходит через список формальных – фактических параметров. В качестве фактических параметров могут быть имена функций, которые передаются в подпрограмму при каждом новом обращении к подпрограмме. Эти имена функций могут меняться. В подпрограмме эти имена функций могут иметь совершенно другие названия (например, FUN1, FUN2). В подпрограммах их необходимо использовать как функции.

Например:

REZ1=FUN1(A)+SQRT(FUN2(B))

Правило:

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

Пример:

EXTERNAL SIN, COS

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

Примечание:

Если имена функций не будут описаны в операторе EXTERNAL, то эти функции будут восприниматься как простые переменные с соответствующими именами.

*25, *35 обозначают дополнительные точки выхода из подпрограммы. Это номера меток, на которые передаётся управление по выходу из подпрограммы с помощью RETURN 1, RETURN 2. В данном примере предусмотрено 3 варианта выхода из подпрограммы:

63

1)обычный – если выход осуществляется по простому оператору RETURN. После выполнения подпрограммы управление передаётся оператору головной программы, следующему после CALL;

2)выход из подпрограммы по оператору RETURN 1 будет осуществляться по первому символу « * » в списке формальных параметров. Этому символу соответствует метка 25 в списке фактических параметров головной программы и по выходу из подпрограммы управление будет передано на метку 25;

3)по RETURN 2 возврат осуществляется на метку 35 головной программы.

29. Передача данных посредством оператора COMMON

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

Пример:

 

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

Подпрограмма:

DIMENSION A(10),B(20),C(30),Y(10)

SUBROUTINE SUB2(Y,N)

COMMON A,B,C

DIMENSION Y(N),C(10)

COMMON A(10),D(10),C,E(10,3)

CALL SUB2(Y,10)

 

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

Массив С в подпрограмме из 10 элементов (никакого отношения к С(10) головной программы не имеет) будет занимать память с В(11) по В(20) головной программы. В головной программе массив В содержит 20 элементов и в блоке COMMON головной программы он будет занимать 20 ячеек памяти. В подпрограмме этому массиву будут соответствовать массивы

D(10) и С(10).

Одномерный массив С(30) головной программы мы представляем в подпрограмме как двухмерный массив Е(10,3). В данном примере первый столбец Е будет содержать первые 10 элементов массива С(30).

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

COMMON список

COMMON /метка/ список

Пример:

COMMON /МЕТ1/ А,Х,В(20)

64

В COMMON может стоять размерность массива, но если массив описан в COMMON, то его не нужно описывать в DIMENSION.

Правило:

Список оператора COMMON головной программы должен соответствовать списку подпрограммы по следующим критериям:

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

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

Задача:

Получить двухмерный массив в головной программе Ci,j=Ai*Bj и отсортировать его по возрастанию, расположив элементы по столбцам. Сортировку произвести в подпрограмме. Передачу данных осуществлять при помощи оператора COMMON.

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

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

DIMENSION A(5),B(6),C(5,6) COMMON C

В COMMON помещён массив С, который в памяти ЭВМ расположен по столбцам.

READ (5,*) A,B DO 1 I=1,5

DO 1 J=1,6

1C(I,J)=A(I)*B(J) CALL SUB4

Управление передаётся подпрограмме SUB4. Список параметров отсутствует. Передача данных осуществляется посредством оператора

COMMON.

После выполнения подпрограммы по оператору RETURN управление будет передано обратно в головную программу и далее будет выполняться оператор, следующий после CALL

СВывод отсортированного массива

DO 3 I=1,5

3WRITE (6,*) (C(I,J),J=1,6) PAUSE

STOP END

СПодпрограмма №22 SUBROUTINE SUB4 COMMON X(30)

Массив Х(30) в подпрограмме будет соответствовать массиву С(5,6) головной программы и элементы этого массива будут располагаться по столбцам массива С.

ССортировка одномерного массива

DO 2 I=1,29

… (см. сортировку одномерного массива)

65

2 CONTINUE RETURN END

Массив Х(30) занимает ту же память, что и С(5,6). Первые 5 элементов Х(30) – это первый столбец в С(5,6).

Если проведём сортировку одномерного массива, то после выхода из подпрограммы по RETURN массив С(5,6) будет содержать те же численные данные, что и массив Х(30), отсортированный по столбцам.

30. Использование библиотек стандартных программ (БСП)

Библиотеки стандартных программ позволяют программисту использовать уже готовые подпрограммы (стандартные или составленные им самим), в любой своей программе. Это избавляет от необходимости повторения в каждой программе каких-либо вычислений, выполнявшихся ранее в других программах. Для этого надо составить одну подпрограмму, произвести её отладку, тестирование и занести в библиотеку. К стандартным программам из БСП относится вычисление специальных функций, интегралов и многие другие. Благодаря этому не приходится каждый раз составлять алгоритм вычисления, например, интеграла. Мы просто обращаемся к стандартной программе из БСП, засылаем в неё значения фактических параметров, обратно получаем результат. Библиотеки программ подключаются при их вызове. При этом указывается список фактических параметров.

Основные термины, которые используются при работе с БСП: вектор-столбец – одномерный массив; матрица – двухмерный массив;

код ошибки (чаще всего это IER) – это может быть переменная целого типа с любым именем, которая показывает или обозначает, в каком состоянии стандартная программа (СП) завершила свою работу. Код ошибки всегда нужно анализировать после выполнения стандартных программ. Этот анализ осуществляется при помощи оператора IF.

Пример:

IF(IER.EQ.1) …

Обращение к БСП осуществляется при помощи оператора CALL:

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

Задача:

Решить систему линейных алгебраических уравнений: 2x1 +3x2 + 4x3 = 5

x1 2x2 +3x3 = 4 x1 3x2 = 6

ВБСП уже есть программа для решения системы линейных уравнений. Поэтому воспользуемся ей, чтобы не тратить время на составление своей программы.

Вописании к БСП находим подходящую стандартную программу:

программа для решения системы линейных алгебраических уравнений

SIMQ(A,B,N,IER), где:

А – матрица коэффициентов при неизвестных, расположенных по столбцам;

66

В – вектор-столбец свободных членов. Заполняется значениями свободных членов системы линейных алгебраических уравнений (5, 4, 6). В результате работы

подпрограммы вычисляются значения неизвестных x1, x2 , ... , xn и эти неизвестные

записываются в массив В, (а предыдущие значения свободных членов уничтожаются); N – размерность массивов;

IER – код ошибки, если IER=0, то решение получено, если IER=1, то решение не может быть получено, так как определитель системы равен нулю, если IER=2 – количество уравнений меньше трех.

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

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

DIMENSION A(3,3),C(3)

WRITE (6,*)’Введите коэффициенты при Х по строкам’

READ (5,*) ((A(I,J),J=1,3),I=1,3)

Введём: 2. 3. 4. -1. -2. 3. 1. -3. 0.

WRITE (6,*)’Введите массив свободных членов’

READ (5,*) C

Введём: 5. 4. 6.

CALL SIMQ(A,C,3,IER)

Идет обращение к стандартной программе SIMQ. В этой СП будет получено решение, а результат этого решения будет находиться в массиве С.

САнализ кода ошибки

IF(IER.EQ.0) WRITE (6,*)’Решение: X1, X2, X3=’, (C(I),I=1,3) Выводим результат

IF(IER.EQ.1) WRITE (6,*)’Нет решения. Проверьте исходные данные’ IF(IER.EQ.2) WRITE (6,*)’Неверное количество уравнений’

PAUSE

STOP

END

Задача:

Вычислить значение определенного интеграла:

S = b (sin2 x cos2 x)dx

a

Воспользоваться программой из БСП: QG5(XL,XU,FCT,Y) где XL – левый предел интеграла;

XU – правый предел интеграла;

FCT – внешняя подпрограмма-функция, которая описывает решаемое уравнение y = f (x);

Y – результат.

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

y = f (x). Начинаем с написания подпрограммы – функции.

67

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

СПодпрограмма-функция

FUNCTION FUN(X)

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

FUN=SIN(X)**2–COS(X)**2 RETURN

END

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

EXTERNAL FUN Поскольку имя FUN будет находиться в списке фактических параметров

WRITE (6,*)’Введите Хнач , Хкон’ READ (5,*) A,B

Обращаемся к стандартной подпрограмме вычисления определенного интеграла. Фактические параметры А и В, имя функции FUN. Результат вычисления интеграла будет помещен в переменную с именем Y.

CALL QG5(A,B,FUN,Y)

WRITE (6,*)’Вычисленное значение интеграла =’,Y PAUSE

STOP

END

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

Задача:

Решить дифференциальное уравнение и построить график для:

dydx = 2sin x +cos y на отрезке xн ÷ xк с шагом dx при x0 = a, y0 = b . Использовать стандартную программу RK2(FUN,H,X1,Y1,K,N,VEC)

где FUN – подпрограмма-функция, которая описывает значение функции y = f (x);

Н – шаг интегрирования; X1, Y1 – начальные значения;

K – количество шагов между двумя сохраняемыми значениями; N – количество значений;

VEC – результирующий вектор-столбец длинны N, в котом сохраняются вычисленные значения.

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

N = (xк xн ) / HK

68

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

СПодпрограмма-функция

FUNCTION FUNC(X,Y)

FUNC=2.*SIN(X)+COS(Y)

RETURN

END

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

DIMENSION VEC(1000) Описываем массив, в который будут записываться результаты расчета. Размерность его задается с запасом. EXTERNAL FUNC Описываем имя подпрограммы-функции как внешней, т.к. ее имя находится в списке фактических параметров при обращении к

RK2

READ (5,*) XN,XK,X0,Y0,DX,K N=(XK–XN)/DX/K

CALL RK2(FUNC,DX,X0,Y0,K,N,VEC)

Результат вычислений будет помещён в массив VEC размерностью N элементов.

CALL GRAF(VEC,N)

Здесь идёт обращение к программе GRAF, которая выведет график вычисленных значений массива VEC. Описание этой программы см. в разделе "работа с текстом".

DO 2 I=1,N

Распечатаем значения массива в столбец:

WRITE(6,*)'При Х=',XN,'Y=',VEC(I) XN=XN+DX*K

2CONTINUE STOP END

31. Оператор FORMAT

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

В общем виде можно записать:

READ(N,M) список ввода M FORMAT(список спецификаций)

Например:

READ(5,3) I,K 3 FORMAT(I4,I5)

Оператор ввода READ означает: читать с устройства 5 по формату 3 значения переменных I и K.

Оператор FORMAT указывает, каким образом будут считываться данные с носителя информации (строка экрана, строка текстового файла, перфокарта, магнитный диск или

69

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

В списке спецификаций указывается, по какой спецификации будет произведено считывание значений для переменных. Спецификации бывают: I, F, E, G, X, T, А.

Спецификация X

В общем виде записывается – nX. При вводе информации обозначает: пропустить, не читая, n позиций. При выводе информации обозначает "пропустить n позиций".

 

READ(5,4) I,K Прочитать с экрана дисплея два числа для переменных I и K

 

по формату с меткой 4

В строке экрана пропустить, не читая, 3

4

FORMAT(3X, I4, 2X,I5)

 

позиции, прочитать целое число из следующих 4 позиций, пропустить 2

 

позиции, прочитать число из следующих 5 позиций

7

Y= …

Спецификация I

 

 

В общем виде:

Iw, где w – количество позиций для одного числа.

Спецификация I используется для ввода-вывода информации целого типа. Поэтому переменная, которой присваивается считанная величина, обязательно должна быть целого типа (начинаться с букв I, J, K, L, M, N или должна быть описана при помощи оператора INTEGER). В противном случае при трансляции будет обнаружена ошибка.

Пример ввода данных по спецификации I:

READ(5,3) I1,K 3 FORMAT(I4,I5)

Если ввести подряд 9 цифр , то переменной I1 присвоятся числа из первых 4 позиций, а переменной K присвоятся числа из следующих 5 позиций. Если при вводе цифр будет больше чем 9, то лишние символы будут проигнорированы. Символ «пробел» при вводе не читается.

Пример вывода по спецификации I:

WRITE(6,4) I1,K

4 FORMAT(1X,’Переменная I1=’,I4,2X,’ Переменная K=’,I5)

При выполнении данного блока в строке вывода отступим одну позицию по спецификации Х, выведем текст: «Переменная I=», следом числовое значение переменной I1 будет выведено в четырех позициях, черtз два пробела после этого выведем текст: «Переменная K=» и в следующих пяти позициях выведем числовое значение переменной К.

Спецификация Х при выводе информации означает пропустить заданное количество позиций.

Правило:

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

70