вівторок, 2 червня 2020 р.

Користувацький тип даних в Pascal




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

Дані цих типів займають в пам'яті один байт, тому скалярні призначені для користувача типи не можуть містити більше 256 елементів. Їх застосування значно покращує наочність програми, робить більш легким пошук помилок, економить пам'ять.
Тип-перелік
Тип-перелік даних задається безпосередньо перерахуванням всіх значень, які може приймати змінна даного типу. При описі окремі значення вказуються через кому, а весь список беруть в круглі дужки. наприклад,
Var    Season: (winter,spring,summer,autum );
       Temp: (23,24,25,26);

Інтервальний тип
Інтервальний тип дозволяє задавати дві константи, що визначають межі діапазону значень для кожної змінної.   Обидві константи повинні належати одному і тому ж стандартному типу (крім real). наприклад,
Var    S:1..30;
       Сh:'a'..'f';

Вказівний тип
Вказівні типи - їх значеннями є адреси пам'яті. На відміну від стандартного вказівного типу Pointer, призначений для користувача тип визначає безліч значень, які вказують на динамічні змінні певного типу, званого базовим типом. Покажчик на який-небудь тип може бути описаний до оголошення самого типу:
Type     PtStack=^Stack;
         Stack=array[1..40] of real;

Процедурний тип
Процедурний тип дозволяє оголошувати змінні, яким допускається присвоювання імен процедур, функцій і методів, а також передавати такі змінні і імена як параметрів. Опис процедурних типів має такий же синтаксис, як і оголошення процедур і функцій:
Type     Tproc1=procedure (var x,y:real);
         Tproc2=function ( x:real):real;

Cимвольний тип даних (CHAR)
Змінні порядкового типу Char використовуються для зберігання символів ASCII.
Символьні константи записуються в апострофах, наприклад:
'A', '3' або '*'
Один символ апострофа записується як два апострофа в апострофа, наприклад:
'' ''
Функція Chr перетворює значення Integer в символ з відповідним номером в таблиці ASCII.
Функція Ord повертає значення заданого символу ASCII.


Символьний тип даних
CHAR (символьний тип). Значенням символьної величини є один символ (літера, цифра і т.ін.). Всі символи занесено в спеціальну таблицю у певному порядку. Порядковий номер символу є кодом цього символу. Всього в таблиці 256 символів (порядкові номери від 0 до 255). Значення символьного типу записується у вигляді символу, взятого в одинарні лапки (апострофи). Для того, щоб представити сам апостроф, його потрібно повторити два рази.
 Приклади:
 ' А '
' Ь '
' 7 '
' ; '
' '' ' – так може бути представлений сам апостроф
 Коди великих та малих літер — різні. Оскільки символи мають порядкові номери (коди), то до них можна застосовувати лише операції порівняння одного з іншим. Наприклад, латинські літери розташовано в таблиці кодів в алфавітному порядку, тобто символ ' А ' має мінімальний код, a ' Z ' — максимальний (в ланцюжку великих латинських літер). Тому можна записати:
'А' < ' F '
'Y' > 'C'

'E' < > 'G'

Приклад: Відомо, скільки днів в кожному місяці року. Скільки днів влітку?
31,28,31,30,31,30,31,31,30,31,30,31
Один з варіантів вирішення даної задачі виглядає так:
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.
Код даного рішення має не найкращою наочністю, до того ж доводиться самому вираховувати номера місяців початку і кінця літа (6 і 8).
Зручність і наочність таких програм можна підвищити в такий спосіб:
TYPE    mes =   (january, february, march, april, may, june, july, august, september, october, november, december);
CONST   dni:array[january..december] 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.
Приклад:
Поїзд відправляється в дорогу о 22 годині і знаходиться в дорозі 10 годин. У скільки він прибуває на місце призначення?
var otpravlenie,pribitie:0..24;
begin
otpravlenie:=22;
pribitie:=otpravlenie+10;
writeln(pribitie)
end.


Завдання для самостійного опрацювання

1. Type 2: Визначити за назвою дня тижня вихідний це чи робочий день.
Визначити перелічувальний тип зі значеннями днів тижня (mon, tue, wed, thu, fri, sat, sun).
Оголосити змінну, що відноситься до цього типу.
У програмі привласнити значення змінної (з значень типу, наприклад, mon).
Перевіряти змінну: якщо значення субота або неділя - видавати повідомлення «Вихідний!», Інакше «Працюємо!».
Реалізувати декількома способами.
2. Type 3: В залежності від місяця року, видавати повідомлення «холодно» - якщо зимовий місяць, і «тепло» - якщо річний.
Визначити перераховується тип зі значеннями назв місяців року.
Оголосити змінну, що відноситься до цього типу.
У програмі привласнити значення змінної (з значень типу).
Перевіряти змінну: якщо значення відноситься до зимового місяця, - видавати повідомлення «холодно» інакше, - «тепло».
Реалізувати декількома способамі.Type 3: В залежності від місяця року, видавати повідомлення «холодно» - якщо зимовий місяць, і «тепло» - якщо річний.
Визначити перераховується тип зі значеннями назв місяців року.
Оголосити змінну, що відноситься до цього типу.
У програмі привласнити значення змінної (з значень типу).
Перевіряти змінну: якщо значення відноситься до зимового місяця, - видавати повідомлення «холодно» інакше, - «тепло».
Реалізувати декількома способами.
3. Залежно від знака зодіаку видавати до якої стихії він відноситься:
Вогонь (Овен, Лев, Стрілець)
Повітря (Терези, Водолій, Близнюки)
Вода (Рак, Скорпіон, Риби)
Земля (Козеріг, Телець, Діва)
4. Type 5: Залежно від назви квітки, видавати до якого сезону року вона відноситься:
Весна: підсніжник, ірис, нарциси
Літо: ромашка, одуван, мак
Осінь: астра, хризантема, флокс
5. Приклад 2. Напишіть програму для виведення на екран всіх символів таблиця ASCII.
6. Приклад 3. Вивести в один рядок:
ABBCCC ... ZZ ... Z

Немає коментарів:

Дописати коментар