4) варіантна частина:
case -> <ідентифікатор> -> of -> <альтернатива> -> ;
5) дискриминант:
<ідентифікатор>-> : -> <ідентифік. типа>
6) альтернатива:
<константа> -> : -> <список полів> ->
4. Множини
Цей тип даних використовують не так часто (одна з причин – низька швидкість виконання операції з множинами). Однак у ряді випадків його використання надає компактність і наочність програм.
Під множиною в ТР розуміють неупорядковану сукупність елементів, як це прийнято в математиці. Елементами множини можуть бути тільки змінні простих типів – скалярного та обмеженого.
Наприклад, цифри та символи латинського алфавіту:
[1, 3, 5, 7, 9,] – множинанепарних чисел;
[‘A’, ’X’] – множина елементів типу char;
[ ] – порожня множина.
1) Type
в 2-х розділах;
var
2) var– в 1-му розділі.
Для опису використовують таку форму:
<ім’я змінної множини> : SETOF <тип елементів> ;
Приклад 1:
Var
M1 : SET OF ‘A’ .. ’Z’;
M2 : SETOF 1 .. 2;
В опису можна вказуватине тільки границі значень, а також їх перелік:
Приклад2:
M3 : SET OF ‘A’ , ’R’ , ’C’;
Для присвоювання імені множини змінних значень використовують конструкцію вида:
<ім’я змінної множини> := <список>;
Приклад3:
M1 := [‘A’ , ‘B’ , ‘K’] ;
M2 := [2 , 3] ;
тобто змінна М1 приймає значення множини із елементів ‘A’,’B’,’K’, змінна M2 – із елементів 2 і 3.
По суті конструктор є перетворювач змінних простого типу у тип множини.
Над множинами виконують теоретико-множинні операції та операції відношень.
Теоретико-множинні операції:
1) поєднання “+”;
2) перетин “*”;
3) різниця “-”.
Операції відношень:
1) належність елемента множині;
2) рівність, нерівність;
3) належність множини множині.
Приклади:
1) поєднання “+”;
А+В АВ
A := [‘A’ , ‘B’];
B := [‘A’ , ‘K’];
A := A+B
{A = [‘A’ , ‘B’ , ‘K’]}
2) перетин: “*”
A*B B
A := [‘A’ , ‘B’];
B := [‘A’ , ‘K’];
S := A*B {S=[‘A’]}
3) різниця – формується множина з елементів першої множини, які не входять в другу множину
R := A-B {R=[‘B’]}
A-B (A/B)
Пріоритет виконання операцій:
() Þ* Þ + Þ-
4) належність елемента множині – призначається службовим словом IN:
<значення> in <множина>
результат: TRUE- значення входить до множини;
FALSE- не входить.
Приклад:
2 in [1 … 10, 12] {TRUE}
5 in [1, 2 ,7, 10] {FALSE}
Цю операцію використовують для спрощення перевірок.ї
Наприклад:
if (ch = ‘a’) or (ch = ‘b’) or (ch = ‘k’) or (ch = ‘y’) then S , абоінакше
if ch in [‘a’,’b’,’x’,’y’] then S
5) перевірка на рівність, нерівність:
“=” – рівність 2-х множин;
“<>” – нерівність 2-х множин;
6) належність множин:
“<=” – перевірка належності множини лівого операнда правому;
“=>” - перевірка належності множини правого операнда лівому;
результат операції є :
TRUEабо FALSE.
Приклади:
Нехай задані множини
M : setof 1 .. 10;
L : set of ‘A’ .. ‘D’;
і виконані оператори присвоювання
M := [2, 3, 4, 6];
L := [‘A’, ‘B’];
тоді
3 inM{true}
[2, 4] <= M{true}
[ ] = L{false}
[‘A’] <> L{true}
‘E’ in L{false}
([4] <= M) and (L =B) {false}
Bin (M + [7, 8]){false}
Особливість введення та виведення множини
Ввести та вивести множини за допомогою операторів readта writeне можливо. Тому існують спеціальні прийоми вводу і виводу окремих елементів множини.
1) Послідовне введення елементів множини. Можна виконати за допомогою циклічного оператора з перед умовою. Для фіксації кінця вводу елементи порівнюються із втраченою константою. Коли вони співпадають, ввід закінчується. Внутрішнім оператором циклу є конструктор, який формує множину.
Нехай ознакою закінченням буде крапка ‘.’.
MN := [ ]; {конструктор порожня множина}
M := ‘ ‘; {можна присвоювати будь-який символ}
While M <> ‘ . ‘ do
Begin
Writeln (“ввести елемент множини”);
Read (M);
MN := MN + [M];
End.
2) вивід елементів множини можна виконувати шляхом перевірки наявності елемента в множині і його виводу, якщо він міститься в множині. Нехай елемента множини
ZZ : setof 1 .. 30;
Потрібно вивести на екран, тоді фрагмент циклічного перебору має вигляд:
For i := 1 to 30 do
If i in ZZ then Writeln ( i );
5. Загальні відомості про процедури та функції
В практиці програмування часто зустрічаються випадки, коли при виконанні програми треба проводити однакові обчислення при різних початкових даних. Для виключення повторень і спрощення програми ці обчислення можна виділити в самостійну частину програми, яка може використовуватись багаторазово. Така автономна частка програми (яка реалізує визначений алгоритм і припускає звертання до неї із різних часток загальної програми) називається підпрограмою.
Розміщення підпрограм у програмі схоже з ієрархічним принципом побудови файлової системи.
Позитивні сторони використання підпрограм:
1) реалізується метод структурного програмування (модульна побудова);
2) економія пам’яті (яка виділяється для зберігання змінних підпрограми тільки під час роботи підпрограми);
3) імена змінних в основній програмі і підпрограми незалежні (потр. змінна А програми і підпрограми можуть мати різні фізичні значення);
4) самостійний характер підпрограм дозволяє їм створення різними користувачами, що прискорює процес програмування.
В мові Паскаль виділяють два видм підпрограм:
- процедура (PROCEDURE);
- функція (FUNCTION).
Принципи побудови Паскаль програми, процедури і функції ідентичні і відрізняються тільки заголовками.
Форми заголовків:
Program <ім’я> (список параметрів)
Procedure <ім’я> (список параметрів)
Function <ім’я> (список параметрів)
Блоки можуть бути не доложеними або вкладенеми один в одного. Відповідно вони носять назву зовнішнього або внутрішнього (рис.1).
Розглянемо принцип блочної побудови програми на рис.2.
Рис. 2.
Із рис.2 видно, що процедури і функції розміщуються в останньому розділі блоку опису програми. Таких процедур і функцій може бути декілька і розміщуються вони в довільному порядку. В свою чергу, в їх розділах опису можна розміщувати процедури і функції 2-го рівня і т.д.. Наприкінці процедури і функції після endстоїть “ ; ”.
В зв’язку з тим, що кожна процедура або функція може містити свій розділ опису, виникає так звана проблема локалізації імен змінних.
Змінні і константи можна описувати у зовнішніх або внутрішніх блоках. Тому виникає два поняття змінних і констант: локальні і глобальні.
Локальні – існують у рамках того блока, де вони описані. Тобто за межами даного блока їх використовувати не можливо.
Глобальні – описані у зовнішньому блоці але використовують у внутрішньому блоці.
Наявність локальних і глобальних змінних дозволяє при творені складних програм використовувати одні і ті ж імена в різних блоках, що полегшує взаємодію програмістів. З іншого боку, можлива поява негативних побічних явищ, тому треба коректно створювати програми і придержуватись правил локалізації змінних.
Правила локалізації змінних:
1) змінна (константа) існує в рамках того блока де вона описана;
2) кожна змінна в межах блока повинна бути описана тільки один раз;
3) якщо у внутрішньому блоці використовується змінна, яка описана у зовнішніх блоках, то діє тільки опис самого внутрішнього блоку (найблищого);
4) якщо змінна описана як у внутрішньому так і у зовнішньому блоках, то при переході до внутрішнього блока опис зовнішнього блока не використовується, тобто діє опис внутрішнього блоку.
При переході до зовнішнього блока знову починається дія опису зовнішнього блока.
В мові Паскаль існує два типа процедур і функцій:
- з параметрами;
- без параметрів.
Вони відрізняються способом їх вмикання в основну програму.
6. Процедури з параметрами
Для успішної побудови блочних програм необхідно оволодіти двома методиками:
- розробки побудови процедури;
- використання процедури в програмі або в іншій процедурі.
a. Методика розробки процедури.
Як було сказано, процедура складається із заголовка і блока. Блок будується стандартно і не відрізняється від блока програми за винятком того, що наприкінці процедури ставиться крапка з комою.
Розглянемо заголовок (рис.1). ім’я вибирають довільно. Параметри, які містяться у списку параметрів, носять назву формальних – т.б. вони не приймають ніяких значень, а тільки позначають місця, на які далі будуть поставлені так звані фактичні параметри.
Параметри позначають початкові дані (аргументи) і результати виконання процедури.
Список параметрів складається із окремих секцій, які відокремлюють крапкою з комою ( ; ).
В секції вказується перелік (список) параметрів і через двокрапку їх тип. Наприклад:
Procedure R(x, y : real; k : integer; var s : real);
Тут параметри xіy вказують першу секцію, k – другу, s – третю. Розміщення секцій параметрів в них довільне. В даному прикладі x, y, k– параметри значення; s– оператор-змінна, перед яким повинно стояти службове слово var.
Особливості цих параметрів ми розглянемо далі, а поки будемо вважати , що параметри-значення – аргументи функції, а параметри-змінні – результати виконання процедури.