Структура подпрограммы-процедуры с параметрами имеет вид
PROCEDURE <имя> (<формальные параметры>);
{ раздел описания (метки, константы, типы, переменные) }
BEGIN
{ операторы подпрограммы }
END;
Обращение к процедуре производится по имени с указанием фактических параметров, согласованных с формальными параметрами, или без их указания. Возврат из подпрограммы в основную программу происходит к оператору, стоящему следующим за ее вызовом.
Пример программы для вычисления второй и четвертой степеней числа:
PROGRAM PROS;
VAR X, Y, A, A2, A4: INTEGER; {A – исходная переменная,
A2 - A2, A4 - A4, глобальные переменные}
PROCEDURE STEP24; {процедура без параметров}
BEGIN
A2:=A*A;
A4:=A2*A2;
WRITELN(A:5, A2:5, A4:6);
END;
BEGIN {основная программа}
READ(Y, X);
WRITELN('Число; квадрат; куб');
A:= X;
STEP24; {вызов подпрограммы}
A:= Y;
STEP24; {вызов подпрограммы}
END.
Любой из формальных параметров процедуры может быть либо параметром-значением, либо параметром-переменной. Формальному параметру-значению (обычно для задания исходных данных) может соответствовать фактический параметр - константа, переменная или выражение. Параметру переменной может соответствовать только переменная. Обычно параметры-переменные используются для передачи результатов в вызывающую программу. Параметрам-переменным в заголовке функции должно предшествовать слово VAR.
Пример: PROCEDURE P(Y, X: REAL; VAR Z1, Z2: REAL);
где Y, X - параметры-значения, Z1, Z2 - параметры-переменные.
Передачу результатов можно проводить и через глобальные переменные. Однако злоупотребление глобальными переменными делает программу запутанной и сложной в отладке. В связи с этим рекомендуется там, где это возможно передавать результаты с помощью параметров-переменных. С другой стороны, нежелательно описание всех формальных параметров параметрами-переменными.
|
Чем меньше параметров объявлено параметрами-переменными и чем меньше используется глобальных переменных, тем меньше возможность получения непредвиденных программистом побочных эффектов в программе.
При наличии одноименных переменных в программе и подпрограмме в подпрограмме будут доступны только локальные переменные.
Передача в подпрограмму массивов и строк
Передача одиночных элементов массивов при вызове подпрограммы не отличается от передачи в неё простых переменных. При передаче всего массива рекомендуется предварительно определить его тип, поскольку он не является стандартным. Например:
TYPE ATYPE = ARRAY[1..10] OF REAL;
PROCEDURE R(A: ATYPE);
Такое описание возможно в связи с тем, что в списке формальных параметров могут использоваться не только стандартные, но и ранее описанные типы.
Однако объявить процедуру можно и следующим образом:
PROCEDURE R(A: ARRAY[1..10] OF REAL);
Передача в подпрограмму строки осуществляется аналогичным образом, поскольку строка является фактически массивом из её символов.
Пример описания и передачи строковых переменных:
TYPE INTYPE = STRING[10];
ONTYPE = STRING[30];
FUNCTION R(A: INTYPE): ONTYPE;
Рекурсия в программе
Рекурсия - это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения своих операторов обращается сама к себе.
Пример. Пусть задано целое положительное число, выведите на экран дисплея цифры числа в обратном порядке.
PROGRAM REKURS;
VAR N: INTEGER;
PROCEDURE REVERS(M: INTEGER);
|
BEGIN
WRITE(M MOD 10);
IF (M DIV 10)<>0 THEN REVERS(M DIV 10);
END;
BEGIN
READ(N);
REVERS(N);
END.
В ходе выполнения программы процедура рекурсивно обращается сама к себе и выводит на экран при каждом обращении очередную цифру.
Рекурсия может быть прямой или косвенной. В первом случае модуль подпрограммы содержит оператор вызова этой же подпрограммы. Во втором случае один модуль (например, А) вызывается из другого модуля (например, В), а модуль В – из А. Поскольку по правилам языка каждый идентификатор перед объявлением должен быть описан, то необходимо выполнить опережающее описание подпрограммы В. Для этого объявляется заголовок процедуры В, за которым следует служебные слово FORWARD. Теперь из процедуры А можно обращаться к процедуре В. Например:
PROCEDURE B(I:BYTE); FORWARD;
PROCEDURE A(J:BYTE);
BEGIN
...
B(J);
END;
PROCEDURE B(I:BYTE);
BEGIN
...
A(I);
END;
Вложенные подпрограммы
В разделе описаний любой подпрограммы могут встречаться описания других подпрограмм, тогда говорят, что одна подпрограмма вложена в другую.
Любые идентификаторы для описания переменных, констант, типов, а также процедур и функций, описанные внутри подпрограммы, локализуются только в ней и называются локальными для данного блока (подпрограммы). Такой блок подпрограммы вместе с выделенными в нем модулями называется областью действия этих локальных имен. Локальные имена не являются формальными параметрами.
Переменные, описанные в разделе описания основной программы, называются глобальными. Область действия глобальных переменных - основная программа и ее подпрограммы.
Имена называются нелокальными, если они описаны не в самой подпрограмме, а в охватывающем ее блоке (или во внешней подпрограмме).
|
Все имена в пределах подпрограммы должны быть уникальными и не могут совпадать с именем самой подпрограммы. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам внешних уровней.
Рекомендуется описывать имена в том блоке, где они используются, если это возможно. Если один и тот же объект (переменная или константа) используется в двух и более блоках, то их описание необходимо сделать в самом верхнем блоке, который содержит все остальные. Если переменная, используемая в подпрограмме должна сохранять свое значение до следующего вызова этой подпрограммы, то она описывается во внешнем блоке, содержащем данную подпрограмму.
Процедуры EXIT и HALT
Процедура EXIT; осуществляет выход из программного модуля - подпрограммы или основной программы. Из подпрограммы управление передается этой процедурой в вызывающую программу к следующему за ее вызовом оператору. В программе EXIT приводит к завершению ее работы.
Процедура HALT(Cod); прекращает выполнение программы, вызывает в случае необходимости подпрограмму завершения и осуществляет выход в операционную систему. Cod - необязательный параметр, определяющий код завершения программы.