Підпрограми
for k:=0 to n do
begin x:=a+k*h; writeln(x, ' ', th(x)) end;
Достатньо нудно. Якби в нас була підпрограма (процедура) з ім'ям tabf, параметризована не тільки відрізком і відстанню між точками, але також і функцією, то замість трьох циклів достатньо було б написати лише
tabf(sh, a, b, h); tabf(ch, a, b, h); tabf(th, a, b, h);
Займемося написанням процедури tabf. Нехай f буде ім'ям параметра, що позначає функцію, яка табулюється; імена й зміст інших параметрів очевидні. Для початку маємо
procedure tabf( означення параметра f; a, b, h : real);
var k, n : integer; x : real;
begin n := trunc((b-a)/h);
for k:=0 to n do
begin x:=a+k*h; writeln(x, ' ', f(x)) end;
end;
Уточнимо тепер означення параметра f. У стандарті мови Паскаль воно мало б вигляд заголовка функції, ім'я параметра в якій не має значення, наприклад,
function f(xxxx : real) : real.
Зауважимо, що функції sh, ch і th слід було б означити з аналогічними заголовками, тобто, наприклад,
function sh(x : real) : real.
Отже, заголовком процедури було б
procedure tabf(function f(xxxx : real) : real; a, b, h : real);
Якби f була не функцією, а процедурою, ми записали б відповідно
procedure tabf( procedure f(…);…)…
У стандарті мови Паскаль параметри-підпрограми можуть мати параметрами тільки параметри-значення, а параметри-змінні та підпрограми не допускаються. Втім, параметр-підпрограма може й зовсім не мати параметрів.
У мові Турбо Паскаль типи параметрів у заголовках підпрограм можна задавати тільки іменами. Інші вирази заборонені. Тому тут потрібно заздалегідь означити тип підпрограми і використовувати його в заголовку tabf:
type typfun = function (xxxx : real) : real; {ім'я функції відсутнє ! }
procedure tabf( f : typfun; a, b, h : real);