Процедуры-подпрограммы
. . .
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 имя подпрограммы [(список фактических параметров)]