У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


Реалізувати генератор псевдовипадкових чисел, оснований на рекурентному співвідношенні Vi=(a*Vi-1+b*Vi-2+c) mod m. Перші два значення V1 і V2 задаються випадково. Параметри підібрати самостійно. Використати генератор в задачах 8.3–8.4.

7. Підпрограми як параметри

У мові Паскаль параметрами підпрограм можуть бути не тільки змінні, але й підпрограми.

Розглянемо приклад. Нам потрібно надрукувати три таблиці значень трьох математичних функцій на заданому відрізку [a; b], де a>0, у точках, розташованих із заданим кроком h. Функції такі:

sh(x) = (ex-e-x)/2, ch(x) = (ex+e-x)/2,

th(x) = (ex-e-x)/(ex+e-x) = (e2x-1)/(e2x+1) .

У програмі можна записати функції з іменами sh, ch і th, що задають необхідні обчислення, та означити змінні a, b, h, n, k, x. Тоді оператори тіла програми можуть мати такий вигляд:

Readln(a, b, h);

n:= trunc((b-a)/h);

for k:=0 to n do

begin x:=a+k*h; writeln(x, ' ', sh(x)) end;

for k:=0 to n do

begin x:=a+k*h; writeln(x, ' ', ch(x)) end;

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);

Однією з особливостей роботи з системою Турбо Паскаль є використання так званих директив транслятора. Вони записуються в коментарі з символом $ на початку і задають спеціальні режими роботи транслятора. Не поринаючи у подробиці, скажемо лише, що якщо підпрограма використовується як аргумент у викликах інших підпрограм, то перед нею треба написати директиву {$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 на відрізку [-? /2; ? /2], де -1<a<1, із використанням підпрограми з попередньої задачі.


Сторінки: 1 2 3 4