
11. Подпрограммы
Подпрограмма – средство представления вспомогательного алгоритма на языке программирования.
В Паскале подпрограммы могут быть оформлены либо как процедуры (procedure), либо как функции (function). Подпрограмма оформляется как функция чаще всего в том случае, когда она возвращает в качестве результата одно единственное скалярное значение. В остальных случаях более предпочтительно оформлять ее как процедуру. И те и другие имеют одинаковую структуру, т.е. состоят, как и программа, из секций объявлений и исполнимой части, содержащей операторы.
С
<Заголовок
подпрограммы>; <Раздел
указания используемых модулей> <Раздел
деклараций>
< Секция объявления
локальных констант>
< Секция объявления
локальных типов>
< Секция объявления
локальных переменных>
< Секция объявления
внутренних процедур и функций> begin
<Операторы,
описывающие алгоритм>
end;
Отличия в описании функции и процедуры касаются только заголовка и наличия в функции среди прочих операторов по крайней мере одного оператора присваивания, в котором имени функции присваивается значение возвращаемого результата. Отметим также, что текст подпрограммы заканчивается ключевым словом end и символом ”;” (точка с запятой), а не точкой, как в случае программы.
С
function
<имя>
(<список формальных параметров>):<тип
результата>;
{Вызов
функции может выполняться там, где
допускается
записывать
выражение,
в частности, в правой части оператора
присваивания
или в
списке вывода.
Например:
Sum
:= Summa(Vector);
Writeln(’Сумма
элементов = ’,
Sum(Vector));}
procedure
<имя>
(<список формальных параметров>);
{Вызов
процедуры выполняется отдельным
оператором.
Например:
Summa(n,
Vector); }
П
function
<имя>:<тип
результата>;
procedure
<имя>;
11.1. Область действия идентификаторов
Областью действия (сферой видимости) идентификатора называется часть программы, где он может быть использован.
Область действия идентификаторов определяется местом их объявления. Если идентификаторы можно использовать только в пределах одной подпрограммы, то какие идентификаторы называются локальными. Если же действие идентификатора распространяется на несколько вложенных (не менее одной) подпрограмм, то такие идентификаторы называются глобальными.
Отметим, что понятия «глобальные» и «локальные» следует понимать относительно – по отношению к конкретной подпрограмме.
П
Program
Scope;
var
A0, B0, C0 : integer;
procedure
P1;
var
A1,
B1, C1 : integer;
procedure
P2;
var
A2, B2, C2 : integer;
begin
Допустимо
использование
как
глобальных A0,
B0, C0, A1, B1, C1,
так
и локальных
A2, B2, C2
end;
{procedure P2}
begin
Допустимо
использование
как
глобальных A0,
B0, C0,
так
и локальных
A1, B1, C1
end;
{procedure P1} begin
Допустимо
использование только A0,
B0, C0, end.
В данном примере
A0, B0, C0 будут глобальными для всех подпрограмм, используемых в программе;
A1, B1, C1 будут глобальными для всех подпрограмм, описанных внутри процедуры P1 (в данном примере для процедуры P2), и одновременно локальными для самой процедуры P1;
A2, B2, C2 – видимы (локальны) только в процедуре P2.
Сформулируем правила определения области действия для идентификаторов подпрограмм (процедур и функций):
действуют все идентификаторы, определенные внутри подпрограммы;
действуют все идентификаторы окружающего контекста, если имена отличаются от имен, объявленных внутри подпрограммы;
локальные идентификаторы подпрограммы во внешнем окружении действовать не будут никогда;
в случае совпадения имен глобального и локального идентификаторов действовать будет только внутренний локальный идентификатор. Это означает следующее: объявление во внутренней подпрограмме данных с идентификаторами, совпадающими по имени с данными внешних программы или подпрограмм, отменяет действие внешних идентификаторов и вводит свои локальные описания, независимо от того, совпадают они по типу, или нет.
Примечание. Локальные данные создаются при вызове подпрограммы и существуют только во время ее выполнения. Выделение памяти для локальных данных происходит автоматически в начале выполнения подпрограммы, а освобождение этой памяти – как только выполнение подпрограммы заканчивается. Следствие этого: значения локальных данных существуют, пока подпрограмма выполняется. Как только она завершается, все изменения значений локальных данных, сделанные операторами подпрограммы, исчезнут вместе с освобождением памяти.