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

Процедурные типы

Turbo Pascal позволяет вводить переменные специального вида, значениями которых могут служить подпрограммы. Иными словами, Turbo Pascal позволяет интерпретировать процедуры и функции как значения, которые можно присваивать переменным и использовать в качестве параметров. Речь идёт о подпрограммах как о целостных объектах, а не о значениях, возникающих в результате их выполнения.

Пример

var

P: procedure;

Возможными значениями переменной P могут являться любые процедуры без параметров.

В общем случае процедурный тип задаётся конструкцией, очень похожей на заголовок процедуры или функции.

Пример

type

Func=function(x,y: integer): integer;

var

F1, F2: Func;

Переменным F1 и F2 могут быть присвоены в качестве значений функции от двух целых параметров, возвращающие целый результат. Если в этой программе есть описание функции

function Add(a,b: integer):integer;

begin

Add:=a+b

end;

то допустимо присвоение вида F1:=Add;

Переменной F1 в качестве значения присваивается функция как таковая. Выполнения этой функции не происходит.

После такого присваивания имеется возможность вызывать функцию Add как по значению, так и с помощью указания переменной F1, то есть

writeln(Add(1, 2)); writeln(F1(1, 2)); Оба оператора напечатают число 3.

Определение процедурного типа аналогично заголовку подпрограммы с той лишь разницей, что имя подпрограммы не задаётся.

Пример

type

Proc= procedure;

BinOperation= function(x,y: real): real;

UnOperation= function(x: real): real;

Reading= procedure(var f: text; var Elem: char);

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

Turbo Pascal позволяет определять переменные, значениями которых могут быть процедуры и функции. Для таких переменных допускаются операторы присваивания, в правых частях которых находятся идентификаторы других процедурных переменных или идентификаторов подпрограммы. Переменная процедурного типа в различные моменты времени может иметь в качестве значения различные подпрограммы.

Такие переменные могут быть использованы для вызова подпрограмм, которые присвоены этим переменным.

Пример

Пусть в программе есть

var

operation: function(x,y: real): real;

function Add(a,b: real):real;

begin

Add:=a+b

end;

function Sub(a,b: real): real;

begin

Sub:=a-b

end;

и выполняется

if condition then operation:=Add

else operation:=Sub;

writeln(operation(2.05,3+x));

В зависимости от истинности условия condition переменной operation будут присвоены либо функция Add, либо Sub. Активизируется та функция, которая была присвоена переменной operation.

Таким образом, в вызовах функции и в операторах процедуры, кроме идентификаторов соответствующих подпрограмм могут быть имена переменных процедурных типов. Выполнение таких конструкций заключается в вызове подпрограмм, которые были присвоены этим переменным.