- •Вспомогательные алгоритмы. Процедуры и функции.
- •Алгоритмы-процедуры и алгоритмы-функции.
- •Алгоритм-процедура
- •Алгоритм-функция.
- •Программирование с использованием процедур и функций. Описание подпрограммы-процедуры.
- •Описание подпрограммы функции.
- •Обращение к подпрограмме-процедуре
- •Обращение к подпрограмме – функции.
- •Использование массивов в процедурах.
- •Особенность Оbject Pascal.
- •Локальные и глобальные параметры (переменные).
- •Рекурсивные подпрограммы.
- •Косвенная рекурсия.
- •Процедурные типы.
Косвенная рекурсия.
Рекурсия называется прямой, если подпрограмма вызывает саму себя и косвенной, если две или более процедуры и функции вызывают друг друга взаимно.
1
) 2)

Пример: Две процедуры вызывают друг друга взаимно.
Program primer;
………………….
procedure А1(k:integer);
begin
………………….
A2(k);
………………….
end;
procedure А2(i:integer);
begin
…………………...
A1(i);
end;
begin
………. {раздел операторов}
end.
В Pascal должно выполняться правило, чтобы имя до его использования было описано, поэтому обращение к процедуре А2 в теле процедуры А1 будет ошибочным. Чтобы этого избежать используется опережающее описание подпрограммы, в котором записывается только заголовок подпрограммы с директивой Forward. Затем ниже эта подпрограмма должна быть описана полностью, причем в заголовке достаточно записать только имя подпрограммы без формальных параметров
Program n;
………………….
procedure A2(i:integer);
Forward;
procedure A1(k:integer);
begin
…………………
А2(k);
…………………
end;
procedure A2; {без формальных параметров}
begin
…………………
A1(i);
…………………
end;
begin
…………………
end.
Процедурные типы.
В списке формальных параметров процедуры или функции могут быть параметры, означающие вызов той или иной подпрограммы, т.е. одна и та же процедура (или функция) может обращаться к различным процедурам или функциям при каждом новом обращении к ней. В ТP и ОP для реализации этой возможности предусмотрен специальный процедурный тип. Он позволяет указать, какой вид подпрограмм можно использовать в качестве параметра и с какими формальными параметрами должны быть эти подпрограммы. Процедурный тип описывается в разделе Type следующим образом:
Type
<имя типа>= Procedure(<список формальных параметров>);
<имя типа>= Function(<список формальных параметров>):<тип функции>;
Затем в списке формальных параметров основной процедуры <имя типа> используется при описании параметра:
<имя переменной>:<имя типа>;
Пример: Составить программу вывода на печать результата сложения и умножения двух целых чисел в заданном диапазоне. Для этого составить процедуру, которая печатает или таблицу сложения, или таблицу умножения.
Здесь будет применен параметр – функция, как параметр процедурного типа. Этот параметр будет являться параметром-значением процедуры. В качестве фактического параметра для него будет использована та или другая функция с параметрами требуемого типа.
Program Tablica;
type func=function(x, y:integer):integer; {описание процедурного типа}
function Add(x, y:integer):integer; far; {описание функции сложения}
begin
Add:=x+y;
end;
function Multiply(x, y:integer):integer; far; {описание функции умножения}
begin
Multiply:=x*y;
end;
procedure PrintTable(a, b:integer;operation:func); {процедура печати}
var i, j:integer;
begin
for i:=1 to a do
begin
for j:=1 to b do write(operation(i,j):5); {5-формат печати}
readln;
end;
writeln;
end;
begin {исполняемая часть программы}
PrintTable(10,10,Add);
PrintTable(10,10, Multiply);
end.
Чтобы правильно описать заголовок процедуры PrintTable необходимо предварительно описать имя процедурного типа, который затем используется для описания формального параметра operation. При обращении к процедуре PrintTable формальный параметр operation процедурного типа func заменяется фактическими параметрами – функциями Add и Multiply.
Отметим, что если подпрограмма используется для переменных процедурного типа, то в Turbo Pascal она независимо от своего положения должна компилироваться нестандартным образом. В этом случае в ней можно использовать директиву far или же ключ компилятора {$F+}.
В ОР это не обязательно.
