Главная » Free Pascal » Записи с вариантами Free Pascal

0

Примеры записей, приводившиеся до сих пор, характеризовались фиксирован- ным набором полей. Однако иногда встречаются документы, имеющие в начале фиксированный набор полей, а в конце — набор полей, количество и состав кото- рых зависят от некоторого параметра. Типичным примером документа такого рода является анкета служащего, используемая в отделах кадров. Начальные поля такой анкеты одинаковы и для мужчин, и для женщин (фамилия, имя, отчество, дата и место рождения, адрес и т. п.). Однако в дополнительных полях для мужчин могут присутствовать такие поля как отношение к воинской службе, учетно-воинская специальность и другие данные, характерные только для представителей мужского пола. Такого рода записи, у которых последние поля могут иметь несколько разных форматов, называют записями с вариантами.

Мы рассмотрим специфику их обработки на конкретном примере. Представим себе запись с именем TFigure (Фигура), которая предназначена для хранения ин-

формации об одном из следующих графических объектов — прямоугольнике (Rec- tangle), квадрате (Quadrate) и окружности (Circle). Очевидно, что каждая из этих фигур характеризуется разным набором параметров. Общими данными для них мо- гут быть:

± координаты точки привязки x, y (т. е. точки, определяющей положение фигуры в области отображения);

± тип фигуры.

Структура такой записи может быть описана следующим образом:

type

TShape = (Rectangle, Circle, Quadrate);

TFigure = record x,y : double; z : TShape; case TShape of

Rectangle : (Height,Width : double); Circle : (Radius : double);  Quadrate : (Length : double);

end;

Описанная таким образом структура может быть использована в программе вычисления площади фигуры (листинг 8.1).

   Листинг 8 .1 .  Программа  вычисления  пл ощад и  ф игуры  rec_var                    

program rec_var; type

TShape = (Rectangle, Circle, Quadrate);

TFigure = record x,y : double; z : TShape; case TShape of

Rectangle : (Height,Width : double); Circle : (Radius : double);

Quadrate : (Length : double); end;

var

q : TFigure;

function S(p:TFigure):double; begin

with p do case z of

Rectangle: S:=Height*Width;

Circle  : S:=pi*sqr(Radius); Quadrate : S:=sqr(Length);

end; end;

begin

q.z:=Rectangle;

write(‘Height = ‘); readln(q.Height); write(‘Width = ‘); readln(q.Width); writeln(‘Area = ‘,S(q):6:2); q.z:=Circle;

write(‘Radius = ‘); readln(q.Radius); writeln(‘Area = ‘,S(q):6:2); q.z:=Quadrate;

write(‘Length = ‘); readln(q.Length); writeln(‘Area = ‘,S(q):6:2);

readln; end.

Результаты работы программы rec_var приведены на рис. 8.1.

Рис. 8.1. Вычисление площади фигур

Обратите внимание на следующую деталь в программе rec_var: в качестве на- звания поля Длина квадрата использовано имя Length, совпадающее с названием системной функции. На самом деле имена функций не относятся к зарезервирован- ным словам языка, и в программе их можно использовать для обозначения каких- либо объектов.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии