3 до 0 або від 'D' до 'A'.
3. Означення власних перелічуваних типів
Мова Паскаль має засоби означення власних типів, необхідних у створенні реальних програм.
Носій типу, тобто множина його елементів, задається в означенні імені типу. Загальний вигляд означення такий:
type ім'я = вираз, що описує елементи множини;
Службове слово type – це англійське "тип". З виразами, що задають множини елементів, ми будемо знайомитися поступово.
Найпростіший вираз – це ім'я типу, уже означене вище або ім'я стандартного типу. Наприклад, означення
type int = integer;
задає нове іменування типу integer. Після цього означення скрізь замість довгого імені integer можна писати коротке int.
Вирази, що задають множини елементів, можна записувати як в означенні імені типу, так і на місці імені типу в означеннях змінних. Приклади наведемо трохи нижче.
Мова Паскаль дозволяє програмісту означати свої власні перелічувані типи. Вони називаються типами-переліками та типами-діапазонами. Переліки наочно подають множини таких значень, що природно позначаються словами. Наприклад, сигнали світлофора або дні тижня.
Множину днів тижня, позначену {Пн, Вт, Ср, Чт, Пт, Сб, Нд} у мові Паскаль можна задати, означивши тип-перелік з ім'ям, наприклад, Weekd:
type Weekd=(Mon, Tue, Wed, Thu, Fri, Sat, Sun).
Тут ужито скорочення від англійських слів Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday – понеділок, вівторок тощо до неділі.
Аналогічно сигнали світлофора можна задати, определив тип Lights:
type Lights=(red, yellow, green) {червоний, жовтий, зелений}
Як бачимо, перелік задається виразом вигляду
( список ідентифікаторів )
Ідентифікатори списку після цього означення виступають сталими відповідного типу. Сталі не можуть повторюватися в означеннях того самого блока. Наприклад, якщо разом із типом сигналів світлофора означити ще тип кольорів райдуги, то використовувати імена red, yellow, green не можна.
Порядок сталих у списку задає операції ord, pred і succ, означені для всякого переліку. Наприклад, ord(Mon)=0, ord(Tue)=1 тощо, ord(Sun)=6, succ(Mon)=Tue, pred(Sat)=Fri. У відповідності зі значеннями ord означено й порівняння, наприклад, red<yellow, Mon<Sun.
Вираз із сталими перелічуваних типів можна присвоювати однотипним із ними змінним.
Сталі й змінні перелічуваних типів, на відміну від базових типів, не можна вказувати у викликах процедур виведення та введення.
Будь-який перелічуваний тип, стандартний або тип-перелік, означений вище в програмі, може виступати базовим для типу-діапазону. Він задається виразом вигляду
стала1..стала2,
де стала1 <= стала2. Наприклад, ми можемо означити типи
type hundred=0..99; chesslet='A'..'H'; Workd=Mon..Fri
або змінні var stop : red..yellow; column : chesslet тощо.
Для діапазону означено ті самі операції, що для його базового типу.
Задачі
7. У розкладі рейсів літаків дні тижня позначаються номерами від 1 до 7. Припустимо, що в програмі дні тижня подаються типом Weekd. Написати вираз, що задає обчислення:
а) за номером дня тижня відповідного елемента типу Weekd;
б) за елементом типу Weekd номера дня тижня.
8. За понеділком іде вівторок тощо, а за неділею – понеділок. Написати функцію обчислення за днем тижня (типу Weekd) наступного за ним дня.
4. Оператор вибору варіантів
Повернемося до програми "найпростіший калькулятор" із прикладу 5.3. Там використовувалася змінна signop із значеннями 1, 2, 3 або 4, що позначали знаки операцій відповідно "+", "-", "*", "/". Її значення, отримане в результаті читання, порівнювалося з 1, 2, 3, 4 та виконувалися відповідні їм дії:
if signop=1 then first:=first+second else
if signop=2 then first:=first-second else
if signop=3 then first:=first*second else
{signop=4}
first:=first/second;
Цей оператор задає вибір потрібного оператора з тих, які записано після слів then, залежно від значення змінної signop. Такий вибір у мові Паскаль можна задати інакше, використавши оператор вибору варіантів, або case-оператор (case – англійське "випадок"). У даній програмі він має вигляд:
case signop of
1: first:=first+second;
2: first:=first-second;
3: first:=first*second;
4: first:=first/second
end;
Вираз після слова case (тут це ім'я signop) називається селектором варіантів. Його значення послідовно порівнюється з числами, що "відмічають" оператори-варіанти. Як тільки значення селектора співпаде з числом, буде виконано відповідний оператор, і все закінчиться. Якщо ж значення селектора відрізняється від усіх чисел-відміток варіантів, то жодний із варіантів не виконується.
Селектором може бути довільний вираз будь-якого перелічуваного типу. Варіант може бути відмічений списком із кількох сталих відповідного типу; вони записуються через кому. Наприклад, нехай робочий час у робочі дні 8 годин, а у вихідні – 0. За дії означення типу Weekd ми можемо запам'ятати в змінній wt робочий час:
var dd : Weekd; wt : integer;
…
case dd of
Mon, Tue, Wed,Thu, Fri : wt:=8;
Sat, Sun : wt := 0
end.
Значення селектора порівнюється з усіма значеннями в черговому списку, і варіант виконується, якщо воно дорівнює одному зі значень списку. Множини значень у списках можуть перетинатися – буде виконано той варіант, у списку якого вперше знайдене значення селектора.
У мові Турбо Паскаль у списках, що відзначають варіанти, можна записувати не тільки сталі, але й діапазони. Наприклад, останній оператор можна переписати так:
case dd of
Mon .. Thu, Fri: wt:=8;
Sat, Sun: wt:=0
end.
За останнім варіантом можна після слова else указати необов'язковий альтернативний варіант. Цей варіант виконується, якщо значення селектора немає в жодному зі списків. Наприклад, останній оператор можна переписати в такому вигляді:
case dd of
Mon .. Fri: wt:=8;
Sun: wt:=0
else wt:=0
end.
Задачі
9. З використанням case-оператора написати підпрограму друкування дня тижня, заданого значенням типу Weekd (див. підр.6.3)
10.* Переписати "найпростіший калькулятор" (приклад 5.4) із використанням case-оператора і читанням знаків операцій у вигляді символів.
11.* Написати процедуру обчислення за цілим N>3 таких натуральних A і B, що 5A+2B=N, причому A+B мінімально.
12. У давньояпонському календарі був прийнятий 60-річний цикл із п'яти 12-річних підциклів, послідовно позначених кольорами – зеленим, червоним, жовтим, білим та чорним. У кожному