Сторінка
4
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); Однією з особливостей роботи з системою Турбо Паскаль є використання так званих директив транслятора. Вони записуються в коментарі з символом $ на початку і задають спеціальні режими роботи транслятора. Не поринаючи у подробиці, скажемо лише, що якщо підпрограма використовується як аргумент у викликах інших підпрограм, то перед нею треба написати директиву {$F+}, а після – {$F-}. У нашому прикладі означення імен функцій sh, ch і th слід узяти в "директивні дужки": {$F+} function sh(x : real ) : real; … end; function ch(x : real ) : real; … end; function th(x : real ) : real; … end; {$F-} У мові Турбо Паскаль підпрограми, що використовуються як аргументи, можуть мати параметри всіх трьох видів, а не лише параметри-значення. Можливо також використання змінних типу підпрограма. Наприклад, ми могли б у нашому прикладі означити "змінну типу функція"
var zz : typfun; і використовувати її далі в програмі: for m:=1 to 3 do begin if m=1 then zz:=sh else if m=2 then zz:=ch else zz:=th; tabf(zz, a, b, h) end; У діалекті Турбо Паскаль не можна використовувати стандартні математичні функції як аргументи у викликах підпрограм. Обійти це обмеження нескладно. Достатньо написати й використати власну функцію з іншим ім'ям, наприклад,
function sinmy(x : real) : real;
begin sinmy := sin(x) end; Задачі 6. Написати процедуру, що реалізує метод половинного ділення (задача 5.4) і має один із параметрів типу function ff(x : real) : real. 7. Написати програму обчислення кореня рівняння sinx - a = 0 на відрізку [-p /2; p /2], де -1<a<1, із використанням підпрограми з попередньої задачі.