Next:6.1.6
Использование процедур и функций для пошаговой разработки программ
Up:6.1
Подпрограммы: процедуры и функции
Previous:6.1.4
Получение результатов- выходные параметры
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 (XZ)
&
(ZX+1)
then
Y:=0 else Y:=X end
end Y;
Нетрудно видеть, что функция не только вычисляет значение, которое она поставляет на место обращения к ней, но и выполняет действия, результат которых проявляется вне функции: изменяет значения глобальных переменных и состояние стандартного входного файла, что может привести к неожиданным последствиям. Например, внимательно сравнивая выполнения выражений() и Y()+X или Y()+Z и (), а также операторов 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
Получение результатов- выходные параметры