WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Підпрограми - Реферат

Підпрограми - Реферат

змінюється так, як задано рекурентним співвідношенням. Проте в програмі з такою функцією необхідно означати змінну, що була б аргументом у викликах функції. Але ця змінна доступна для зміни в самій програмі й іншим її підпрограмам, і таке рішення не є задовільним.
Ту змінну,чиїми значеннями є послідовні псевдовипадкові числа, означимо в нашій функції як статичну. Те, що змінна статична, якимось чином треба указати в її означенні. Наприклад, у мові Сі та деяких діалектах мови Паскаль там записуються додаткові позначення, щось на зразок
static var V : integer.
У діалекті Турбо Паскаль локальну статичну змінну задає означення з ініціалізацією (п.2.3.6), записане в підпрограмі. Нагадаємо його дещо дивний вигляд:
const ім'я : тип = ініціалізуюче-значення;
З ним наша функція виглядає так:
function NextRand : integer;
const V : integer = 0; const m=1001; a=21; c=57;
begin
V := ( a*V+ c ) mod m; NextRand := V
end;
Як видно, першим псевдовипадковим числом завжди буде 0. Але в задачі було потрібно, щоб перше число надходило "із зовнішнього світу". Змінимо функцію так, що при виконанні її першого виклику відбувається запит на введення першого числа з клавіатури, а при наступних - обчислення за рекурентним співвідношенням:
function NextRand : integer;
const V : integer = 0; First : Boolean = true;
const m=1001; a=21; c=57;
function Rand1: integer;
var t : integer;
begin
write('Задайте ціле від 0 до ', m-1, '>'); readln(t);
Rand1 := t
end;
begin
if First then
begin First := false; V := Rand1 end
else V := ( a*V+ c ) mod m;
NextRand := V
end;
Тепер можна записувати цю функцію та її виклики в програмах, де потрібно імітувати появу випадкових чисел. Проте краще помістити цю функцію в модуль (п.7.2 ) з ім'ям, наприклад, Randoms, транслювати його та у програмі вказувати лише його використання: uses Randoms.
Використання модулів дозволяє розв'язати нашу задачу взагалі без використання локальних статичних змінних. Справа в тім, що змінні, означені в модулі, як і змінні програми, є статичними. Тому модуль можна записати в такому вигляді:
Unit Randoms;
Interface
function NextRand : integer;
Implementation
const m=1001; a=21; c=57; var V : integer; First : Boolean;
function Rand1: integer;
var t : integer;
begin
write('Задайте ціле від 0 до ', m-1, '>'); readln(t);
Rand1 := t
end;
function NextRand;
begin
if First then
begin First := false; V := Rand1 end
else V := ( a*V+ c ) mod m;
NextRand := V
end;
Begin First := true
End.
Як бачимо, змінні V та First стали глобальними в модулі і доступними в його підпрограмах, але за його межами їх "не видно". Можна сказати, що їх означення локалізовані в модулі.
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;
Loading...

 
 

Цікаве