logo
методичка_1_05_ВНУ

Комбіновані типи Організація комбінованих типів у Паскалі

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

Спрощена форма визначення запису включає ім'я запису, імена окремих компонент і відповідних їм типів даних:

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[i].В1 +PZ11 [i].B2+PZ11 [i].B3+PZ11[і].В4)/4;

Можливі й такі оператори присвоєння:

PZ11[22].FAM:='Юрків Юрій';

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 повинні бути визначені. А при­своювати структури даних, що є значеннями змінних комбіно­ваного типу, можна тільки змінним того ж комбінованого типу.

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

Запишемо програму обчислення середнього бала кожного студента, використовуючи опис запису STD:

program BAL;

const M=24;

type

STD=record

FAM: string[15];

B1.B2, ВЗ, В4: 2..5;

SB: real

end;

var

PZ11: array [1..M] of STD;

i: integer;

begin

for i:=1 to M do

read(PZ11[i].FAM,PZ11[i].B1,PZ11[i].B2,PZ11[i].B3,PZ11[i].B4);

for i:=1 to M do

begin

PZ11[i].SB:=(PZ11[i].B1+PZ11[i].B2+PZ11[i].B3+PZ11 .B4)/4;

writeln(PZ11 [i].FAM,PZ11 [i].SB)

end ;

end.