
- •Структура программы
- •Главная программа
- •Внешние процедуры
- •Процедуры-функции
- •Пример функции
- •Процедуры-подпрограммы
- •Пример подпрограммы
- •Параметры процедур
- •Implicit none
- •Интерфейсы
- •Interface
- •Interface
- •Внутренние процедуры
- •Implicit none
- •Встроенные функции
- •Пример присоединения объектов модуля.
- •Implicit none
- •Implicit none
- •Implicit none
Процедуры-функции
Структура процедуры-функции имеет вид:
[Тип]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
endif
enddo
enddo
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)
Комментарии к примеру:
Обратите внимание на соответствие формальных и фактических параметров. Правила их соответствия будут описаны ниже.
Формальные параметры cRowsиcColumnsв процедуре-функции должны быть описаныдоих использования при описании массива.
Переменные i, j, NumI, NumJ в процедуре-функции локальны, они недоступны за ее пределами.
В алгоритме функции поиск максимального по модулю элемента заменен поиском его координат в массиве. После завершения циклов найти значение элемента массива по его координатам не представляет труда.
В главной программе должно присутствовать описание типа возвращаемого значения функции.
В главной программе использована возможность деления всех элементов на одно число без построения циклов.