3.5 Вариантные записи
Основная идея вариантной записи состоит в том, чтобы в рамках единой структуры определить сразу несколько альтернативных записей. В общем случае такая запись может состоять из двух частей: фиксированной и вариантной. Фиксированная часть - это обычная совокупность полей; ее структура остается постоянной для всех экземпляров записей данного типа.
Структура вариантной части записи не постоянна: она изменяется в зависимости от значения особого поля, называемого полем признака. Фиксированная (общая) часть структуры записи должна предшествовать вариантной части.
Вариантная часть имеет вид:
case < поле признака>: <тип поля признака> of
<конст1 или список конст1>: (<список полей1>: <тип поля>);
<конст2 или список конст2>: (<список полей2>: <тип поля>);
. . . . . . . . . . . . . . .
<констN или список констN>: (<список полейN>: <тип поля>);
Замечание. Вариантная часть не завершается словом end. Служебное слово end завершает всю запись и одновременно ее вариантную часть.
Значение селектора, указывающее на тот или иной вариант, записывается перед использованием записи. В зависимости от значения поля признака вариантная часть записи будет иметь различные поля.
Пример 3. Требуется вычислить площади различных геометрических фигур: квадрата, прямоугольника, треугольника, окружности. Квадрат задается длиной стороны, прямоугольник - длинами смежных сторон, треугольник - длинами двух сторон и углом между ними (угол задается в градусах), окружность - радиусом.
program GEOM_FIGURA;
type
figura = (kv, pr, tr, okr);
gm_figura = record
pl: real;
case geomf: figura of
kv: (a: real);
pr: (da, db: real);
tr: (dl1, dl2, alfa: real);
okr: (r: real)
end;
var
gr: gm_figura;
n: 1..4;
begin
Writeln ('Введите тип фигуры:');
Writeln ('1-квадрат, 2-прямоугольник, 3-треугольник, 4-окружность');
Readln(n);
with gr do
begin
case n of
1: geomf:=kv;
2: geomf:=pr;
3: geomf:=tr;
4: geomf:=okr
end;
case geomf of
kv: begin Write('Введите сторону квадрата - ');
Readln(a); pl:=sqr(a)
end;
pr: begin Write('Введите стороны прямоугольника - ');
Readln(da, db); pl:=da*db
end;
tr: begin Write('Введите стороны тр-ка и угол - ');
Readln(dl1, dl2, alfa);
alfa:=alfa*PI/180; pl:=dl1*dl2*sin(alfa)/2
end;
okr: begin Write('Введите радиус окружности - ');
Readln(r); pl:=PI*sqr(r)
end
end;
Writeln('Площадь фигуры равна ', pl:5:2)
end
end.
Вариантная запись может быть вложена в другую, тоже вариантную запись.
