nextupprevious

Next:6.1.6 Использование процедур и функций для пошаговой разработки программ
Up:6.1 Подпрограммы: процедуры и функции
Previous:6.1.4 Получение результатов- выходные параметры


6.1.5 Вычисление единственного значения -- функции

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

procedure ФАКТ (N:integer):integer;
    var K,M : integer;
begin M := 1; for K := 2 to N do M := M $*$ K end; return M end ФАКТ;

Обращение к функции (или указатель функции) -- это имя функции и список фактических параметров в круглых скобках. Например, оператор Х := ФАКТ(Y+1) + 2 обращается к функции ФАКТ с фактическим параметром Y+1 и результирующее значение (оно равно (Y+1)!), увеличенное на 2, присваивает переменной Х. Тело функции должно содержать хотя бы один оператор задания значения функции (рис. 6.6). Требуется, чтобы при любом обращении к функции выполнялся, по крайней мере, один из операторов задания значения этой функции. Текущее значение выражения, образующего данный оператор, -- это и есть то значение, которое изображается данным обращением к функции (именно оно будет использоваться при дальнейшем выполнении выражения, подвыражением которого является данное обращение к функции).

FunctionHeading = procedure ProcedureName "(" [ FPSection { ";" FPSection } ] ")"  ":" FormalType.

Рис. 6.5. Заголовок функции

ReturnStatement=return Expression.

Рис. 6.6. Оператор задания значения функции

Функция, как и процедура, может иметь список параметров и работать с глобальными (нелокальными) переменными. Не требуется, но однако желательно, чтобы все ее параметры были входными, а нелокальные переменные внутри функции не перевычислялись. Это позволит гарантировать отсутствие так называемого побочного эффекта функции.

Приведем простой пример функции с побочным эффектом

procedure Y(): integer;
begin
    X:= Sqrt(X); Read(Z);
    if (X$<$Z) & (Z$<$X+1) then Y:=0 else Y:=X end
end Y;

Нетрудно видеть, что функция не только вычисляет значение, которое она поставляет на место обращения к ней, но и выполняет действия, результат которых проявляется вне функции: изменяет значения глобальных переменных и состояние стандартного входного файла, что может привести к неожиданным последствиям. Например, внимательно сравнивая выполнения выражений$X+Y$() и Y()+X или Y()+Z и $Z+Y$(), а также операторов begin X:= Y()+1; Read(V) end и begin Read(V); X:= Y()+1 end, можно с удивлением обнаружить, что из-за побочных эффектов они могут приводить к разным результатам.

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

Next:6.1.6 Использование процедур и функций для пошаговой разработки программ
Up:6.1 Подпрограммы: процедуры и функции
Previous:6.1.4 Получение результатов- выходные параметры


© В.Н. Касьянов, Е.В.Касьянова, 2004