THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

Опис і використання

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

Type Cardsuit \u003d (clubs, diamonds, hearts, spades);

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

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

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

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

Реалізація

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

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

критика

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

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

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

Ada

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

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

C ++

C #

Enum Cardsuit (Clubs, Diamonds, Spades, Hearts);

Java

Enum Cardsuit (Clubs, Diamonds, Spades, Hearts)

Haskell

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

Data Bool \u003d False | True

Примітки


Wikimedia Foundation. 2010 року.

вікіпедія

З технічних причин Bool перенаправляється сюди. Про Bool можна прочитати тут: stdbool.h. Логічний, логічний (англ. Boolean або logical data type) тип даних примітивний тип даних в інформатиці, які можуть приймати два можливих ... Вікіпедія

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

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

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

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

Деякі мови програмування надають спеціальний тип даних для комплексних чисел. Наявність вбудованого типу спрощує зберігання комплексних величин і обчислення над ними. Зміст 1 Арифметика над комплексними 2 Підтримка в мовах ... Вікіпедія

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

змінниминазивають величини, значення яких можуть змінюватисяв процесі виконання програми. Кожна змінна задається своїм унікальним ім'ям, побудованим за правилами, зазначеним на початку глави. Максимально можлива довжина імені залежить від реалізації Паскаля, теоретично можна давати змінним імена аж до 63 символів довжиною, що навряд чи актуально - зазвичай імена не довше 5-10 символів.

Оскільки будь-які дані в пам'яті комп'ютера зберігаються в числовій формі і двійковій системі числення, крім імені, змінної обов'язково слід привласнити і тип, що визначає діапазон значень, Прийнятих змінної, і спосіб її обробкимашиною. Пояснимо сказане на прикладі. Як видно з Додатка 1, латинська велика літера "A" має десятковий код 65, або 01000001 в двійковому поданні. Без додаткової інформації про типіданих, що зберігаються в деякій комірці пам'яті, комп'ютера було б неможливо вирішити, що саме являють собою ці дані - число 65, код символу "A" або щось ще. У будь-якій мові програмування, в тому числі і в Паскалі, існує стандартний набір типів, до яких може бути віднесена та чи інша сукупність елементів пам'яті. Інформацію про типи даних Паскаля зручно звести в таблицю. Рядки цієї таблиці будуть впорядковані за старшинству типів, Від самого "молодшого", що вимагає найменше число байт для представлення, і, відповідно, представляє найменший діапазон можливих значень, до самого "старшого", що представляє найбільший діапазон значень. У таблиці представлені не всі можливі, а лише основні типи даних Паскаля.

Ключове слово Паскаля

Назва та опис типу

Обсяг пам'яті, байт

Діапазон можливих значень

Логічний: зберігає одну логічну змінну

Символьний: зберігає код одного символу з набору ASCII-кодів

від 0 до 255 включно (2 8 \u003d 256)

цілочисельний

Цілочисельний без знака

± 2 16 - діапазон вдвічі більше, так як 16-й біт чи не зайнятий під знак числа

Довге ціле: для подання великих цілочисельних значень

Дійсне число з точністю уявлення до 11-12 знака в дробової частини

~ 2.9*10 -39 - 1.7*10 38

Дійсне число з точністю уявлення до 15-16 знака в дробової частини

~ 5*10 -324 – 1.7*10 308

Послідовність символів типу Charдліной від 1 до 255

2-256 (дані рядка + 1 байт для зберігання її довжини)

Будь-які рядки тексту, що складаються з друкованих символів

Теоретично для запису змінної типу Booleanбило б достатньо 1 біта, але мінімальна адресується одиниця пам'яті - 1 байт (див. Додаток 1). У цьому ж Додатку уточніть, як саме обсяг пам'яті в байтах, що виділяється під змінну, впливає на діапазон представлених їй значень.

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

Зрозуміло, завдання правильного вибору типів даних цілком лягає на програміста. Наприклад, якщо деякий лічильник у Вашій програмі може приймати цілочисельні значення від 1 до 100000, неправильно було б описувати його як змінну типу Integer- адже 2 15 \u003d 32768 і при досягненні лічильником цієї величини відбудеться скиданняйого значення, яке стане одно -32768. Розумним в даному випадку було б опис лічильника як змінної тіпаLongint.

Змінні описуються в програмі оператором такого вигляду:

var Спісок1: Тип1;

Спісок2: Тип2;

СпісокN: ТіпN;

тут перелік- набір імен змінних, розділених комами (або одна змінна), а тип- будь-який з розглянутих вище типів даних. Наприклад, конструкція

описує 2 дійсних змінних з іменами tіr, а також целочисленную змінну з іменемi. Ключове словоvarможно і продублювати, але зазвичай такої необхідності немає. Сокращеніеvarобразовано від англійського слова "Variable" (змінна).

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

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

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

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

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

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

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

procedure p (a: array of Integer);

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

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

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

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

type vector \u003d array of integer; matritsa \u003d array of vector;

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

    type matritsa \u003d array of array of integer;

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

    type matritsa \u003d array of integer;

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

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

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

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

    Перераховуються тип та інтервальний тип в Паскаль

    Перераховуються тип

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

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

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

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

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

    type pt \u003d (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 \u003d (red, yellow, green, blue); var b: red .. green; begin b: \u003d red; writeln (b); b: \u003d yellow; writeln (b); b: \u003d green; writeln (b); readln end.

    type color \u003d (red, yellow, green, blue); var b: red..green; begin b: \u003d red; writeln (b); b: \u003d yellow; writeln (b); b: \u003d 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 \u003d (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); var s, i: integer; begin s: \u003d 0; for i: \u003d 6 to 8 do s: \u003d s + dni [i]; (Літні місяці - 6, 7, 8) writeln (s) end.

      const dni: array of byte \u003d (31,28,31,30,31,30,31,31,30,31,30,31); var s, i: integer; begin s: \u003d 0; for i: \u003d 6 to 8 do s: \u003d s + dni [i]; (Літні місяці - 6, 7, 8) writeln (s) end.

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

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

      1 2 3 4 5 6 7 8 9 TYPE mes \u003d (january, february, march, april, may, june, july, august, september, october, november, december); CONST dni: array [january .. december] of Byte \u003d (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); VAR s: Integer; i: mes; (Змінна лічильника циклу i задана типом mes, а не Integer) BEGIN s: \u003d 0; for i: \u003d june to august do s: \u003d s + dni [i]; WriteLn (s) END.

      TYPE mes \u003d (january, february, march, april, may, june, july, august, september, october, november, december); CONST dni: array of Byte \u003d (31,28,31,30,31,30,31,31,30,31,30,31); VAR s: Integer; i: mes; (Змінна лічильника циклу i задана типом mes, а не Integer) BEGIN s: \u003d 0; for i: \u003d june to august do s: \u003d 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: \u003d 22; pribitie: \u003d otpravlenie + 10; writeln (pribitie) end.

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

    1 2 3 4 5 6 var otpravlenie, pribitie: 0 .. 24; begin otpravlenie: \u003d 22; pribitie: \u003d otpravlenie + 10; writeln (pribitiedeva); var a: znak; begin a: \u003d lev; if a<= strelets then writeln ("огонь" ) ; if (a>\u003d Vesi) and (a<= bliznetsi) then writeln ("воздух" ) ; if (a>\u003d Rak) and (a<= ribi) then writeln ("вода" ) ; if (a>\u003d Kozerog) and (a<= deva) then writeln ("земля" ) ; end .

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

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

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

    Прості типи поділяються на стандартні (порядкові) і перераховуються (обмежені).

    стандартні типи

    Турбо-Паскаль має чотири вбудованих стандартних типу: integer (ціле), real (речовий), boolean (логічний) і char (символьний).

    Цілочисельний тип (integer)

    У Турбо-Паскалі є п'ять вбудованих цілочисельних типів: shortint (коротке ціле), integer (ціле), longint (довге ціле), byte (довжиною в байт) і word (довжиною в слово). Кожен тип позначає певну підмножину цілих чисел, як це показано в наступній таблиці.

    Вбудовані цілочисельні типи.

    Діапазон

    формат

    8 бітів із знаком

    16 бітів із знаком

    2147483648 +2147483647

    32 біта зі знаком

    8 бітів без знака

    16 бітів без знака

    Арифметичні дії над операндами целочисленного типу здійснюються відповідно до наступних правил:

    1. Тип цілої константи є вбудований цілочисельний тип з найменшим діапазоном, що включає значення цієї цілої константи.
    2. У разі бінарної операції (операції, що використовує два операнда), обидва операнда перетворюються до їх загального типу перед тим, як над ними відбувається дія. Загальним типом є вбудований цілочисельний тип з найменшим діапазоном, що включає всі можливі значення обох типів. Наприклад, загальним типом для цілого і цілого довжиною в байт є ціле, а загальним типом для цілого і цілого довжиною в слово є довге ціле. Дія виконується відповідно до точністю загального типу і типом результату є загальний тип.
    3. Вираз справа в операторі присвоєння обчислюється незалежно від розміру змінної зліва.

    Операції здійснюються над цілими числами:

    "+" - додавання

    "-" - віднімання

    "*" - множення

    SQR - зведення в квадрат

    DIV - після поділу відкидає дробову частину

    MOD - отримання цілого залишку після поділу

    ABS - модуль числа

    RANDOM (X) -отримання випадкового числа від 0 до Х

    А: \u003d 100; b: \u003d 60; a DIV b результат - 1 а MOD b результат - 40

    Описуються змінні цілого типу наступним чином:

    var список змінних: тип;

    Наприклад: var а, р, n: integer;

    Речовий тип (real)

    До речового типу відноситься підмножина дійсних чисел, які можуть бути представлені в форматі з плаваючою комою з фіксованим числом цифр. Запис значення в форматі з плаваючою комою зазвичай включає три значення - m, b і e - таким чином, що m * b е, де b завжди дорівнює 10, а m і e є цілочисельними значеннями в діапазоні дійсного типу. Ці значення m і e далі визначають діапазон і точність дійсного типу.

    Є п'ять видів дійсних типів: real, singlе, duble, exnende, comp. Речові типи розрізняються діапазоном і точністю пов'язаних з ними значень

    Діапазон і десяткові цифри для речових типів

    Діапазон

    цифри

    2.9x10Е-39 до 1.7x10Е 38

    1.5x10Е-45 до 3.4x10Е 38

    5.0x10Е-324 до 1.7x10Е 308

    3.4x10Е-493 до 1.1x10Е 403

    2 Е 63 до 2 Е 63

    Операції здійснюються над числами:

    • Всі операції допустимі для цілих чисел.
    • SQRT (x) -корінь квадратний з числа х.
    • SIN (X), COS (X), ARCTAN (X).
    • LN (X) -натуральний логарифм.
    • EXP (X) -експонента Х (е х).
    • EXP (X * LN (A)) - зведення в ступінь (А х).
    • Функції перетворення типів:
      • TRUNC (X) -отбрасивает дробову частину;
      • ROUND (X) -округленіе.
    • Деякі правила арифметичних операцій:
      • Якщо в арифметичному дії зустрічаються числа типу real і integer, то результат буде мати тип real.
      • Всі складові частини виразу записуються в один рядок.
      • Використовуються тільки круглі дужки.
      • Не можна поспіль ставити два арифметичних знака.

    Описуються змінні дійсного типу наступним чином:

    var список змінних: тип;

    наприклад:

    var d, g, k: real;

    Символьний тип (char)

    K типу char відноситься будь-який символ укладений в апострофи. Для уявлення апострофа як символьну змінну, треба укласти його в апостроф: '' ''.

    Кожен символ має свій код і номер. Порядкові номери цифр 0,1..9 впорядковані за зростанням. Порядкові номери букв також впорядковані по зростанню, але не обов'язково слідують один за одним.

    До символьним даним застосовні знаки порівняння:

    > , < , >=, <=, <> .

    Наприклад: 'A'< ‘W’

    Функції, які можна застосувати до символьних змінних:

    1. ORD (X) - визначає порядковий номер символу Х. ord ( 'a') \u003d 97;
    2. CHR (X) - визначає символ за номером. chr (97) \u003d 'a';
    3. PRED (X) - видає символ, що стоїть перед символом Х. pred ( 'B') \u003d 'A';
    4. SUCC (X) - видає символ, наступний після символу Х. succ ( 'A') \u003d 'B';

    Перечіслімий тип

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

    Type<имя типа>\u003d (Список констант); Var<имя переменной>:<имя типа>;

    де<список констант> - це особливий вид констант, що задаються через кому і мають свій порядковий номер, починаючи з 0.

    наприклад:

    type напрямок \u003d (північ, південь, захід, схід); місяць \u003d (червень, липень, серпень, січень); ємність \u003d (відро, бочка, каністра, бак); var поворот: напрямок; виселення: місяць; обсяг: ємність; var поворот: (свер, південь, захід, схід); виселення: (червень, липень, серпень, січень); обсяг: (відро, бочка, каністра, бак);

    Можна виконати такі оператори присвоювання:

    Поворот: \u003d південь; виселення: \u003d серпень; обсяг: \u003d бак;

    але не можна виконувати змішані присвоювання:

    Від'їзд: \u003d південь; обсяг: \u003d серпень;

    До змінних перечислимого типу застосовні наступні функції:

    1. ORD - порядковий номер

    2. PRED - попередній елемент

    3. SUCC - наступний елемент.

    PRED (бочка) \u003d відро; SUCC (південь) \u003d захід; ORD (липень) \u003d 1;

    Змінні перечислимого типу можна порівняти, так як вони впорядковані і пронумеровані. Так вираження: північ< юг, июнь < январь имеют значения TRUE, а юг>захід і бак<бочка значение FАLSE.

    обмежений тип

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

    Описується так:

    TYPE<имя типа>\u003d Константа1 ..константа2

    При цьому повинні виконуватися наступні правила:

    1. Обидві обмежені константи повинні бути одного типу.
    2. В якості базового типу можна використовувати будь-який простий тип, крім дійсного (real).
    3. Початкові значення при визначенні обмеженого типу не повинна бути більше кінцевого значення.
    type index \u003d 0 ..63; letter \u003d 'a' .. 'z'; var char1, char2: letter; a, g: index;

    Можна описувати відразу в розділі опису змінних:

    var a, g: 0 ..63; char1, char2: 'a' .. 'z'.

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

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

    • 1 / 5

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

      type Cardsuit \u003d (clubs, diamonds, hearts, spades);

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

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

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

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

      Реалізація

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

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

      критика

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

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

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

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

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

    THE BELL

    Є ті, хто прочитали цю новину раніше вас.
    Підпишіться, щоб отримувати статті свіжими.
    Email
    ім'я
    Прізвище
    Як ви хочете читати The Bell
    без спаму