28. Параметры процедурных типов

Язык Паскаль допускает наличие у процедур и функций параметров, которые сами являются процедурами или функциями. Для того, чтобы записать такие па­раметры в заголовке процедуры или функции, они должны иметь некоторый именованный тип. Описание процедурного типа имеет вид:

TYPE имя типа = PROCEDURE(оnuсанuе параметров); Hапpимеp,

TYPE MyProcType=PROCEDURE(VAR a:Word; b,c:Real; VAR tt:Char); Таким обpазом, описание процедурного типа представляет собой заголовок процедуры без имени процедуры. Имена параметров, использованные в описа­нии типа, могут быть произвольными (в нашем случае a,b,c,tt - совершенно слу­чайные идентификаторы). Функциональный тип описывается следующим обpа-зом:

TYPE имя типа = FUNCTION(оnuсанuе параметров):тип функции; Hапpимеp,

TYPE MyFuncType=FUNCTION(a:Real; b,c:LongInt):Boolean; H требуется никаких специальных действий, чтобы объявить какую-либо пpоцедуpу или функцию как имеющую соответствующий тип. Так, все функции типа Boolean, имеющие т^и паpаметpа, пеpвый из котоpых имеет тип Real, а два остальных - тип LongInt, автоматически будут иметь тип MyFuncType. ^ все пpоцедуpы и функции, использованные в ^ограмме как аргументы, должны быть откомпилиpованы с опцией {$F+} ! По^обуем записать ^о^амму, ко-тсфая будет выводить таблицу значений некотоpой функции:

TYPE FuncType=FUNCTION(Arg:Real):Real;

{$F+}

FUNCTION F_Cos(x:Real):Real; BEGIN F_Cos:=Cos(x); END; FUNCTION F_Sin(x:Real):Real; BEGIN F_Sin:=Sin(x); END; FUNCTION F_Tg(x:Real):Real; BEGIN F_Tg:=Sin(x)/Cos(x); END; {$F-}

PROCEDURE PrintFunc(Xmin,Xmax:Real; n:Word; F:FuncType; Header:STRING);

VAR h,x:Real; i:Word;

BEGIN WRITELN; WRITELN(Header); h:=(Xmax-Xmin)/n;

FOR i:=0 TO n DO BEGIN

x:=i*h+Xmin; WRITELN(x:10:5,F(x):10:5); END; WRITELN('Hажмите ENTER'); READLN;

END;

BEGIN PrintFunc(0,Pi,20,F_Cos,'Значения функции cos');

PrintFunc(0,Pi/2,20,F_Sin,'Значения функции sin'); PrintFunc(0,Pi/4,10,F_Tg,'Значения функции tg');

END.