Лекція №7
Тема: Організація комбінованих типів, оператор приєднання
План заняття:
Організація комбінованих типів у Паскалі
Оператор приєднання
Організація комбінованих типів у Паскалі
Описаний вище регулярний тип масив - це структура даних, що містять компоненти однакового типу. Проте часто доводиться зберігати й опрацьовувати сукупності даних різного типу. З цією метою можна було б для кожного типу даних формувати окремий масив і визначати взаємну відповідність між компонентами цих масивів. Однак це незручно. Мова Паскаль дає змогу ефективно подавати такі різнотипні дані за допомогою комбінованих типів - записів.
Спрощена форма визначення запису включає ім'я запису, імена окремих компонент і відповідних їм типів даних:
type
<ім'я_запису>= record
<ім'я_компоненти_1>: <тип>;
<ім'я_компоненти_2>: <тип>;
<ім'я_компоненти_n>: <тип>;
end;
Розглянемо такий приклад. Нехай треба задати інформацію про студентів групи PZ11 у вигляді "прізвище студента й оцінки на іспитах з чотирьох предметів" та обчислити середній бал кожного студента. Для опису цих даних використовують записи.
Компоненти однакового типу можна об'єднувати і записувати через кому, зазначаючи їхній спільний тип. Дані, наведені в прикладі, можна описати як запис так:
type STD=record
FAM: string [15];
B1, B2, B3, B4:2..5;
SB: real
end;
Тут змінна SB має зміст середнього бала, В1, В2,.., В4 -бали з відповідних предметів; ідентифікатор FAM позначає рядок символів для зберігання прізвища студента. Змінна STD (ім'я запису) - це структура для зберігання інформації про одного студента. Якщо, як у наведеному прикладі, в пам'яті треба зберігати інформацію про 24-х студентів групи, то вводять масив PZ11, що є масивом записів
var PZ11:array[1..24] of STD;
Компонент запису вибирають за іменем запису та іменем цього компонента, розділених крапкою. У записах компоненти називають полями. Опишемо ще змінну:
var
STR: STD;
Приклади звертання до окремих полів: STR.FAM, STR.B3, PZ11 [8].SB. Ці імена називають селекторами запису, у програмах їх використовують так само, як і змінні інших типів. Наприклад, для обчислення середнього бала можна застосувати оператор присвоєння:
PZ11 [i].SB:=(PZ11 [і].В1 +PZ11 [i].B2+PZ11 [i].B3+PZ11 [і].В4)/4;
Можливі й такі оператори присвоєння:
PZ11[22].FAM:='Юpкiв Юрій';
PZ11[4].B4:=5;
PZ11[i+1].SB:=4.712;
Тобто з компонентами записів можна виконувати операції згідно з їхнім типом.
З іншого боку, у мові Паскаль немає жодної операції, яка сприймала б запис як щось ціле. Однак за допомогою оператора присвоєння можна пересилати значення одного запису в інший. Наприклад, враховуючи опис типу STD, вводять змінні
Var Z1,Z2: STD;
Тоді в програмі можна записати оператор
Z1:=Z2,
який буде еквівалентний таким операторам:
Z1.FAM:=Z2.FAM;
Z1.B1:=Z2.B1;
Z1.B2:=Z2.B2;
Z1.B3:=Z2.B3;
Z1.B4:=Z2.B4;
Z1.SB:=Z2.SB;
Зрозуміло, що до виконання оператора Z1 :=Z2 значення всіх компонент змінної-запису Z2 повинні бути визначені. А присвоювати структури даних, що є значеннями змінних комбінованого типу, можна тільки змінним того ж комбінованого типу.
Записи застосовують також як параметри процедур і функцій, аналогічно, як використовують для цього масиви. Значенням функції запис бути не може.
Оператор приєднання
У програмах, пов'язаних з опрацюванням записів, доводиться зазначати в операторах селектори запису, що є складеними іменами. Це приводить до збільшення програм, зайвої їх громіздкості. В мові Паскаль цей недолік усунуто за допомогою оператора приєднання, який забезпечує доступ до компонентів запису так, ніби вони є прості змінні.
Загальний вигляд оператора приєднання такий:
with <ім'я_запису> do <оператор S>
Застосувавши такий оператор, до компонентів запису всередині оператора S можна звертатися вже тільки за іменем поля, не називаючи імені запису. Наприклад, оператор уведення масиву PZ11 можна записати
for i:=1 to M do
with PZ11[i] do
read(FAM, В1, В2, ВЗ, В4);