Пераменныя – працэдуры і функцыі
Прымяненне працэдурнага тыпу не абмяжоўваецца толькі адным апісаннем параметраў – працэдур ці функцый. Калі ёсць тып, значыць, могуць быць і пераменныя такога тыпу.
Працэдурныя пераменныя па фармаце сумяшчальныя з пераменнымі тыпу Pointer і пасля прывядзення тыпаў могуць абменьвацца з імі значэннямі.
Адносна папярэдняй праграмы могуць быць такія змяненні. Дабавім
VAR Oper : Func;
Cond : Char;
У галоўнай праграме выканаем наступныя дзеянні:
Writeln('задай аперацыю (*/+)');
Readln(Cond);
Writeln;
CASE Cond OF
'*' : Oper := Mult;
'+' : Oper := Add
END;
MakeTable(16, 16, Oper, Cond); ...
Заўвага. Падпраграма, якая надаецца працэдурнай пераменнай:
1) не павінна быць стандартнай працэдурай ці функцыяй.
Гэта абмежаванне можна абысці такім, напрыклад, прыёмам: выклік стандартнай падпраграмы заключыць у «абалонку».
VAR Func : FUNCTION(x : Real) : Real;
…
FUNCTION MySin(x : Real) : Real; FAR;
BEGIN
MySin:=Sin(x)
END;
…
Func:=MySin;
2) не можа быць укладзена ў другія падпраграмы;
3) не можа быць падпраграмай спецыяльнага віду, якая мае спецыфікацыю INTERRUPT ці канструкцыю INLINE.
Пераменныя працэдурных тыпаў, каб быць сумяшчальнымі па наданні значэння, павінны мець:
аднолькавую колькасць фармальных параметраў;
параметры на адпаведных пазіцыях павінны належаць аднаму і таму ж тыпу (супадаць).
У выніку функцый павінны супадаць тыпы значэнняў, якія вяртаюцца.
Разгледзім задачу падліку значэння вызначанага інтэграла, сэнс якога – плошча крывалінейнай трапецыі.
Прыклад. Саставіць падпраграму вылічэння значэння інтэграла па формуле трапецый.
дзе i = 1, 2, …, n – 1, – лік адрэзкаў разбіўкі інтэрвалу інтэгравання.
Па гэтай праграме падлічыць і для нейкага зададзенага n.
Рашэнне.
PROGRAM Int;
CONST n = 20;
TYPE
TFunc = FUNCTION(x : Real) : Real;
VAR fu: TFunc;
FUNCTION f1(x : Real) : Real; FAR;
BEGIN
f1 := (x * x * ln(x)) / (Sin(x) + x)
END;
FUNCTION f2(x : Real) : Real; FAR;
BEGIN
f2 := x * x / (Cos(x) + x)
END;
FUNCTION Trap(n : Integer; a,b: Real; f : TFunc) : Real;
VAR
h, s, x : Real;
i : Integer;
BEGIN
h := (b - a) / n;
s := (f(a) + f(b)) * 0.5;
x := a;
FOR i := 1 TO n - 1 DO
BEGIN
x := x + h;
s := s + f(x)
END;
Trap := h * s;
END;
BEGIN
Writeln('n=', n);
fu := f2;
Writeln(Trap(n,pi/4,pi/2, f1),Trap(n,pi/6,pi/3,fu));
END.