Процедуры-подпрограммы

. . .

Enddo

Enddo

Endif

Пример функции

Процедуры-функции

Структура процедуры-функции имеет вид:

[Тип] function имя функции (список формальных параметров)

[Операторы описания]

[Исполняемые операторы]

[contains

внутренние процедуры]

end [function [имя функции]]

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

Оператор function называется заголовком функции. Тип функции, указанный в ее заголовке, является типом возвращаемого значения. Кроме того, в заголовке указывается уникальное имя функции, составленное по правилам Фортрана, и список формальных параметров в круглых скобках.

Среди операторов описания должны присутствовать описания формальных параметров функции и внутренних (локальных) переменных и массивов.

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

Если в операторе end указано имя функции, оно должно совпадать с именем в заголовке функции.

Вызов функции не требует специального оператора. Обращением к функции является имя функции и список фактических параметров в круглых скобках, например:

real :: A

A = имя функции (список фактических параметров)

Примеры обращения к функции:

y = sin(x)

a = sqrt(x) + sqrt(s)

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

real function Max_Abs(Array, cRows, cCols)

! заголовок функции; возвращаемое значение вещественного типа

! операторы описания:

implicit none! оператор должен быть в каждой программной единице

! формальные параметры функции – массив, количество его строк и столбцов

integer, intent(in) :: cRows, cCols

real, dimension(1:cRows,1:cCols), intent(in):: Array

! локальные переменные

integer :: i, j ! переменные циклов

integer :: NumI, NumJ ! координаты элемента матрицы

! исполняемые операторы:

NumI = 1; NumJ = 1 ! максимальным по модулю считаем Array(1,1)

do i = 1, cRows

do j = 1, cColumns

if (abs(Array(i,j)) > abs(Array(NumI,NumJ))) then

NumI = i; NumJ = j

Max_Abs = Array(NumI,NumJ) ! возвращаемое значение

end function Max_Abs

В главной программе:

implicit none! оператор должен быть в каждой программной единице

integer, parameter:: cR = 6, cCol = 8

real, dimension(1:cR, 1:cCol) :: Array

real:: Max_Abs ! описание типа возвращаемого значения функции

! фактические параметры функции Max_Abs –

! массив, число его строк и столбцов

Array = Array / Max_Abs(Array, cR, cCol)

Комментарии к примеру:

1) Обратите внимание на соответствие формальных и фактических параметров. Правила их соответствия будут описаны ниже.

2) Формальные параметры cRows и cColumns в процедуре-функции должны быть описаны до их использования при описании массива.

3) Переменные i, j, NumI, NumJ в процедуре-функции локальны, они недоступны за ее пределами.

4) В алгоритме функции поиск максимального по модулю элемента заменен поиском его координат в массиве. После завершения циклов найти значение элемента массива по его координатам не представляет труда.

5) В главной программе должно присутствовать описание типа возвращаемого значения функции.

6) В главной программе использована возможность деления всех элементов на одно число без построения циклов.

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

Структура подпрограммы имеет вид:

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

[Операторы описания]

[Исполняемые операторы]

[contains

внутренние процедуры]

end [subroutine [имя подпрограммы]]

В списке формальных параметров подпрограммы перечислены входные и выходные параметры. Используя входные параметры, процедура вычисляет значения выходных параметров и возвращает управление в вызывающую программную единицу.

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

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

Если в операторе end указано имя подпрограммы, оно должно совпадать с именем в заголовке подпрограммы.

Обращение к подпрограмме осуществляется оператором call, имеющим вид:

call имя подпрограммы [(список фактических параметров)]