Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_po_programmirovaniyu_k_ekzamenu_33_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
573.95 Кб
Скачать

Билет 35. Процедурный тип. Передача процедур и функций в качестве параметра.

Основное назначение процедурных типов – дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.

Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:

Type

Proc1 = Procedure (var a, b);

Func1 = Function: string;

Итак, существует два процедурных типа: тип-процедура и тип-функция. Pascal не позволяет объявлять функции, возвращающие значения процедурного типа; результат функции должен быть String, Real, Integer, Char, Boolean, Pointer или перечисление.

В программе могут быть объявлены переменные процедурных типов:

var p1: Proc1;

f1, f2: Func1;

Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.

Так как процедурные типы допустимы в любом контексте, то можно объявить процедуры или функции, параметрами которых являются процедуры или функции.

Например, программа выведения 2 таблиц различных арифметических операций:

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(W, H: Integer; Operation: Func);

var X, Y: Integer;

begin

for Y := 1 to H do

begin

for X := 1 to H do Write(Operation(X,Y ) : 5);

Writeln;

end;

Writeln;

end;

begin

PrintTable(10, 10, Add);

PrintTable(10, 10, Multiply);

end.

Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций выполняются общие действия. В нашем случае процедура PrintTable представляет общее действие, выполняемое над функциями Add и Multiply.

Билет 36. Рекурсия.

Объект называется рекурсивным если он содержит сам себя или определен при помощи самого себя. Пример – определение факториала.

Мощность рекурсии связана с тем, что она позволяет определить бесконечное множество объектов с помощью конечного высказывания. Точно также бесконечные вычисления можно описать с помощью конечной рекурсивной программы, даже если эта программа не содержит явных циклов. Рекурсивные алгоритмы часто используются в тех случаях когда решаемая задача или вычисляемая функция или обрабатываемая структура данных определены с помощью рекурсии. Необходимое и достаточное средство для рекурсивного представления программ – это описание подпрограмм, т. к. оно позволяет присваивать какому-либо оператору имя с помощь которого можно вызвать этот оператор. Если процедура содержит явное обращение самой к себе, то он называется пряморекурсивной. Если про-ра Р содержит обращение к процедуре А, которая содержит (прямо или косвенно) обращение к про-ре Р, то пр-ра Р называется косвенно рекурсивной. Следо-но использование рекурсии не всегда видно из текста программы.

Пример 1. Вычислить факториал n!

Function Factorial (n: integer): integer;

Begin if n=0 then Factorial:=1

else Factorial:=n* Factorial(n-1)

End.

Пример 2. Пример косвенной рекурсии. Определить чётность/нечётность количества знаков в последовательности.

function iseven (m: string): boolean;

begin if isempty(m) then iseven:=true

else iseven:= isodd (rest(m))

end;

function isodd (m: string): boolean;

begin if isempty(m) then isodd:=false

else isodd:= iseven (rest(m))

end;

С процедурой принято связывать некоторое множество локальных объектов, т.е. переменных, констант, типов и процедур, которые определены локально в этой процедуре, а вне её не имеют смысла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]