Процедура - независимая поименованная часть программы, предназначенная для выполнения определенных действий, которая может быть вызвана для выполнения из раздела операторов главной программы или из тела другой процедуры.
Процедура пользователя состоит из заголовка и тела процедуры и имеет следующую структуру:
Procedure < имя > ( p1,p2,...pn ) ;
< раздел описаний >
< раздел операторов >
Заголовок включает в себя зарезервированное слово Procedure, идентификатор (имя) процедуры, заключенный в круглые скобки список формальных параметров ( p1, p2, ... ,pn ). Имя процедуры - идентификатор уникальный в пределах блока.
Формальные параметры - это, как правило, список, состоящий из данных двух видов - входных значений и выходных (результата). Тип каждого параметра должен быть указан. Если процедура возвращает в программу результат, то перед этим параметром должно быть поставлено зарезервированное слово Var.
Тело процедуры представляет собой локальный блок, по структуре аналогичный программе, т.е. содержит раздел описаний и раздел операторов.
Для обращения к процедуре используется оператор вызова процедуры. Он состоит из идентификатора (имени) процедуры и списка фактических параметров (аргументов), отделенных друг от друга запятыми, заключенного в круглые скобки.
Формат оператора:
< имя >( f1,f2,...fn );,
где f1,f2,...,fn фактические параметры.
Параметры обеспечивают режим замены, который позволяет выполнять процедуру с различными входными данными. Между фактическими параметрами в операторе вызова и формальными параметрами заголовка процедуры должно соблюдаться взаимно-однозначное соответствие. Т.е. количество, тип, порядок следования фактических параметров соответствует количеству, типу и порядку следования формальных параметров.
При вызове процедуры управление передается телу процедуры, происходит замена формальных параметров на фактические и над ними выполняются все действия, указанные в процедуре, после этого управление передается оператору следующему за оператором вызова процедуры. Процесс выполнения инструкций программы, в состав которых входит процедура, представлен на рис. 24.
Рис. 24. Выполнение инструкций программы, в состав которой включена
процедура программиста.
Следующая программа вычисляет таблицу квадратных корней чисел и для оформления таблицы использует процедуру с именем Line, которая выводит на экран строку символов.
Program Example ;
VAR
i : Integer ;
{ процедура программиста }
Procedure Line(n:integer; c:char) ;
var
i:integer ;
begin
for i:=1 to n do write(c) ;
writeln ;
end ;
BEGIN
writeln('Таблица квадратных корней') ;
line(15,'=') ;
writeln('Число Корень') ;
line(15,'=') ;
for i:=1 to 5 do
begin
writeln(i:5,' ',sqrt(i):6:3) ;
line(15,'-')
end
END.
Результат работы программы:
Для рисования двойной и одинарной линии использована одна и та же процедура Line, но вызывается она с разными фактическими параметрами. Процедура Line может рисовать линии любой длины (разумеется, ограниченных шириной экрана) и из любых символов.
Если в описании процедуры перед именем параметра стоит слово VAR, то при вызове процедуры на месте соответствующего параметра должна стоять переменная основной программы. Использование константы или выражения вызовет сообщение об ошибке во время компиляции программы.
Функция пользователя по назначению и структуре аналогична процедуре пользователя, но, как правило, используется в тех случаях, когда результат работы подпрограммы одно число. Функция, определенная пользователем, состоит из заголовка и тела.
Она имеет следующую структуру:
Function < имя > ( p1,p2, ... ,pn ) :<тип возвращаемого результата>;