Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 (4).doc
Скачиваний:
30
Добавлен:
12.05.2015
Размер:
467.97 Кб
Скачать

Прості типи даних користувача

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

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

if (b==9) …

неможливо відразу зрозуміти, про що тут йде мова: чи то про порівняння цілочисельної змінної b (що є, наприклад, лічильником числа повторень циклу) з цілим числом 9, чи то з'ясовується, чи не дев'ятий місяць року (тобто вересень) представляє значення змінної b. Отже для розуміння або перевірки правильності такого запису доводиться по ходу справи згадувати (або з’ясовувати), що ж по суті задачі представляє собою змінна b і що саме закодоване цілим числом 9. Набагато зручніше було б не вдаватися до кодування, а записати цю умову у природній формі:

if (b == September) …

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

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

type

metal = (Fe, Co, Cu, Zn); { Pascal }

var

met1, met2 : metal ;

season, next, prevision: (winter, spring, summer, autumn).

РБНФ задання перелічуваного типу уС/C++:

перелічувальний_тип = enum [ім’я_типу] “{“список_перерахування”}” змінна [{, змінна}]

список_перерахування = ідентифікатор [“=“const-вираз] {, ідентифікатор [“=“const_вираз]}

Кожен ідентифікатор іменує елемент перерахування. Всі ідентифікатори в списку enum повинні бути унікальними. У разі відсутності константного виразу, першому ідентифікатору відповідає значення 0, наступному - значення 1 і т.д. Ім'я константи перерахування еквівалентно її значенню. Ідентифікатор, пов'язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип int і може бути як додатним, так і від’ємним. Наступному ідентифікатору в списку присвоюється значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу.

Використання елементів перерахування здійснюється відповідно наступних правил:

  • змінна може містити повторювані значення;

  • ідентифікатори в списку перерахування повинні бути відмінними від усіх інших ідентифікаторів в тій же області видимості, включаючи імена звичайних змінних і ідентифікатори з інших списків перерахувань;

  • імена типів перерахувань повинні бути відмінними від інших імен типів перерахувань, структур тощо в цій же області видимості;

  • значення може слідувати за останнім елементом списку перерахування.

Наприклад,

enum week { SUB = 0, // 0

VOS = 0, // 0

POND, // 1

VTOR, // 2

SRED, // 3

HETV, // 4

PJAT // 5

} work_ week;

У мовах С/С++ даний тип відноситься до групи цілочисельних типів. Його характеристики наведені у табл. 4.

Таблиця 4. Характеристики перелічуваного типа даних С/С++

Ідентифікатор

Діапазон значень

Розмір пам'яті, б

enum

-32 768 .. 32 767

2

Застосування перелічуваних типів дозволяє:

  • зробити текст програми зручним для читання і позбавити програміста необхідності самому кодувати значення;

  • підключити контроль за виконанням операцій, наприклад, при спробі помножити значення з'явиться повідомлення про помилку;

  • за умови, що кардинальне число типу менше або дорівнює 256, розмістити ці дані в одному байті, тобто економити пам'ять.

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

Проте у ряді випадків розглянутих раніше заходів контролю виявляється недостатньо. Нехай, наприклад, змінна n представляє в програмі поточне число якого-небудь місяця. Зрозуміло, що ця змінна повинна набувати цілочисельних значень. Але якщо приписати їй цілочисельний тип, то цій змінній можна буде присвоювати будь-яке цілочисельне значення. Проте очевидно, що по суті задачі мають сенс лише такі значення змінної n, які належать діапазону [1,31]. Тому бажано виявляти випадки присвоєння цій змінній значень, що не належать вказаному діапазону, оскільки це свідчить або про неправильне задання правил обчислення такого значення, або про помилкове його задання в якості вихідних даних програми.

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

Для досягнення цих і деяких інших цілей в мовах програмування, зокрема, в Pascal, використовують обмежені типи даних. Кожен такий тип задається шляхом накладання обмежень на вже заданий або стандартний порядковий тип, який в такому випадку називають базовим. Наприклад,

type

days = (monday, tuesday, wednesday, thursday, friday, saturday, sunday);

workdays = monday .. friday; {обмеження на тип days }

var

w : workdays ;

j : 1950 .. 2000 ; {обмеження на цілочисельний тип}

c : 'a' .. 'k' ; {обмеження на символьний тип }

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

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

  • підвищується наочність програми;

  • з'являється можливість більше економного розподілу пам'яті під змінні;

  • вводиться додатковий контроль значень, що присвоюються змінним під час виконання програми.

1Специфіка́ція— формалізований опис властивостей, характеристик і функцій об`єктів

2 Потужність множини — кількісті елементів цієї множини

13

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]