русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2014-11-28; переглядів: 921.


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

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

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

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”.

 


<== попередня лекція | наступна лекція ==>
Відкриті масиви | Робота із символами


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн