Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

19. Безлічі й перечислимые типи

Матеріал цієї й наступних глав підручника є почасти "факультативним", він може виходити за межі, передбачені " програмою-мінімум" вивчення основ програмування, однак, для тих, хто збирається програмувати всерйоз, ретельне вивчення цих глав буде досить корисним.

Безлічіявляють собою заздалегідь задані програмістом набори можливих значень змінної. Застосування безлічей дозволяє зручно звертатися з даними, що мають фіксований набір можливих значень, а також полегшує перевірку того, чи попадають значення в потрібний діапазон.

Для оголошення безлічі досить записати оператор

Set of тип;

де тип– один з певних програмістом або предустановленных типів даних:

Type Charset: set of Char;

Var Symbols: Charset;

Всупереч цьому прикладу, стандартні типи даних мало застосовні для безлічей – адже вихідний тип набору повинен бути порядковим(див. розділ 2.3) і не мати більш, ніж 256 різних значень із нижньою й верхньою межею від 0 до 255 відповідно. Це пов'язане з тим, що для зберігання кількості елементів безлічі виділяється тільки один байт оперативної пам'яті. Приведемо інший приклад для безлічі:

type Charset= set of char;

var symbols:Charset;

c1:Char;

begin

symbols:=['A'..'Z','a'..'z'];

write ('Put one symbol:');

readln (c1);

if c1 in symbols then writeln ('OK')

else writeln ('Error');

end.

Із прикладу видне, що змінним типу безлічі можна привласнювати список діапазонів відповідного типу (ми вже знайомилися з діапазонами в розділі 7.8). Надалі змінна типу безлічі може бути використана для контролю правильності вхідних даних за допомогою оператора in:

if c1 in symbols then writeln ('OK')

Ліворуч від оператора inможе бути зазначене вирази будь-якого перечислимого типуT, а праворуч – набір з типом, сумісним з типомT.

Будь-які сумісні по типах даних безлічі можна поєднувати операцій "+", віднімати операцією "-" і перетинати операцією "*". При цьому результати операцій з безлічами відповідають правилам логіки безлічей:

  • порядкове значення Cперебуває в безлічіA+Bтільки в тому випадку, якщоCперебуває вAабоB;

  • порядкове значення Cперебуває в безлічіA-Bтільки в тому випадку, якщоCперебуває вAі не перебуває вB;

  • порядкове значення Cперебуває в безлічіA*Bтільки в тому випадку, якщоCперебуває й вA, і вB.

Якщо саме маленьке порядкове значення, що є елементом результату операції з безліччю позначити A, а найбільше - заB, то тип результату стає рівнимA..B.

У наступному прикладі безліч латинських букв виходить операцією додавання підмножин латинських більших і латинських малих букв.

Type Latin = Set Of 'A'..'z';

Const Smalllatin : Latin = ['A'..'Z'];

Biglatin : Latin = ['a'..'z'];

Var Latinletters : Latin;

c:char;

begin

Latinletters := Biglatin + Smalllatin;

repeat

write ('Уведіть символ або пробіл для виходу:');

reset (input);

readln (c);

if c in Latinletters then writeln (c,' - латинська буква');

until c=' ';

end.

Як у прикладі вище, корисно буває створювати з безлічей підмножинипри вказівціконструкторавирази, що містить, діапазонів уквадратних дужках […]:

Type Digits = Set Of 0..9; {Безліч цифр}

Letters = Set Of 'A'..'Z'; {Безліч латинських букв}

Const Evendigits : Digits = [0, 2, 4, 6, 8];

{Підмножина парних цифр}

Vowels : Letters = ['A', 'E', 'I', 'O', 'U', 'Y'];

{Підмножина голосних букв}

Hexdigits : Set Of '0'..'z' = ['0'..'9', 'A'..'F',

'a'..'f']; {Символи 16-ричных чисел}

Type Shortweekdays = (Pn,Vt,Sr,Ch,Pt,Sb,Vs);

{Перечислимый тип "дні тижня"}

Const Holidays : Set of Shortweekdays = [Sb, Vs];

{Підмножина "Вихідні" днів тижня}

Var wd:Shortweekdays; {Змінна типу "Дні тижня"}

i:integer;

begin

wd:=Pn;

for i:=1 to 7 do begin

if wd in Holidays then writeln (Ord(wd), ' - Вихідний день')

else writeln (Ord(wd), ' - Будній день');

Inc(wd);

end;

end.

Тип даних Shortweekdaysу цьому прикладі єперечислимымтипом. Перечислимые типи визначають упорядковані набори значень, перераховуючи ідентифікатори, які позначають ці значення. Їхній порядок випливає з послідовності, у якій вони були перераховані. Оператор перерахування має загальний вигляд

Type ім'я = (ідентифікатор, ідентифікатор,..., ідентифікатор);

Можливі значення перерахування, задані оператором Type, повинні бути ідентифікаторами Паскаля, тому назвати дні тижня по-російському в останньому описіTypeбуло б неможливо.

Ідентифікатори, зазначені у визначенні типу, стають константами перечислимого типу, перша константа має порядковий номер 0, друга – номер 1, і так далі:

Type Suit = (Club, Diamond, Heart, Spade);

При цьому оголошенні Heartє константою типуSuit. Стандартна функціяOrdповертає порядковий номер перечислимой константи, у нашім прикладі

Ord(Club) = 0

Ord(Diamond) = 1

Ord(Heart) = 2

Як показано в лістингу, змінним перечислимого типу можна привласнювати константи, що входять в опис типу й збільшувати їхні значення як будь-які порядкові числа оператором Inc(wd), але ці значення не можна читати або записувати "прямо" операторами сімействаRead/Write. У якості альтернативи їх можна приводити до целочисленным значенням стандартною функцієюOrd, при цьому завжди перша константа списку має значення0(у нашім випадку – константаPn). Операторinу лістингу дозволяє перевірити, чи попадає величина в підмножину, створене для елементів вихідного типу безлічі. Таким чином, основне призначення безлічей і перечислимых типів – зручний для людини запис виразів із "зрозумілими" назвами констант замість чисел. З погляду компілятора дані типу безлічі й перерахування є целочисленными величинами.

Для обмеження діапазону вихідних даних можна також безпосередньо оголосити тип-діапазон:

Type Hour=0..23; Minute=0..59;

Тут оголошені змінні типів “година“ і “хвилина“, для змінних цих типів будуть перевірятися обмеження на влучення в зазначені при описі діапазони значень. Якщо змінної типу-діапазону привласнене неприпустиме значення, програма відреагує на це повідомленням “Constant out of range”.