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

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

ГоловнаІнформатика, Компютерні науки → ПАСКАЛЬ: область дії, модулі, структури - Реферат

ПАСКАЛЬ: область дії, модулі, структури - Реферат

… end;
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
Суміщення імен a і ps.b в одній колонці вказує, що цим іменам зіставлена та сама ділянка пам'яті. У результаті виконання буде надруковано 5 5 6.
Задачі
1.* Укажіть помилкове використання імен у програмі:
program AB(input, output);
function A : integer;
function B : integer;
function A : integer;
begin A:=1 end
begin A := 2; B := A end;
begin A := 3 end;
begin writeln(A); writeln(B) end.
2. Імітувати виконання програми:
program (input, output);
var a, b : integer;
procedure badswap(var a : integer; t : integer);
var d : integer;
begin
d := t; t := a; a := d
end;
begin
a := 1; b := 3;
badswap(a, b);
writeln(a, b)
end.
3.* Написати програму, за допомогою якої можна встановити, чи завжди обчислюються праві операнди бульових операцій and і or.
4.* Дописати необхідні означення до тіла програми, щоб при її виконанні було надруковано не "0", а "1":
begin
writeln(b*c-c*b)
end.
2. Модуль - збірник означень
Повернемося до задач 3.19-3.22. У програмах для їх розв'язання використовуються ті самі підпрограми обчислення коефіцієнтів рівняння прямої та перевірки, чи лежать точки по один бік прямої. Ці спільні підпрограми, а також інші означення, можна вилучити з програм і зібрати в спеціальному "збірнику означень". Цьому збірнику можна дати ім'я і вказувати його в програмах замість вилучених означень, помітно скорочуючи текст програм. Стандарт мови Паскаль, правда, такої можливості не дає, але всі системи програмування її забезпечують. Збірник означень називається модулем; конкретний його синтаксис залежить від системи програмування. Розглянемо модулі на прикладі діалекту Турбо Паскаль.
Приклад 7.3. Напишемо модуль з означеннями імен normcoef і oneside - імен підпрограм обчислення коефіцієнтів нормалізованого рівняння та перевірки, чи лежать дві точки по один бік прямої (див. відповідь до задачі 3.19).
Модуль має загальний вигляд:
Unit ім'я-модуля;
Інтерфейсний розділ;
Розділ реалізації;
Розділ ініціалізації
end.
Інтерфейсний розділ починається службовим словом Interface і містить означення імен, призначених для використання за межами модуля. Проте замість підпрограм тут записуються тільки їх заголовки. У нашому прикладі цей розділ виглядає так:
Interface
procedure normcoef(x1, y1, x2, y2 : real; var a, b, c : real);
function oneside(x1, y1, x2, y2, a, b, c : real) : boolean;
Слово "інтерфейс" перекочувало з англійської. Одне з його значень - точка з'єднання, взаємодії різноманітних систем. Інше - спосіб сприйняття і виразу даних, заданий програмою. Інтерфейс програми можна розуміти як "зовнішній вигляд її виконання". Відповідно інтерфейс модуля - це "те, що в ньому видно ззовні". У даному прикладі це заголовки двох підпрограм.
Розділ реалізації починається службовим словом Implementation і містить підпрограми, вказані в інтерфейсному розділі, але зі скороченими заголовками - за словом function або procedure записується тільки ім'я. У нашому випадку вигляд цього розділу такий:
Implementation {"втілення", "реалізація"}
procedure normcoef;
Loading...

 
 

Цікаве