Структуровані типи даних. Типи, що перераховуються Який тип даних мають перерахування

Чиє безліч значень є обмеженим списком ідентифікаторів.

Енциклопедичний YouTube

  • 1 / 5

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

    type Cardsuit = (clubs, diamonds, hearts, spades);

    Тут проводиться оголошення типу даних Cardsuit (карткова масть), значеннями якого може бути будь-яка з чотирьох перерахованих констант. Змінна типу Cardsuit може приймати одне з значень clubs, diamonds, hearts, spades , допускається порівняння значень типу перерахування на рівність чи нерівність, і навіть використання в операторах вибору (у Паскалі - case) як значень, ідентифікують варіанти.

    Використання перерахувань дозволяє зробити вихідні коди програм більш читаними, так як дозволяють замінити «магічні числа», що кодують певні значення, на імена, що читаються.

    На базі перерахувань в деяких мовах можуть створюватися типи-множини. У разі безліч розуміється (і описується) як невпорядкований набір унікальних значень типу-перечисления.

    Тип, що перераховується, може використовуватися в оголошеннях змінних і формальних параметрівфункцій (процедур, методів). Значення перерахованого типу можуть надаватися відповідним змінним і передаватися через параметри відповідних типів функції. Крім того, завжди підтримується порівняння значень перерахованого типу на рівність та нерівність. Деякі мови підтримують інші операції порівняння для значень перерахованих типів. Результат порівняння двох перерахованих значень у разі визначається, зазвичай, порядком слідування цих значень в оголошенні типів - значення, що у оголошенні типу зустрічається раніше, вважається «менше» значення, що зустрічається пізніше. Іноді перерахований тип або деякий діапазон значень перерахованого типу також може бути використаний як тип індексу для масиву. У цьому випадку для кожного значення вибраного діапазону в масиві є один елемент, а реальний порядок проходження елементів відповідає порядку проходження значень в оголошенні типу.

    Реалізація

    Зазвичай у процесі компіляції значення перерахувань представляються з допомогою цілих чисел. Залежно від конкретної мови програмування таке уявлення може бути або повністю приховано від програміста, або доступне йому за допомогою тих чи інших «обхідних маневрів» (наприклад, примусового перетворення значення типу перерахування до значення типу «ціле число»), або навіть кероване програмістом ( у таких випадках програміст має можливість явно вказати, якими числами кодуватимуться всі або деякі значення типу-перерахування). У всіх варіантів є свої позитивні та негативні сторони. З одного боку, можливість використання числових значень констант, що становлять тип-перерахування, особливо при зловживанні нею, позбавляє сенс використання цих типів і створює небезпеку появи помилок (коли використовуються числові значення, для яких в типі немає відповідних констант). З іншого боку, явне управління значеннями дає деякі додаткові можливості. Наприклад, дозволяє використовувати типи-перерахування при організації інтерфейсу з модулями, написаними іншими мовами, якщо вони використовують або повертають кодовані цілими числами значення деякого визначеного набору.

    Ще одна можливість, яку дають типи на рівні реалізації мови - економія пам'яті. При невеликому обсязі типу-перерахування для зберігання значення цього типу досить кількох бітів (наведений вище Cardsuit вимагає всього два біти на значення, у той час як стандартне ціле число на більшості використовуваних архітектур займає 32 біти - в 16 разів більше), і компілятор може використовувати цей факт для ущільнення зберігання даних у пам'яті. Це може бути особливо важливо, якщо кілька значень типів-перерахувань зберігаються в одному записі - ущільнення записів при обробці їх великої кількості може звільнити багато пам'яті. Правда, необхідно відзначити, що компілятори зазвичай не реалізують цю можливість, принаймні, Останнім часом, коли комп'ютерна пам'ять суттєво подешевшала

    Критика

    Тип перерахування є традиційним для розвинених мов програмування, використовується досить широко і часто сприймається як щось зрозуміле. Проте цей тип також не обходиться без критики з боку теоретиків та практиків програмування. Так, при розробці мови програмування Оберон перераховані типи потрапили до списку можливостей, видалених з мови. Ніклаус Вірт, розробник мови, назвав такі причини:

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

    Опис перерахувань у різних мовах

    Enum cardsuit (CLUBS, DIAMONDS, HEARTS, SPADES);

    Динамічні мови слабкої типізації з C-подібним синтаксисом (наприклад, perl або JavaScript), як правило, не мають перерахувань.

    У мові Паскальзмінні характеризуються своїм типом. Тип - це властивість зміною, яким змінна може приймати безліч значень, допустимих цим типом, і брати участь у безлічі операцій, допустимих над даним типом.

    Тип визначає безліч допустимих значень, які приймає змінна даного типу. Визначає так само безліч допустимих операцій від змінної даного типу та визначає подання даних у оперативної пам'ятікомп'ютера.

    Наприклад:

    n:integer;

    Паскаль - статичний мову, з цього випливає, що тип зміною визначається за її опису і може бути змінено. Мова Паскаль має розвинену систему видів - всі дані повинні належати наперед відомому типу даних (або стандартному типу, створеному при розробці мови або типу користувача, який визначає програміст). Програміст може створювати свої типи довільною структурою складності на основі стандартних типів або вже визначених користувачем типів. Кількість створюваних типів необмежена. Типи користувача в програмі оголошуються в розділі TYPE за форматом:

    [ім'я] = [тип]

    Система стандартних типів має розгалужену, ієрархічну структуру.

    Первинними в ієрархії є прості типи. Такі типи є у більшості мов програмування і називаються простими, однак у мові Паскаль вони мають складнішу структуру.

    Структуровані типибудуються за певними правилами із найпростіших типів.

    Вказівникиформуються з простих видівта використовуються у програмах для завдання адрес.

    Процедурні типиє нововведенням мови Turbo Pascal, і вони дозволяють звертатися до підпрограм, як змінних.

    Об'єктиє також нововведенням, і вони призначені для використання мови як об'єктно-орієнтованої мови.

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

    З використанням цілих чисел слід керуватися вкладеністю типів, тобто. типи з меншим діапазоном можуть бути вкладені у типи з більшим діапазоном. Тип Byte може бути вкладений у всі типи, що займають 2 і 4 байти. У той же час тип Short Int, що займає 1 байт, не може бути вкладений у тип Word, оскільки не має негативних значень.

    Можна виділити 5 речових типів:

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

    2358.8395

    0.23588395*10 4

    0.23588395*E 4

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

    Порядкові типи

    Порядкові типи поєднують у собі кілька простих типів. До них відносяться:

    • всі цілі типи;
    • символьний тип;
    • логічний тип;
    • тип-діапазон;
    • тип, що перераховується.

    Загальними ознаками для порядкових типів є: кожен із типів має кінцеве число можливих значень; значення цих типів можна певним чином упорядкувати і з кожним числом зіставити деяке число, яке є порядковим номером; Сусідні значення порядкових типів відрізняється на одиницю.

    До значень порядкового типу може бути використана функція ODD(x), яка повертає порядковий номер аргументу x.

    Функція PRED(x) – повертає попереднє значення порядкового типу. PRED(A) = 5.

    Функція SUCC (x) – повертає наступне значення порядкового типу. SUCC(A) = 5.

    Символьний тип

    Значення символьного типу є 256 символів з безлічі допустимих кодовою таблицею використовуваного комп'ютера. Початкова область цієї множини, тобто діапазон від 0 до 127, відповідає безлічі кодів ASCII, куди завантажуються символи алфавіту, арабських чисел і спеціальних символів. Символи початкової області завжди є на клавіатурі ПК. Старша область називається альтернативною, вона містить символи національних алфавітів і різні спеціальні символи та символи псевдографіки, що не відповідають коду ASCII.

    Значення символьного типу займає один байт оперативної пам'яті. У програмі значення полягають у апострофи. Також значення можна ставити як його ASCII-коде. У цьому випадку перед числом, що має код символу, потрібно поставити знак #.

    C:= 'A'

    Логічний (булівський) тип

    Є два значення булевського типу: Істина (True) та Брехня (False). Змінні цього типу задаються службовим словом BOOLEAN. Значення булевського типу займають один байт у оперативній пам'яті. Значенням Істина та Брехня відповідають числові значення 1 і 0.

    Тип-діапазон

    Є підмножина свого базового типу як, якого може виступати будь-який порядковий тип. Тип-діапазон визначається межами всередині базового типу.

    [мінімальне значення]…[максимальне значення]

    Тип-діапазон можна задавати у розділі Type як певний тип, а можна безпосередньо у розділі Var.

    При визначенні тип-діапазону необхідно керуватися:

    • ліва межа не повинна перевищувати правий кордон;
    • Тип-діапазон успадковує всі властивості базового типу, але з обмеженнями, пов'язаними з його меншою потужністю.

    Перерахований тип

    Даний тип відноситься до порядкових типів і визначається перерахуванням тих значень, яких він може перераховувати. Кожне значення називається певним ідентифікатором і міститься у списку обрамленим у круглих дужках. Тип, що перераховується, задається в Type:

    Peoples = (men, women);

    Перше значення – 0, друге значення – 1 і т.д.

    Максимальна потужність 65 535 значень.

    Строковий тип

    Рядковий тип відноситься до групи структурованих типів і складається з базового типу Char. Рядковий тип не відноситься до порядкових типів. Він визначає безліч символьних ланцюжків довільної довжини до 255 символів.

    У програмі рядковий тип оголошується словом String. Оскільки String є базовим типом, він описаний у мові та оголошення змінної типу String здійснюється у Var. При оголошенні змінної рядкового типу за String у квадратних дужках доцільно вказувати довжину рядка. Для вказівки використається ціле число від 0 до 255.

    Fam: String;

    Вказівка ​​довжини рядка дозволяє компілятору відвести під цю змінну вказану кількість байтів у ОЗУ. Якщо довжина рядка не вказана, то у цьому випадку компілятор відведе під значення цієї змінної максимальне можливе число байт (255).

    У стандарті C++ немає типу даних, який можна було б вважати справді символьним. Для представлення символьної інформації є два типи даних, придатних цієї мети, – це типи char і wchar_t .

    Змінна типу char розрахована для зберігання лише одного символу (наприклад, літери або пробілу). У пам'яті комп'ютера символи зберігаються як цілих чисел. Відповідність між символами та їх кодами визначається таблицею кодування, яка залежить від комп'ютера та операційної системи. Майже у всіх таблицях кодуванняє великі та малі літери латинського алфавіту, цифри 0, ..., 9, і деякі спеціальні символи. Найпоширенішою таблицею кодуванняє таблиця символів ASCII ( American Standard Code for Information Interchange- Американський стандартний коддля обміну інформацією).

    Оскільки в пам'яті комп'ютера символи зберігаються як цілих чисел, то тип char насправді є підмножиною типу int .

    Під величину символьного типу відводиться 1 байт.

    Тип char може використовуватися з специфікаторами signedі unsigned. У даних типу signed charможна зберігати значення в діапазоні від -128 до 127. При використанні типу unsigned charзначення можуть бути в діапазоні від 0 до 255. Для кодування використовується код ASCII . Символи з кодами від 0 до 31 відносяться до службових та мають самостійне значення лише в операторах введення-виводу.

    Величини типу char також застосовуються для зберігання чисел із зазначених діапазонів.

    Тип wchar_t призначений для роботи з набором символів, для кодування яких недостатньо 1 байта, наприклад кодування Unicode . Розмір типу wchar_t дорівнює 2 байтам. Якщо програмі необхідно використовувати рядкові константи типу wchar_t , їх записують з префіксом L , наприклад, L " Слово " .

    Наприклад:

    char c="c"; char a, b; char r=("A", "B", "C", "D", "E", "F", "0"); char s = "ABCDEF";

    Логічний (бульовий) тип даних (тип bool)

    У мові С++ використовується двійкова логіка (істина, брехня). Брехні відповідає нульове значення, істині – одиниця. Величини даного типу можуть приймати значення true і false .

    Внутрішня форма представлення значення false відповідає 0 будь-яке інше значення інтерпретується як true . У деяких компіляторах мови С++ немає даного типу, у цьому випадку використовують тип int, який при справжніх значеннях видає 1, а при помилкових – 0. логічного типувідводиться 1 байт.

    Тип, що перераховується (тип enum)

    Цей тип визначається як набір ідентифікаторів, що є звичайними іменованими цілими константами, яким приписані унікальні та зручні для використання позначення. Таким чином, перерахування є упорядкованими наборами цілих значень. Вони мають своєрідний синтаксис та досить специфічну область використання.

    Змінна , яка може набувати значення з деякого списку певних констант, називається змінної типу, що перераховуєтьсяабо перерахуванням. Ця змінна може набувати значення тільки з іменованих константсписку. Іменовані константисписку мають тип int. Отже, пам'ять , відповідна змінної перерахування, – це пам'ять , необхідна розміщення значення типу int .

    Наприклад:

    enum year (winter, spring, summer, autumn); enum week (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);

    Тип void

    Безліч значень цього порожнє. Тип void має три призначення:

    1. вказівку про неповернення функцією значення;
    2. вказівку про неотримання параметрів функцією;
    3. створіння нетипізованих покажчиків.

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

    Основні типи даних
    Тип Позначення Назва Розмір пам'яті, байт (біт) Діапазон значень
    Ім'я типу Інші імена
    цілий int signed цілий 4 (32)
    signed int
    unsigned int unsigned беззнаковий цілий 4 (32) 0 до 4 294 967 295
    short short int короткий цілий 2 (16) -32 768 до 32 767
    signed short int
    unsigned short unsigned short int беззнаковий короткий цілий 2 (16) 0 до 65 535
    long long int довгий цілий 4 (32) -2 147 483 648 до 2 147 483 647
    signed long int
    unsigned long unsigned long int беззнаковий довгий цілий 4 (32) 0 до 4 294 967 295
    long long long long int довгий-довжина цілий 8 (64) -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
    signed long long int
    unsigned long long unsigned long беззнаковий довгий-довжелезний цілий 8 (64) 0 до 18 446 744 073 709 551 615
    long int
    символьний char signed char байт (цілий довжиною не менше 8 біт) 1 (8) -128 До 127
    unsigned char - беззнаковий байт 1 (8) 0 до 255
    wchar_t - розширений символьний 2 (16) 0 до 65 535
    речовий float - речовий одинарної точності 4 (32) 3.4Е-38 до 3.4Е+38 (7 значущих цифр)
    double - речовий подвійний точності 8 (64)
    long double - речовий максимальної точності 8 (64) 1.7Е-308 до 1.7Е+308 (15 значущих цифр)
    bool - логічний 1 (8) true (1) або false (0)
    enum - перерахований 4 (32) -2 147 483 648 до 2 147 483 647

    Перетворення типів

    При обчисленні виразівдеякі операції вимагають, щоб операнди мали відповідний тип, інакше на етапі компіляції видається повідомлення про помилку. Наприклад, операція взяття залишку від розподілу (%) вимагає цілісних операндів. Тому в мові С є можливість приведення значень одного типу до іншого.

    Перетворення типів– це приведення значення змінної одного типу до значення іншого типу.

    Виділяють явнеі неявне приведення типів. При явному наведенні вказується тип змінної , якого необхідно перетворити вихідну змінну. При неявному наведенні перетворення відбувається автоматично, за правилами, закладеним мовою програмування З++.

    Формат операції явного перетвореннятипів:

    ім'я_типу (операнд)

    Наприклад, int(x), float(2/5), long(x+y/0.5).

    Приклад 1.

    //Взяти цифри розряду сотих у дробовому числі #include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv)( float s,t; long int a,b; printf("Введіть дійсне число\n"); scanf("%f", &s); t=s*100; a =(int)t;// змінна t приводиться до типу int в змінну ab=a%10; return 0;

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

    Приклад 2. Тимчасовий інтервал

    Задано моменти початку та кінця деякого проміжку часу в годинах, хвилинах та секундах (у межах однієї доби). Знайти тривалість цього проміжку у тих самих одиницях.

    Вихідними даними для цього завдання є шість цілих величин, що задають моменти початку та кінця інтервалу, результатами – три цілих величини (тип int).

    Позначимо змінні зберігання початку інтервалу hour1 , min1 і sec1 , зберігання кінця інтервалу – hour2 , min2 і sec2 , а результуючі величини – hour, min та sec .

    Для вирішення цього завдання необхідно перетворити обидва моменти часу в секунди, відняти перший з другого, а потім перетворити результат назад у години, хвилини та секунди. Отже, буде потрібна проміжна змінна sum_sec, в якій зберігатиметься величина інтервалу в секундах. Вона може мати дуже великі значення, адже на добу 86400 секунд, що виходить за межі типу short int. Отже, для цієї змінної виберемо довгий цілий тип (long int, скорочено long).

    Для переведення результату з секунд назад у години та хвилини використовується відкидання дробової частини під час поділу цілого числа на ціле.

    //Часовий інтервал. Форматоване введення-виведення даних #include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv)( int hour1, min1, sec1, hour2, min2, sec2, hour, min, sec; long int sum_sec; printf("Введіть час початку інтервалу (година мін сек)\n") ; scanf("%d%d%d", &hour1,&min1,&sec1); printf("Введіть час закінчення інтервалу (год мін сек)\n"); ,&sec2);sum_sec=(hour2-hour1)*3600+(min2-min1)*60+sec2-sec1;hour=sum_sec/3600;min=(sum_sec-hour*3600)/60; 3600-min*60; %d:%d:%d\n",hour,min,sec); system("pause"); return 0; )

    При виконанні математичних операцій провадиться неявне ( автоматичне) перетвореннятипів, щоб привести операнди виразів до загального типу або розширити короткі величини до розміру цілих величин, що використовуються в машинних командах. Виконання перетворення залежить від специфіки операцій та від типу операнда чи операндів.

    1. Перетворення цілих типів зі знаком.

    • Ціле зі знаком перетворюється на більш короткого цілого зі знаком, З втратою інформації: зникають всі розряди числа, що знаходяться вище (або, відповідно – нижче) межі, що визначає максимальний розмір змінної.
    • Ціле зі знаком перетворюється на більш довге ціле зі знаком. Шляхом розмноження знаку. Тобто всі додані біти двійкового числа будуть зайняті тим самим числом, яке знаходилося в знаковому біті: якщо число було позитивним, то це буде відповідно 0, якщо негативним, то 1.
    • Ціле зі знаком до цілого без знаку. Першим кроком ціле зі знаком перетворюється на ціле зі знаком, що відповідає цільовому типу, якщо цей тип даних більший. У значення біт знака не відкидається, а розглядається рівноправним по відношенню до інших біт, тобто тепер всі біти утворюють числове значення.
    • При перетворенні величини з плаваючою точкою до цілих типіввона спочатку перетворюється на тип long (дрібна частина плаваючої величини у своїй відкидається), та був величина типу long перетворюється на необхідному цілому типу. Якщо значення занадто велике для long то результат перетворення не визначений. Зазвичай це означає, що на розсуд компілятора може вийти будь-яке "сміття". У реальній практиці з такими перетвореннями, як правило, стикатися не доводиться.

    На занятті буде пояснено алгоритм створення типів даних користувача Паскаль (Type). Будуть розібрані приклади.

    Типи даних у Pascal поділяються на прості та складні.

    До простих типів відносятьсястандартні, перераховані та обмежені.

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

    Одним із найпоширеніших типів є порядковий стандартний тип.
    Порядковий стандартний типпозначає кінцеве лінійне безліч значень. До нього зазвичай відносять цілі типи, байтові, символьні та логічні.

    Нові (користувацькі) типи данихпотрібні в першу чергу для наочності та зручності:

    Приклад:Задано матрицю розмірністю 10 x 50. Виконати опис матриці, використовуючи тип користувача даних

    procedure p(a: array of Integer);

    Зате слід створити тип данихі записати так:

    1 2 type vector = array [1..10] of integer; var procedure p(a: vector);

    type vector = array of integer; var procedure p(a: vector);

    Приклади опису масивів за допомогою нових типів

    type vector = array of integer; matritsa = array of vector;

  • 1 type matritsa = array [1..8] of array [1..10] of integer;

    тип matritsa = array of array of integer;

  • 1 type matritsa = array [1..8, 1..10] of integer;

    тип matritsa = array of integer;

  • У наступному прикладі змінні cі dописані однаково:

    1 2 3 4 5 6 type vector = array [1..10] of integer; matritsa = array [1..8] of vector; var a, b: vector; c: matritsa; d: array [1..8] of vector;

    type vector = array of integer; matritsa = array of vector; var a, b: vector; c:matritsa; d:array of vector;

    Type 1: Задано масиви а, b та c. Знайти середнє арифметичне мінімальних елементів масиву (використовувати формування масиву та ).
    При описі процедур використовувати типи даних користувача

    Тип і інтервальний тип в Паскаль

    Перерахований тип

    У програмі можна використовувати змінні такого типу, що не співпадає з жодним із стандартних типів.

    Так, тип може задаватися перерахуванням значень при оголошенні; змінна даного типу може набувати будь-яке з цих значень.

    Ці значення не можуть бути рядками, їх не можна вивести на друк і не можна ввести в комп'ютерза допомогою операторів Read та Write.

    Розглянемо приклад створення типу в Паскаль:

    type pt = (word1, word2, ... wordN); var w: pt;

    тип pt = (word1, word2, ... wordN); var w: pt;

  • pt – ідентифікатор типу (довільний),
  • word1 , word2 … — конкретні значення, які може набувати змінна w , що належить типу pt
  • Значення цього типу вважаються впорядкованими, тобто. опис типу одночасно вводить впорядкування word1.
  • Інтервальний тип

    Інтервальний типвизначає конкретне підмножина значень, які може набувати дана змінна. Створюється шляхом завдання найменшого та найбільшого значення порядкового типу. Як констант (мінімального та максимального значень) можуть використовуватись значення будь-яких простих типів крім речових типів.

    Розглянемо приклад оголошення інтервального типу:

    a: min.. max;
  • a– інтервальна змінна
  • min- Нижня межа
  • max- Верхня межа підмножини
  • межі діапазону поділяються двома точками
  • кордон minзавжди має бути менше max
  • константи minі maxповинні належати тому самому типу. Вони визначають базовий тип змінної a.
  • Спільне використання перерахованого та інтервального типів

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

    Приклад:Якщо змінна bможе приймати одне із значень red, yellow, green, цю змінну можна описати так: b: red..green; базовим типом для bє тип color:

    type color = (red, yellow, green, blue); var b: red.. green; begin b: = red; writeln (b); b: = yellow; writeln (b); b: = green; writeln (b); readln end.

    type color=(red,yellow,green,blue); var b:red..green; begin b:=red; writeln(b); b:=yellow; writeln(b); b:=green; writeln(b); readln end.

    В даному прикладітип color є базовим. Змінна b інтервального типу визначена за допомогою базового типу, що перераховується.

    Приклад:Відомо, скільки днів у кожному місяці року. Скільки днів улітку?
    31,28,31,30,31,30,31,31,30,31,30,31

    Один із варіантів вирішення даного завдання виглядає так:

      Показати рішення:

      1 2 3 4 5 6 7 8 const dni: array [1..12] of byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); var s, i: integer; begin s: = 0; for i: = 6 to 8 do s: = s + dni [i]; (літні місяці – 6, 7, 8) writeln (s) end .

      const dni: array of byte = (31,28,31,30,31,30,31,31,30,31,30,31); var s, i: integer; begin s:=0; для i:=6 до 8 до:=s+dni[i]; (літні місяці - 6, 7, 8) writeln(s) end.

      Код цього рішеннямає не найкращу наочність, до того ж доводиться самому обчислювати номери місяців початку і кінця літа (6 і 8).
      Зручність та наочність таких програм можна підвищити так:

      Показати рішення:

      1 2 3 4 5 6 7 8 9 TYPE mes = (січень, квітень, березень, квітень, травень, липень, липень, серпень, september, Жовтень, листопад, грудень) ; CONST dni: array [january. VAR s: Integer; i: mes; (Змінна лічильника циклу i задана типом mes, а не Integer) BEGIN s: = 0; for i: = june to august do s: = s + dni [i]; WriteLn(s) END .

      TYPE mes = (січень, квітень, березень, квітень, травень, липень, липень, серпень, серпень, жовтень, листопад, грудень); CONST dni:array of Byte = (31,28,31,30,31,30,31,31,30,31,30,31); VAR s:Integer; i:mes; (Змінна лічильника циклу i задана типом mes, а не Integer) BEGIN s:=0; for i:=june to august do s:=s+dni[i]; WriteLn(s) END.

    Type 2:Визначити за назвою дня тижня чи вихідний це або робочий день.

  • Визначити перерахований тип зі значеннями днів тижня ( mon, tue, wed, thu, fri, sat, sun).
  • У програмі надати значення змінної (із значень типу, наприклад, mon).
  • Перевіряти змінну: якщо значення субота чи неділя – видавати повідомлення «Вихідний!», інакше «Працюємо!».
  • Type 3:Залежно від місяця року, видавати повідомлення «холодно»- якщо зимовий місяць, і «тепло»- Якщо літній.

  • Визначити тип, що перераховується, зі значеннями назв місяців року.
  • Оголосити змінну, що відноситься до цього типу.
  • У програмі надати значення змінної (із значень типу).
  • Перевіряти змінну: якщо значення відноситься до зимового місяця, видавати повідомлення «холодно»інакше, - «тепло».
  • Реалізувати кількома способами.
  • Writeln (pribitie) end .

    var otpravlenie,pribitie:byte; begin otpravlenie:=22; pribitie:=otpravlenie+10; writeln(pribitie) end.

    програма замість відповіді "8" надрукує відповідь "32".
    Введення обмеженого діапазонного типу дозволить уникнути неправильного результату, однак компілятор все одно випустить помилку:

    1 2 3 4 5 6 var відправлення, прибитие: 0 .. 24 ; при відношенні: = 22 ; pribitie: = otpravlenie+ 10; writeln (pribitiedeva); var a: znak; begin a: = lev; if a<= strelets then writeln ("огонь" ) ; if (a>= vesi) and (a<= bliznetsi) then writeln ("воздух" ) ; if (a>= rak) and (a<= ribi) then writeln ("вода" ) ; if (a>= kozerog) and (a<= deva) then writeln ("земля" ) ; end .

    тип znak=(oven,lev,strelets,vesi,vodoley, bliznetsi,rak,skorpion,ribi,kozerog,telets,deva); var a:znak; begin a:=lev; if a<=strelets then writeln("огонь"); if (a>=vesi) and (a<=bliznetsi) then writeln ("воздух"); if (a>=rak) and (a<=ribi) then writeln ("вода"); if (a>=kozerog) and (a<=deva) then writeln ("земля"); end.

    Type 5:Залежно від назви квітки, видавати до якого сезону року вона відноситься:

  • Весна: пролісок, ірис, нарциси
  • Літо: ромашка, кульбаба, мак
  • Осінь: астра, хризантема, флокс
  • Перелічуваний тип визначається як набір ідентифікаторів, з погляду мови які грають ту ж роль, як і звичайні іменовані константи, але пов'язані з цим типом. Класичний опис типу-перерахування у мові Паскаль виглядає так:

    type Cardsuit = (clubs, diamonds, hearts, spades);

    Тут проводиться оголошення типу даних Cardsuit (карткова масть), значеннями якого може бути будь-яка з чотирьох перерахованих констант. Змінна типу Cardsuit може приймати одне з значень clubs, diamonds, hearts, spades , допускається порівняння значень типу перерахування на рівність чи нерівність, і навіть використання в операторах вибору (у Паскалі - case) як значень, ідентифікують варіанти.

    Використання перерахувань дозволяє зробити вихідні коди програм більш читаними, оскільки дозволяють замінити «магічні числа» , що кодують певні значення, на імена, що читаються.

    На базі перерахувань в деяких мовах можуть створюватися типи-множини. У разі безліч розуміється (і описується) як невпорядкований набір унікальних значень типу-перечисления.

    Тип, що перераховується, може використовуватися в оголошеннях змінних і формальних параметрів функцій (процедур, методів). Значення перерахованого типу можуть надаватися відповідним змінним і передаватися через параметри відповідних типів функції. Крім того, завжди підтримується порівняння значень перерахованого типу на рівність та нерівність. Деякі мови підтримують інші операції порівняння для значень перерахованих типів. Результат порівняння двох перерахованих значень у разі визначається, зазвичай, порядком слідування цих значень в оголошенні типів - значення, що у оголошенні типу зустрічається раніше, вважається «менше» значення, що зустрічається пізніше. Іноді перерахований тип або деякий діапазон значень перерахованого типу також може бути використаний як тип індексу для масиву. У цьому випадку для кожного значення вибраного діапазону в масиві є один елемент, а реальний порядок проходження елементів відповідає порядку проходження значень в оголошенні типу.

    Реалізація

    Зазвичай у процесі компіляції значення перерахувань представляються з допомогою цілих чисел. Залежно від конкретної мови програмування таке уявлення може бути або повністю приховано від програміста, або доступне йому за допомогою тих чи інших «обхідних маневрів» (наприклад, примусового перетворення значення типу перерахування до значення типу «ціле число»), або навіть кероване програмістом ( у таких випадках програміст має можливість явно вказати, якими числами кодуватимуться всі або деякі значення типу-перерахування). У всіх варіантів є свої позитивні та негативні сторони. З одного боку, можливість використання числових значень констант, що становлять тип-перерахування, особливо при зловживанні нею, позбавляє сенс використання цих типів і створює небезпеку появи помилок (коли використовуються числові значення, для яких в типі немає відповідних констант). З іншого боку, явне керування значеннями дає деякі додаткові можливості. Наприклад, дозволяє використовувати типи-перерахування при організації інтерфейсу з модулями, написаними іншими мовами, якщо вони використовують або повертають кодовані цілими числами значення деякого визначеного набору.

    Ще одна можливість, яку дають типи на рівні реалізації мови - економія пам'яті. При невеликому обсязі типу-перерахування для зберігання значення цього типу досить кількох бітів (наведений вище Cardsuit вимагає всього два біти на значення, у той час як стандартне ціле число на більшості використовуваних архітектур займає 32 біти - в 16 разів більше), і компілятор може використовувати цей факт для ущільнення зберігання даних у пам'яті. Це може бути особливо важливо, якщо кілька значень типів-перерахувань зберігаються в одному записі - ущільнення записів при обробці їх великої кількості може звільнити багато пам'яті. Правда, слід зазначити, що компілятори зазвичай не реалізують цю можливість, принаймні останнім часом, коли комп'ютерна пам'ять суттєво подешевшала.

    Критика

    Тип перерахування є традиційним для розвинених мов програмування, використовується досить широко і часто сприймається як щось зрозуміле. Проте цей тип також не обходиться без критики з боку теоретиків та практиків програмування. Так, при розробці мови програмування Оберон перераховані типи потрапили до списку можливостей, видалених з мови. Ніклаус Вірт, розробник мови, назвав такі причини:

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

    Опис перерахувань у різних мовах

    Enum cardsuit (CLUBS, DIAMONDS, HEARTS, SPADES);

    Динамічні мови слабкої типізації з C-подібним синтаксисом (наприклад, perl або JavaScript), як правило, не мають перерахувань.

    C++

    Перерахування в мові C++ прямо успадковують поведінку перерахувань мови C, за винятком того, що тип, що перераховується в C++ - справжній тип, і ключове слово enum використовується тільки при оголошенні такого типу. Якщо при обробці параметра є перерахуванням, якесь значення з перерахування не обробляється (наприклад один з елементів перерахування забули обробити конструкції switch), то компілятор може видати попередження про забуте значення.

    enum Cardsuit ( Clubs , Diamonds , Spades , Hearts )

    Java

    У початковій Java перерахунків був, замість них пропонувалося використовувати класи зі статичними константами. Починаючи з версії 5 (1.5) перерахування були введені в мову, вони є повноцінним класом, в який можна додавати довільну кількість полів та методів. Переліки були введені для покращеного контролю за типобезпекою.

    Складання