Сторінка
2

Паскаль: область дії, модулі, структури

t:=gcd(x1, y1);

x1:=x1 div t; y1:=y1 div t

end; Нарешті, наведемо розташування наведених підпрограм у блоці програми. Функція gcd повинна бути записана перед процедурою redufr, оскільки в ній визивається. Так само ця процедура повинна бути записана перед процедурою plusfr. Взаємне розташування plusfr, writefr і readfr не має значення:

function gcd(x, y : integer) : integer; …

beginend;

procedure redufr(var x1, y1 : integer); …

begin … gcd … end; procedure plusfr(x1, y1, x2, y2 : integer; var x3, y3 : integer); begin … redufr … end; procedure readfr(var x, y : integer); beginend; procedure writefr(x, y : integer); begin write(x, '/', y) end; Запис програми в остаточному вигляді залишаємо як вправу. Переозначати ім'я підпрограми в ній самій мова Паскаль забороняє. Але дозволяє використовувати його, тобто позначати ним виклики цієї ж підпрограми. Такі виклики підпрограми усередині її самої називаються рекурсивними; ми познайомимося з ними в розділі 9. Ім'я, означене в підпрограмі (або програмі), називається локальним у ній. Ім'я, записане, але не означене в підпрограмі, називається глобальним у ній. Воно може бути означеним у одній з підпрограм, що охоплюють, або програмі. У прикладі 7.1 ім'я t є глобальним в процедурі minus і в процедурі plus, але тільки до означення {2}; далі воно є локальним і позначає зовсім іншу змінну, хоча й того ж типу. У наступному підрозділі ми розглянемо модулі – спеціальні "збірники означень", які дозволяють використовувати імена взагалі без означення в програмі. Втім, такі імена вже знайомі – наприклад, імена математичних функцій або підпрограм readln і writeln. Зміна змінної з глобальним ім'ям у підпрограмі називається побічним ефектом підпрограми. Наприклад, у програмі twovars побічний ефект процедури minus полягає в зміні значень змінної з ім'ям t. Побічний ефект називається явним, якщо він заданий операторами присвоювання. Такий побічний ефект процедури minus. Неявний побічний ефект задається, якщо глобальне ім'я вказати у виклику підпрограми як аргумент, що відповідає параметру-змінній. Наприклад, у виклику процедури читання. Програміст може задати побічний ефект, іноді навіть не бажаючи цього, через неуважність. Результати такої помилки можуть виявитися цілком несподіваними й навіть дуже сумними для автора програми. Тому використання глобальних імен вимагає особливої уваги. Втім, це аж ніяк не означає, що користуватися ними не варто. Як і побічним ефектом. Усе добре в міру й за своїм призначенням. При імітації виконання програми можна ввести додаткові позначення для локальних імен у підпрограмах, щоб явно відрізняти їх від глобальних. Наприклад, якщо в підпрограмі S означено ім'я N, то позначимо його S.N, а якщо підпрограма S2 вкладена в підпрограму S1 і містить означення імені N, то позначимо його S1.S2.N тощо. Зокрема, у прикладі 7.1 ім'я t у підпрограмі minus є глобальним і додаткового позначення не одержує, а в підпрограмі plus позначається plus.t. Як відомо з розд.2, при виконанні виклику підпрограми її параметрам-змінним зіставляється пам'ять аргументів. При імітації виконання програми можна "сумістити" параметр-змінну з аргументом. Іншим іменам змінних, означеним у підпрограмі, зіставляються свої власні ділянки пам'яті. Наприклад, виконання програми program qq(input, output); var a, b, c : integer; procedure ps(a : integer; var b : integer); var t : integer; begin t := a+b; b := t-b; a := t-b; c := t end; begin a := 1; b := 5; c := 2; ps(b, a); writeln(a, b, c) end. можна відбити такою таблицею:

Виконувані дії

a

b

c

   

a:=1; b:=5; c:=3

1

5

2

   

Виклик ps

ps.b

   

ps.a

ps.t

Неявне ps.a:=b

1

5

2

5

?

ps.t:=ps.a+ps.b

1

5

2

5

6

ps.b:=ps.t-ps.b

5

5

2

5

6

ps.a:=ps.t-ps.b

5

5

2

1

6

c:=ps.t

5

5

6

1

6

writeln(a, b, c)

5

5

6

   

Перейти на сторінку номер:
 1  2  3  4  5 


Інші реферати на тему «Інформатика»: