Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Типізація даних.doc
Скачиваний:
4
Добавлен:
25.11.2018
Размер:
503.81 Кб
Скачать

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

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

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

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

if b=9 then …

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

if b = September then …

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

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

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

Синтаксично задання перелічувального типу в Pascal визначається наступною метаформулою:

перелічувальний тип ::= (значення {, значення })

значення ::= ідентифікаторціле

Наприклад,

Type

Metal = (Fe, Co, Cu, Zn); {card (Metal) = 4 }

Day = ( mo, tu, we, th, fr, sa, su ); {card (Day ) =7 }

Notation = ( do, re, mi, fa, sol, la, si ); {card (Notation) = 7 }

Var

Met1, Met2 : Metal ;

Season, Next, Prevision: (Winter, Spring, Summer, Autumn).

MyDay : Day ;

MyNota : Notation;

Одне і те ж ім'я не може використовуватися як значення в різних перелічуваних типах однієї програми:

Color1 : (green, blue, yellow );

Color2 : (black, green, red ); {green - недопустимо}

Перелічувані типи є порядковими: їхні значення вважаються пронумерованими починаючи з 0 у порядку їхнього перерахування (до 65536). Наприклад, Summer < Autumn, Fe < Zn.

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

Змінні перелічуваних типів можуть використовуватися в умовах, операторах присвоювання, а також як індекси масивів і меж оператора for. Наприклад,

1) if Season = Spring then

begin

Next := Summer;

Prevision := Winter

end;

2) for i := Winter to Autumn do

. . .

Недоліком перелічуваних типів у Pascal є те, що для організації введення-виведення їхніх значень не можна використовувати стандартні процедури введення-виведення (ReadLn, Write, тощо). Для цих цілей використовуються інші можливості мови, зокрема оператор багатоваріантного вибору Case. Наприклад,

case Season of

Winter : WriteLn (‘зима’);

Spring : WriteLn (‘весна’);

Summer : WriteLn (‘літо’);

Autumn : WriteLn (‘осінь’)

end;

Задання перелічувального типу в С визначається наступними форматами:

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

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

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

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

1. Змінна може містити повторювані значення.

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

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

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

Наприклад,

enum week { SUB = 0, /* 0 */

VOS = 0, /* 0 */

POND, /* 1 */

VTOR, /* 2 */

SRED, /* 3 */

HETV, /* 4 */

PJAT /* 5 */

} rab_ned ;

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

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

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

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

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

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

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

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

Синтаксично задання обмеженого типу в Pascal визначається наступною метаформулою:

обмежений тип ::= мінімальне значення .. максимальне значення

мінімальне значення ::= константа базового типу

максимальне значення ::= константа базового типу.

Наприклад,

Type

Days = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

Workdays = Monday .. Friday; {обмеження на тип Days }

Var

w : Workdays ;

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

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

Як межі можуть використовуватися не тільки значення констант, а й їхні ідентифікатори, наприклад,

Const

min =1 ; max = 31 ;

Type

Day = min .. max ;

Var

WorkDay : Day.

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

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

Загалом використання обмежених типів має декілька переваг :

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

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

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

Приняты следующие основные принципы концепции типа:

Любой тип данных определяет множество значений, к которым может относится некоторая константа, которая может формировать операцию или функцию, либо принимать переменные или выражения.

Тип любой величины, обозначаемый константой, переменной или выражением, может быть выведен по её виду или по её описанию. Для этого нет необходимости проводить какие-либо вычисления.

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

Три уровня описания структур данных:  функциональная  спецификация, логическое описание,  физическое представление.

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

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

15