вівторок, 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.
Приклад: Відомо, скільки днів в кожному місяці року. Скільки днів влітку?
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


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


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

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