Передача одиночных элементов массивов при вызове подпрограммы не отличается от передачи в неё простых переменных. При передаче всего массива рекомендуется предварительно определить его тип, поскольку он не является стандартным. Например:
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. Теперь из процедуры А можно обращаться к процедуре В. Например: