Процедурные и функциональные типы

Применение:

Когда нужно гибкое оперирование над данными.

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

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.