У мові програмування Паскаль, крім стандартних типів (integer, real, char, boolean), можна використовувати й інші типи даних. Використання в програмі таких типів можливі тільки після відповідного їх визначення в спеціальному розділі. Типи можна поділити на прості (скалярні, неструктуровані) і складені (структуровані). Стандартні типи даних належать до простих типів. До простих нестандартних типів даних належать перелічувальні i інтервальні типи.
Перелічувальний тип. Цей тип означається перелічень ням по порядку всіх його значень. Значення нового типу подаються iменами (ідентифікаторами), які є константами цього типу. Означення типу має вигляд
TYPE ім'я типу = (список констант-iдентифікаторів);
TYPE day = (monday, tuesday, wednesday, thursday. friday, saturday» sunday);
month = (january, february, march, april, may, june, july, august, september, oktober, november, december);
znak = (plus, minus, multiply, divide);
color = (red, orange, yellow, green, lightblue, blue, violet);
{тип день = (понеділок, вівторок, середа, четвер, п'ятниця, субота, неділя);
місяць == (січень, лютий, березень, квітень, травень, червень, липень, серпень, вересень, жовтень, листопад, грудень);
znak = (плюс, мінус, множити, ділити);
колір = (червоний, оранжевий, жовтий, зелений, голубий, синій, фіолетовий);}
Тут означаються чотири перелічувальні типи, імена яких day, month, znak, color. Тепер ці iмена такі ж iдентифікатори типу, як integer або real.
Для будь-якого перелічувального типу t, який означається записом
TYPE t = (v1, v2 , ..., vn ),
де t — ім'я типу; v1, v2 , ..., vn— константи-ідентифікатори, повинні задовольнятися вимоги:
1) vi¹ vj, якщо i¹j;
2) vi<vj, якщо і < j(впорядкованість), тобто впорядкованість у перелічувальних типах визначається порядком, в якому значення перелічені в означенні типу;
3) значення типу t можуть бути лише v1, v2 , ..., vn.
До перелічувальних типів можна застосовувати операції відношення =, <>,<,< =, >, > =, якщо обидва компоненти відношення одного типу. Отже, для наведеного прикладу можна записати вирази
monday < thursday
minus > plus які мають значення true.
Для аргументів перелічувального типу можна застосовувати стандартні функції знаходження попереднього і наступного елементів:
pred (vi)= ,i=2,3, .... n;
succ (vi) = vi+1 , i=2,3, .... n-1.
Функція ord для перелічувального аргументу видає число, яке є порядковим номером заданого значення в списку означення. При цьому порядковий номер першого значення списку дорівнює нулю, тобто
ord (v1) =0; ord (vi) = ord (pred (vi)) + 1, і= 2, 3, ..., n.
Таким чином, ord (red) = ord (January) = 0;
ord (green) = 3; ord (divide) = 3.
Зауважимо, що стандартний булевий тип автоматично означається як
TYPE boolean = (false, true);
До перелічувального типу можна віднести також стандартний тип char. Його, як і булевий тип, не треба означати програмісту, оскільки він означається автоматично.
Типи, що означаються програмістом, використовуються так, як і стандартні. Наприклад,
VAR winterm, summerm : month;
op : znak;
workinghours, dayoff : day;
kolir : color;
Тут описано шість змінних. Змінні winterm (зимовий місяць: winter — зима) і summerm (літній місяць, summer — літо) мають тип month (тобто кожна з них може мати одне з дванадцяти значень January, February, march, april, may, June, July, august, september, oktober, november, december і ніяких iнших), змінна op має тип znak, змінні workinghours (working hours — робочий день) і dayoff (вихідний день) мають тип day, змінна kolir — тип color. У програмі, яка містить такі описи змінних, синтаксично правильними будуть такі оператори присвоювання:
winterm: = february; summerm: = august;
op: = minus; dayoff := sunday;
Означення типу i опис змінних можна, взагалі кажучи, замінити одним описом змінних. Наприклад, замість означення
TYPE znak = (plus, minus, multiply, divide);
i опису
VAR op : znak;
можна записати
VAR op : (plus, minus, multiply, divide);
Перелічувальні типи часто використовуються в операторах циклу з параметром, а також в операторах вибору. Наприклад,
FOR kolir:= red TO violet DO
BEGIN
Cерія
END;
FOR kolir: = violet DOWNTO red DO
BEGIN
Серія
END
Обмежені типи. Для всіх скалярних типів, крім дійсного, можна означити новий тип, накладаючи обмеження на початковий. Останній при цьому називається базовим типом. Обмеження визначає діапазон допустимих значень: вказуються мінімальне i максимальне значення в діапазоні. Означення обмеженого типу має форму:
TYPE ім'я типу = константа 1.. константа 2;
Перша константа визначає нижню межу і не повинна перевищувати верхньої. Обмежений тип зберігає всі властивості базового скалярного типу з урахуванням діапазону його значень.
Використання обмежених типів має ряд переваг. Це унаочнення програми (вказуються додаткові відомості про діапазон значень, які може набувати змінна); зменшення пам'яті, яку займає програма, контролювання під час виконання програми присвоювання змінним обмеженого типу.
Наприклад:
TYPE masa = 10..100;
index = 0..10;
letter = ‘A’..’Z’;
working = monday..friday;
Тут working (робочий) — це обмеження перелічувального типу day з розглянутого вище прикладу.
Базовим типом для masa і index є цілий (integer) для letter — символьний (char), для working — перелічувальний простий тип day.
Використовуючи відповідні імена типів, можна, наприклад, записати такі описи змінних:
VAR mas1, mas2: masa;
і, beta: index;
lit, symbol: letter;
work: working;
Тип даних можна було б описати і безпосередньо в розділі опису змінних:
VAR mas1, mas2: 10..100;
i, beta: 0..10;
lit, symbol: ‘A’..’Z’;
work: monday..friday;
Приклади
1. Скласти програму, яка б визначала, чи є заданий рік з проміжку [1001; 9999] — високосним.
Високосним, як відомо, є роки, номери яких діляться на 4, крім тих, номери яких діляться на 100, але не діляться на 400.
Програму мовою Паскаль можна записати у вигляді:
PROGRAM lead_year ;
VAR rik: 1001.,9999;
sign: boolean;
BEGIN
write (‘Який рік бажаєте перевірити ?’);
readln (rik);
sign:=false;
IF (rik MOD 4=0) AND (rik MOD 100<>0)
THEN sign:=true;
IF rik MOD 400=0
THEN sign:=true;