Когда нужно гибкое оперирование над данными.
Допустим, имеется некоторая задача, в которой выполняются одни и те же операции для разных функций или процедур. Тогда имеет смысл объявить функциональный/процедурный тип и передавать их как параметры.
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.