====== Процедурные и функциональные типы ======
=== Применение: ===
Когда нужно гибкое оперирование над данными.
Допустим, имеется некоторая задача, в которой выполняются одни и те же операции для разных функций или процедур. Тогда имеет смысл объявить функциональный/процедурный тип и передавать их как параметры.
* Сортировка данных
* Вычисление табличных значений разных функций, выражений.
type
fofx = function(x : real) : real; { необходимо для вычиления функции }
{ Вычисление значения производной функции в заданной точке }
function derivative(x, dx : real; y : fofx) : real;
begin
derivative := (y(x + dx/2) - y(x - dx/2)) / dx;
end;
{ Интегрирует фукцию от a до b с помощью приближения функции прямоугольниками высотой h }
function integral(a, b, h : real; y : fofx) : real;
var
x, summation : real;
begin
summation := 0;
x := a + h/2;
while x < b do
begin
summation:= summation + h *
sqrt( sqr(y(x)) + sqr( derivative(x,h,f) ) ); {Integral Expression}
x:=x+h;
end;
integral := summation;
end;
procedure PlotTable (F: fofx; Xinit, Xfin, Xstep: real);
var
x: real;
begin
x := Xinit;
while x < Xfin do
begin
writeln (x:8:2, F(x):8:2);
x := x + Xstep;
end;
end;
В этом примере будут вычисляться табличные значения функций f1(x), f2(x) и f3(x).
function F1 (x : real) : real; FAR;
begin
F1:=1.0-sin(x);
end;
function F2 (x : real) : real; FAR;
begin
F2:=1.0-cos(x);
end;
function F3 (x : real) : real; FAR;
begin
F3:=exp(x);
end;
begin
writeln;
writeln ('Table of function F1(x):');
PlotTable (F1, -pi/4, pi/4, 1e-2);
writeln;
writeln ('Table of function F2(x):');
PlotTable (F2, -pi/4, pi/4, 1e-2);
writeln;
writeln ('Table of function F3(x):');
PlotTable (F3, -2.0, 2.0, 1e-2);
end.