Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 5.doc
Скачиваний:
7
Добавлен:
20.03.2016
Размер:
217.6 Кб
Скачать

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

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

[Тип]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)

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

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

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

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

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

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

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