Записи з варiантами

Записи, описанi вище, мають строго визначену структуру. В деяких випадках це обмежує їх використання. В Паскалі є можливість задати тип запису, що містить довільне число варіантів структури. Такі записи називаються записами з варіантами. Вони складаються з необов'язкової фіксованої частини та варіантної частини. Варіантна частина описується з допомогою оператора CASE. Він задає особливе поле ознаки, яке визначає, який з варіантів в даний момент активізувати:

TYPE Zap = RECORD

CASE <поле ознаки> : < тип > OF

<константа вибору 1> : (<поле>,... : <тип>);

. . . . . . . . . . . . . . . . . . . .

<константа вибору n> : (<поле>,... : <тип>)

END;

Компоненти кожного варіанту даються в круглих дужках. В частині CASE немає окремого end.

Приклад:

Type Forma = Record

Name : String;

Case Flag : Boolеan of

True : (BirthPlace : String[40]);

False : (Country : String[20];

EntryPort : String[20];

EntryDate : 1..31;

ExitDate : 1..31 )

end;

В цьому прикладі тип Forma визначає запис з одним фіксованим полем Name і варіантною частиною, яка задається конструкцією Case .. of. Варіантна частина складається з двох частин, які визначаються константами вибору True та False. Після констант вибору слідує двукрапка і список полів в круглих дужках. Запис може мати лише одну варіантну частину, і, якщо вона є, то повинна розміщуватися за всіми фіксованими полями.

Важливою особливістю варіантної частини є та обставина, що всі задані в ній варіанти “накладаються” один на другого, тобто кожному з них виділена одна і та ж область пам’яті. Це надає додаткові можливості перетворення типів.

Приклад:

Var

X : Word;

Xb : Byte;

Xl : LongInt;

Mem4 : Record

Case Byte of

0 : (by : array[0..3] of Byte);

1 : (wo : array[0..1] of Word);

2 : (lo : LongInt);

End;

Begin

. . . .

With Mem4 do begin

Lo:=Trunc(2*pi*x);

If wo[1] = 0 then

If by[1] = 0 then Xb:=0

Else X:=wo[0]

Else Xl:=lo

End;

End.

Конструкція Case .. of, яка відкриває варіантну частину, зовні подібна на відповідний оператор вибору, але насправді грає роль лише службового слова, яке означає початок варіантної частини. Ключ вибору в конструкції Case .. of фактично ігнорується компілятором: єдиною вимогою, яка до нього є приналежність до перелічуваного типу.

Записи дозволяють об’єднати під одним іменем дані різних типів. Це зручно для розв’язування різноманітних задач. Спочатку треба описати тип запис за допомогою службового слова RECORD

Type complex = Record

Re, Im: Real;

end;

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

Використання типу RECORD можна проілюструвати в такому прикладі.

Приклад:

Програма, яка обчислює суму двох комплексних чисел.

Program Summa;

Type

Complex = Record

Re,Im:real;

end;

Var

C1, C2, C3: Complex;

R, I: Real;

Procedure IntC(var C: Complex; R, I: Real);

begin

with C do begin

Re:=R;Im:=I;

end;

end;

Procedure SumC(C1,C2: Complex; var C3: Complex);

begin

with C3 do begin

Re:=C1.Re+C2.Re;

Im:=C1.Im+C2.Im;

end;

end;

Procedure WriteC(C: Complex);

begin

with C do begin

write(Re);

if Im=0 then Exit;

if Im>0 then Write('+');

Write(Im);Write('i');

end;

end;

Begin

Writeln('побудувати число С1');

Readln(R,I); IntC(C1,R,I);

Writeln('побудувати число С2');

Readln(R,I);IntC(C2,R,I);

SumC(C1,C2,C3);

WriteC(C);

End.

Приклад:

Сформувати масив записів про: прізвище студента, ім’я; оцінки з фізики, математики, інформатики.

Обчислити кількість студентів, середній бал яких більший, або рівний “4”.

Текст програми

program Zap;

const n=2;

type TMarks=record

f:integer;

m:integer;

inf:integer;

end;

Tst=record

surname:string[15];

name:string[10];

marks: TMarks;

ser:real;

end;

Tgr=array[1..n] of Tst;

var gr:Tgr; k,i:integer;

begin

for i:=1 to n do

with gr[i],marks do begin

readln(surname);

readln(name);

readln(f);

readln(m);

readln(inf);end; K:=0;

for i:=1 to n do

with gr[i],Marks do begin

ser:=(f+m+inf)/3;

if gr[i].ser>=4 then

k:=k+1;writeln('ser',i,'=',ser:2:1); end;

writeln('k=',k);

end.

Результат виконання програми

Kas

Oleh

Top

Olena

ser1=4.7

ser2=3.3

k=1