Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fortran-2011.doc
Скачиваний:
13
Добавлен:
18.11.2019
Размер:
1.87 Mб
Скачать

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

С п р а в о ч н а я и н ф о р м а ц и я

Все рассмотренные до настоящего момента программы были организованы в виде единой программы, структура которой отражала алгоритм решения задачи. Однако, на Фортране программа может состоять из одной или нескольких программных единиц, под которыми понимают совокупность команд, задающих необходимые действия над данными для получения требуемого результата. Это обусловлено тем, что программы часто могут иметь многократно повторяющиеся последовательности команд, используемые для обработки различных данных. Поэтому составление программы существенно упрощается, если такие блоки команд оформляются как независимые программные единицы и к ним обращаются требуемое количество раз с разными данными. При этом программа, реализующая общий алгоритм решения задачи, называется главной, а выделенные независимые программные единицы – подпрограммами.

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

***Замечание. Программные единицы любого типа не должны обращаться сами к себе прямо или косвенно.

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

[тип] Function имя [*длина] ([параметр_1 [, параметр_2]...])

где тип

– необязательный параметр, указывающий тип возвращаемого результата (Real, Integer);

имя

– имя подпрограммы-функции;

длина

– объем памяти в байтах, выделяемый для записи результата. Объявляется только совместно с параметром тип;

парметр_i

– формальные параметры (i=1, 2, ...).

Тип результата, возвращаемого подпрограммой-функцией, определяется типом (явно или по умолчанию) имени функции. Например:

Function Prog(A, B)

– возвращает вещественный результат длиной в четыре байта;

Integer Function Prog(A, B)

– возвращает целый результат длиной в четыре байта;

Real Function Prog*8(A, B)

– возвращает вещественный результат длиной в восемь байт.

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

Подпрограмма-функция должна иметь следующую структуру:

  • оператор Function;

  • группа операторов, реализующая вычислительный алгоритм;

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

  • оператор Return;

  • оператор End.

Например:

Function Prog(A, B, C, N)

...............

Prog = Result

Return

End

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

Обращение к подпрограмме-функции выполняется путем указания ее имени непосредственно в арифметическом выражении. При этом в скобках после имени оператора-функции указываются ее фактические параметры. В качестве фактических параметров могут использоваться выражения, имена массивов и других подпрограмм. Количество, тип и порядок следования формальных и фактических параметров должны совпадать. Фактический параметр, являющийся именем подпрограммы, должен быть описан в программной единице, вызывающей подпрограмму-функцию. Для его описания используется оператор External в форме:

External имя_подпрограммы [, ...].

Например:

External Fir

An = Prog(X, A, Fir)

..........

End

Function Prog(A, B, F)

..........

Return

End

Работу с подпрограммой-функцией иллюстрирует следующий пример: написать программу для вычисления максимальных значений элементов квадратных матриц A и B, имеющих порядки 4, и 3, соответственно. Программа будет иметь вид:

Dimension A(4, 4), B(3, 3)

Real Max_1, Max_2, Max_3

Open(1, File = 'prog.dat')

Open(2, File = 'prog.res')

Read(1, 1)((A(i, j), j = 1, 4), i = 1, 4)

1 Format(9X, 4F6.2)

Read(1, 2) ((B(i, j), j = 1, 3), i = 1, 3)

2 Format(9X, 3F6.2)

Max_1 = Poisk(4, A)

Max_2 = Poisk(3, B)

Write(2, 4) ((A(i,j), j = 1,4), i = 1,4), Max_1

4 Format(4(4F6.2/), ' Max A = ', F6.2/)

Write(2, 5) ((B(i,j), j = 1,3), i = 1,3), Max_2

5 Format(3(3F6.2/), ' Max B = ', F6.2/)

End

Function Poisk(N, A)

Dimension A(N, N)

R = A(1, 1)

Do i = 1, N

Do j = 1, N

If (R.LT.A(i, j)) then

Poisk = A(i, j)

endif

enddo

enddo

Return

End

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

Первым оператором подпрограммы общего вида должен быть оператор Subroutine, который записывается в общем виде:

Subroutine имя ([параметр_1 [, параметр_2]...])

где имя – имя подпрограммы;

параметр_i – формальные параметры (i=1, 2, ...).

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

Подпрограмма общего вида имеет следующую структуру:

  • оператор Subroutine;

  • группа операторов, реализующая вычислительный алгоритм;

  • оператор Return;

  • оператор End.

Например:

Subroutine Prog(A, B, C, N)

...............

Return

End

Использование операторов Return и End аналогично их применению в подпрограмме-функции.

Обращение к подпрограмме общего вида выполняется с помощью специального оператора Call.

Call имя ([параметр_1 [, параметр_2]...])

где имя – имя подпрограммы;

параметр_i – фактические параметры (i = 1, 2, ...).

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

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

1. x2 - 3x + 2 = 0;

2. x2 + 4x + 4 = 0;

В результате решения тестовых уравнений должны быть получены результаты

1.

x1 = 1,

x2 = 2;

2.

x1 = -2,

x2 = - 2;

Программа имеет вид:

Dimension A(3, 2), X1(3), X2(3)

Open(1, File = 'dat')

Open(2, File = 'res')

Read(1, 1) ((A(i, j), j = 1, 2), i = 1, 3)

1 Format(2F6.2)

Do i = 1, 2

10 Call Roots(A(i,1), A(i,2), X1(i), X2(i))

Write(2, 2)

2 Format('X1', 'X2')

Enddo

End

Subroutine Roots(P, Q, X1, X2)

D = (P/2)**2 - Q

If (D>=0.0) Then

X1 = -P/2 + Sqrt(D)

X2 = -P/2 - Sqrt(D)

EndIf

Return

End

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

Common список

где список - список имен переменных и массивов, разделенных запятыми.

Оператор должен оформляться в соответствии со следующими правилами:

  • имена переменных и массивов могут встречаться в списке оператора только один раз;

  • имена формальных параметров и функций в списке не до пускаются;

  • оператор Common должен располагаться в программной единице до первого выполняемого оператора.

Работа оператора Common может быть пояснена на примере:

Dimension C(3), X(3), N(3)

Common A, B, C

Open(1, File = 'dat')

Open(2, File = 'res')

.............

End

Subroutine Test(Q, X, N)

Dimension F(3)

Common P, E, F

......

Return

End

В данном случае главная программа имеет оператор Common, описывающий общий блок, который содержит значения переменных A и B и одномерного массива C из трех элементов. Такой же блок описан в подпрограмме Test, что позволяет располагать его переменные P, E и массив F в той же области памяти ЭВМ. В результате такого наложения переменные A и P, B и E, а также элементы массивов C и F будут всегда иметь одни и те же значения.

Пример выполнения задания. Написать функцию для поиска максимального значения элементов массива a[10]. Исходные данные вводить из файла dan и результаты выводить в файл res.

Программа

program lab_6

Real a(10), buf,Amax

Integer i

Open(5, File = 'dat')

Open(6, File = 'res')

15 read(5,1) (a(i),i=1,10)

1 format(5f4.1)

write(6,1) (a(i),i=1,10)

Amax=P_M(a,10)

write(6,20) Amax

20 format('********************'/' Max=',f6.3)

end program

Function P_M(a,n)

Dimension a(n)

Real buf

P_M=a(1)

Do i=2,10

if (a(i)>P_M) then

P_M=a(i)

endif

enddo

return

Файл исходных данных dan

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

Файл результатов res

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

********************

Max= 7.400

З а д а н и е к л а б о р а т о р н о й р а б о т е

Написать функцию, выполняющую указанные действия, и составить программу её тестирования. При тестировании функции использовать одномерные массивы из 10 элементов. Исходные данные вводить из файла dan и результаты выводить в файл res.

  1. Вычислить сумму элементов массива с нечетными значениями.

  2. Определить количество положительных элементов в массиве.

  3. Вычислить сумму отрицательных элементов.

  4. Найти максимальный элемент массива.

  5. Вычислить среднее значение положительных элементов массива.

  6. Определить количество элементов массива, значение которых больше заданного значения а.

  7. Определить количество отрицательных четных элементов в массиве.

  8. Определить сумму двух минимальных значений в массиве.

  9. Вычислить произведение отрицательных элементов массива.

  10. Найти сумму двух самых близких значений рядом стоящих элементов массива.

  11. Заменить в массиве все отрицательные значения на нули.

  12. Определить сумму элементов массива, значение которых меньше а.

  13. Округлить значения элементов массива по правилам алгебры.

  14. Вычислить количество элементов массива, значение которых лежит в заданном диапазоне [a, b].

  15. Расположить элементы массива в обратном порядке.

  16. Определить количество отрицательных значений среди чётных элементов массива.

  17. Найти максимальный и минимальный элементы массива и обменять их значениями.

  18. Определить минимальное нечётное значение в массиве.

  19. Вычислить сумму элементов массива, имеющих чётные индексы.

  20. Определить среднее геометрическое значение элементов массива.

  21. Найти индекс минимального элемента в массиве.

  22. Вычислить среднее арифметическое значение нечетных элементов массива.

  23. Найти индекс максимального по модулю элемента в массиве.

  24. Вычислить сумму дробных частей элементов массива.

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

  26. Определить количество элементов массива, значения которых делится на 3 без остатка.

  27. Найти значение, повторяющееся в массиве несколько раз.

  28. Определить количество подряд стоящих отрицательных элементов в массиве.

  29. Увеличить все положительные элементы массива на величину а и отрицательные на b.

  30. Вычислить количество элементов, разделяющих минимальный и максимальный элементы массива.

С П И С О К Л И Т Е Р А Т У Р Ы

  1. Горелик А.М., Ушкова В.Л. Фортран сегодня и завтра. М.: Наука, 1990.

  2. 2.Меткалф М., Рид Дж. Описание языка программирования Фортран 90. М.: Мир, 1995.

  3. Немлюгин М.А., Стесик О.Л.Современный Фортран. Самоучитель. - СПб.: БХВ-Петербург, 2004. – 496 с.

  4. Бартеньев О.В. Современный Фортран. - М.: Диалог-МИФИ, 2005.

  5. Рыжиков Ю.И. Современный Фортран: Учебник. - СПб.: КОРОНА принт, 2004

  6. Фортран 90. Международный стандарт/Пер. с англ. - М.: Финансы и статистика, 1998. - 378 с.

С О Д Е Р Ж А Н И Е

Введение

3

Основные понятия. Программирование расчетов по формулам

8

Ввод–вывод информации

18

Разветвляющиеся программы. Операторы управления

28

Программирование циклов

37

Обработка массивов

47

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

58

Список литературы

69

Александр Борисович Фролов

Сборник лабораторных работ «Программирование на языке Фортран» по дисциплине «Современные языки программирования и программные комплексы» для студентов специальности 150301.65 «Динамика и прочность машин». М.: МАМИ, 2011. 64 с.

Подписано в печать Заказ Тираж

Усл.п.л. - Уч.-изд.л.

МАМИ Москва 105839 Б.Семеновская, 38.

2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]