{$APPTYPE Console}
program FuncAsParams;

{ Um Funktionen als Parameter an andere Routinen übergeben
  zu können, muessen sie zunaehst als (Funktions-) Typ
  deklariert werden. }

type tFunc = function(x : real): real;

{ Diese Prozedur bekommt nun eine Funktion als Parameter ... }
procedure Calc(min, max, step: real; f : tFunc);
var i : integer;
    x : real;
begin
  i := 0;
  x := min;
  while x <= max do
  begin
    writeln(x:5:2, ' ' , f(x):5:2); { Aufruf jener Funktion}
    inc(i);
    x := min + i * step;
  end;
end;

{ herkömmliche Funktion zum Übergeben }
function quadr(x : real) : real;
begin
  quadr := x * x;
end;

{ herkömmliche Funktion zum Übergeben }
function sinus(x : real) : real;
begin
  sinus := sin(X);
end;

begin
  Calc(0,  5,   1, quadr);
  Calc(0, pi, 0.3, sinus);
  readln;
end.