Статья: Процедуры и функции в языке Паскаль. Сфера действия описаний
Указатель функции может использоваться как и любое другое выражение того же типа, но это не оператор, в отличие от оператора вызова. Запишем пример функции:
FUNCTION Na3(x:LongInt):Boolean;
{ функция проверяет, делится ли x на 3 }
BEGIN Na3:=x MOD 3=0; END;
VAR L:LongInt;
BEGIN WRITE('Введите целое число '); READ(L);
WRITE('Число ',L);
IF NOT Na3(L) THEN WRITE(' не');
WRITELN(' делится на 3 !');
END.
В любой процедуре и функции можно использовать черезвычайно полезную стандартную процедуру Exit без параметров для немедленного выхода в вызывающую процедуру.
Все процедуры и функции Паскаля являются рекурсивными, то есть могут вызывать сами себя, никаких усилий со стороны программиста для этого не требуется. В качестве примера запишем функцию, вычисляющую n!
FUNCTION Factorial(n:Byte):Real;
BEGIN IF n<=1 THEN Factorial:=1
ELSE Factorial:=n*Factorial(n-1);
END;
Но это, конечно, очень плохая функция, гораздо лучше записать этот алгоритм так:
FUNCTION Factorial(n:Byte):Real;
VAR i:Byte; f:Real;
BEGIN f:=1; FOR i:=2 TO n DO f:=f*i;
Factorial:=f;
END;
Итак, мы знаем, что программа может содержать много процедур и функций, и в каждой из них могут быть описаны типы, константы и переменные. Но не все из них могут быть использованы в любом месте программы, каждое описание имеет строго определенную сферу действия. Пусть процедура А находится внутри процедуры В - условимся называть процедуру А внутренней по отношению к В, а процедуру В - объемлющей по отношению к А. Если же ни процедура А не находится внутри В, ни В не находится внутри А, то эти процедуры - внешние по отношению друг к другу. Сфера действия описания любого объекта включает ту процедуру, где он описан (начиная с места описания) и все внутренние процедуры, если там данный идентификатор не описан. В принципе, это дает возможность передавать информацию в процедуры и функции, минуя параметры, то есть пользоваться во внутренней процедуре переменными, описанными в объемлющей процедуре, но такой стиль программирования считается ненадежным. Старайтесь, если это возможно, все переменные, используемые в процедуре, описывать в этой процедуре.
Для чего нужны процедуры и функции, когда и как их следует применять? Многие начинающие программисты избегают процедур и функций, утверждая, что "без них проще". На самом деле обойтись без функций и процедур легко только в самых тривиальных программах. Сколько-нибудь сложная программа, записанная "одним куском", требует при отладке от программиста огромных усилий, которые зачастую все равно пропадают даром. Обязательно используйте в своих программах процедуры и функции! Хорошая программа должна содержать главным образом обращения к процедурам и функциям. Конечно, не существует никаких жестких правил, определяющих, когда использовать функции, а когда нет, но автор этой книжки может предложить несколько нестрогих, но полезных рецептов:
- выделяйте в процедуру (функцию) небольшой логически завершенный фрагмент алгоритма;
- не смешивайте в одной процедуре (функции) ввод-вывод данных и вычислительные алгоритмы;
- называйте свои процедуры (функции) мнемоническими именами;
- если алгоритм, который вы решили выделить в процедуру (функцию), все еще слишком сложен, оформите фрагмент этого алгоритма в другой процедуре (функции);
- если алгоритм должен вычислить одно скалярное значение, пусть это будет функция, а не процедура;