Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Информатике.doc
Скачиваний:
4
Добавлен:
26.09.2019
Размер:
3.12 Mб
Скачать

7 Print*,’ Требуемое условие не выполняется’

END

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

2. Внешние функции

Внутренняя функция может использоваться лишь в тех модулях, где данная функция объявлена, причем в виде внутренней функции могут быть представлены лишь те вычисления, которые могут быть сведены к одному оператору присваивания. Этих ограничений не имеет внешняя функция, для определения которой составляется самостоятельный модуль, называемый модулем-функцией. Модуль-функция начинается с заголовка функции (предложение FUNCTION),содержащего после ключевого слова FUNCTION имя функции, справа от которого в скобках записывается список формальных параметров. В остальной части, называемой телом функции, структура модуля обычна, но надо иметь в виду, что окончание вычислений в теле функции обозначается оператором RETURN (вместо оператора STOP).

Взамен любой внутренней функции может быть использована внешняя. Так можно записать в виде внешней функции функцию R (см.пример 1). Соответственно запись головного модуля сократится на одну строку - объявление внутренней функции.

FUNCTION R(X1, Y1, X2, Y2,)

R=SQRT ((X1-X2) 2+(Y1-Y2) 2)

RETURN

END

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

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

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

Целесообразно рассмотреть на учебном примере действия программиста при конструировании внешних функций.

Пример 2. Необходимо найти отношение C средних арифметических ненулевых элементов вещественных массивов X (50) и P(70). Целесообразно вычисление среднего арифметического представить процедурой и воспользоваться ею дважды в головном модуле. Обозначим процедуру именем CA; 1-я буква имени соответствует вещественному типу, поэтому явно описывать тип функции CA (вещественный) не придется.

С целью формирования списка формальных параметров необходимо выделить объекты данных, которые будут связывать головной модуль и модуль-функцию. Обрабатываемый массив обобщенно можно обозначить, например, именем T. Поскольку фактически обрабатываемые массивы имеют разные размеры, размер массива T должен быть представлен переменной и, следовательно, войдет в список формальных параметров. Результат процедуры (внешней функции) CA будет представлен указателем функции.

Оператор - заголовок процедуры получает вид FUINCTION CA (T, N). Тип параметров T и N задан неявно, но требуется объявить массив T. Полная запись модуля-функции CA будет иметь вид:

FUNCTION CA(T, N)

DIMENSION T(N)

SUM = 0.

M = 0

DO K = 1, N

IF ( T(K).NE.0.) THEN

SUM = SUM+T(K)

M = M+1

END IF

END DO

CA = SUM/M

RETURN

END

Переменные SUM и M являются промежуточными данными в теле функции; их не следует включать в список формальных параметров. Теперь можно записать головной модуль. В нем обязательны объявления фактических массивов X и P:

DIMENSION X(50), P(80)

1 OPEN (3, FILE = ‘XP.DAT’)

READ(3,*) X, P

2 C = CA (X, 50)/CA(P, 80)

PRINT*,’ C=’, C

СLOSE(3)

STOP

END

Оператор с меткой 1 открывает файл исходных данных с именем ХР.DАТ. Перед решением задачи он должен содержать числовой массив Х (50 значений) и массив Р (80 значений). Все числа записываются последовательно в строчку через пробел или запятую.

При выполнении операторa с меткой 2 сначала в тело функции CA передается массив X, заменяющий формальный массив T и находится среднее арифметическое, которое становится значением указателя функции CA, а затем в тело функции передается массив P, заменяющий формальный массив T. Аналогично вырабатывается значение второго указателя функции CA. Далее выполняется деление и полученное результирующее значение присваивается переменной C.

Формальный массив может соответствовать и части факктического. Например, если бы в головном модуле потребовалось найти среднее арифметическое CP1 ненулевых элементов из первых 30 элементов массива P, то этот результат был бы получен оператором CP1 = CA(P, 30).

Если требуется установить соответствие формального массива и части фактического массива, началом которой является некий k-й элемент, то фактическим параметром должен быть этот элемент массива. Например,оператор СP2=CA(P(61),20) означает,что вычисляется среднее арифметическое CP2 ненулевых элементов из последних 20 элементов массива P. Формальный массив не должен иметь больший размер, чем фактический или та часть фактического массива, которой по замыслу соответствует формальный массив. Например, запись CP2=CA(P(61),80) ошибочна по той причине, что вторым параметром (80) определяется размер формального массива, превышающий число передаваемых в тело функции элементов фактического массива (20). Поэтому 60 элементов обрабатываемого в теле функции массива оказались бы неопределенными, что недопустимо.