Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_Lektsia_9.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
355.33 Кб
Скачать

Var woker_alpha: woker_firm;

2) вариант с непосредственным описанием переменной-массива woker_ALPHA:

Var woker_alpha: array [1..30] of Pers_Data;

Записи, имеющие постоянную структуру (состав полей), называют фиксированными (англ.-fixed records). Наряду с ними в Паскале есть возможность использовать записи с вариантами (англ.-records with variant parts), в описании которых используется зарезервированное слово case, позволяющее задавать несколько вариантов заполнения специальному полю записи. Такой вид записей удобно использовать для хранения в записях одного типа таких данных, у которых основная часть полей имеет совпадающий тип, но имеются поля, в которые может заноситься различающаяся по типу информация. В любом типе записи может присутствовать только одна вариантная часть, которая должна располагаться после описания всех полей с фиксированными типами. Она может быть как именованной, так и неименованной.

Синтаксис строки, открывающей вариантную часть записи:

case [имя селектора :] тип селектора of:

После данной строки идут строки, которые начинаются очередным значением селектора, за которым стоит двоеточие и описание поля для данного варианта значения селектора. Если имя селектора не задано, его называют безымяынным.

Все варианты значений соответствующего поля занимают в памяти одно и то же адресное пространство памяти. Поэтому для конкретного объекта нужно указывать только одну из альтернатив, задаваемых селектором.

У записей с вариантами внесение данных в фиксированные поля производится так же, как и у фиксированных записей. Заполнение вариантной части записи начинается с уcтановки значения варианта заполнения поля, которое выполняется в виде присваивания необходимой величины селектору. Затем производится обычное присваивание значений.

Если селектор безымянный, то при заполнении вариантной части записи присваивания полям выполняют через их составные имена, как и для фиксированных полей.

Пример 7. Рассмотрим пример программы, содержащей тип записи с вариантами, имеющей безымянный селектор, описание записи данного типа, засылку данных в ее поля и вывод их содержимого на экран:

type

TVarRec = record { начало описания типа}

ch: char;

case byte of { Используется безымянный селектор }

1: (i: integer); { поле i имеет целый тип integer }

2: (d: double); { поле d имеет вещественный тип double }

end; { коней описания типа}

var Rec: TVarRec; { описание переменной Rec типа TVarRec }

begin { начало тела основной программы}

Rec.ch:='A'; { присваивание значения символьному полю ch }

Rec.i := 5; { присваивание значения целому полю i }

writeln(' Field values 1: Rec.ch=',Rec.ch,' Rec.i=',Rec.i);{вывод значений полей}

Rec.d:= Rec.d + 1.2345; { изменение значения вещественного поля d}

writeln(' Field values 2: Rec.ch=',Rec.ch,' Rec.i=',Rec.i,' Rec.d =',Rec.d);

end.

В итоге работы программа выдаст на экран следующие данные:

Так как оба поля вариантной части i и d начинаются по одному и тому же адресу, то изменение значения вещественного поля d изменило ранее вставленное значение целого поля i .

Пример 8. Необходимо выполнить следующие действия:

а) разработать тип записи TCircle, в которой будет содержаться информация об окружности на декартовой плоскости,

б) описать переменные Circle_1, Circle_2 этого типа.,

в) ввести в поля переменной Circle_1 данные, используя их составные имена, взять второй вариант данных в вариативном поле, вывести содержимое полей на экран,

г) ввести в поля переменной Circle_2 данные, используя оператор присоединения with, при третьем варианте данных в вариативном поле, вывести содержимое полей на экран.

Решение. Так как цвет и толщина линии, которой изображается окружность, должны быть заданы всегда, для любой окружности, то соответствующие им поля в типе TCircle должны иметь постоянный тип.

Вариативную часть типа TCircle задает набор геометрических условий, задающих положение и размер плоской окружности. Простейшими возможными вариантами являются:

1) декартовы координаты центра (xc,yc) и радиус окружности r,

2) координаты центра (xc,yc) и диаметр окружности d,

3) три точки с декартовыми координатами (x1,y1),(x2,y2),(x3,y3), не лежащие на одной прямой, через которые проходит окружность.

С учетом предложенного состава описания типа TCircle получим следующий код, решающий поставленную задачу:

type TCircle = record

color: byte; {описание цвета}

width: real; {описание толщины линии}

case g: byte of {варианты задания размера и положения окружности на плоскости}

1:(xc,yc,r: real);{декартовы координаты центра (xc,yc) и радиус окружности r }

2:(xc1,yc1,d: real);{декартовы координаты центра (xc,yc) и диаметр окружности d }

3:(x1,y1,x2,y2,x3,y3:real);{дек.координаты трех точек, через которые проходит окружность} end;

var Circle_1,Circle_2: TCircle; {описания окружностей Circle_1,Circle_2}

begin {начало тела основной программы}

Circle_1.color:=15; {засылка данных в Circle_1 с использованием составных имен полей}

Circle_1.width:=0.5; Circle_1.g:=2;

Circle_1.xc1:=20.5; Circle_1.yc1:=33.8; Circle_1.d:=10.0;

writeln(' Circle_1: color=',Circle_1.color, {вывод данных по Circle_1}

' width',Circle_1.width:8,' variant geom=',Circle_1.g);

writeln(' xc1=',Circle_1.xc1:8,' yc1',Circle_1.yc1:8,' d=',Circle_1.d:8);

with Circle_2 do{засылка данных в Circle_2 с использованием оператора присоединения with}

begin

color:=12; width:=1.5; g:=3;

x1:=20.5; y1:=33.8; x2:=20.5; y2:=33.8; x3:=20.5; y3:=33.8;

writeln(' Circle_2: color=',color,' width',width:8,' variant geom=',g);

writeln(' x1=',x1:8,' y1',y1:8,' x2=',x2:8,' y2',y2:8,' x3=',x3:8, 'y3',y3:8);

end;

end.

Вариантный характер записи можно использовать не только при занесении в нее информации, но и при ее чтении – одна и та же конкретная запись может быть прочитана при различном истолковании типа ее вариантных полей.

Вопросы для проверки знаний.

1. Что называют записями и полями записей ?

2. Какова структура записи ?

2. Укажите две формы задания типа записи ?

3. Какие имена называют составными и как их используют для доступа к содержимому полей записи?

4. Как можно организовать доступ к полям записи без использования составных имен?

5. Какие записи называют записями с вариантами и когда целесообразно их использовать?

6. Какую структуру имеют записи с вариантами ?

7. Можно ли одновременно применить несколько вариантов типов поля в вариантной части записи ?

Практическое задание.

1. Выполнить следующие действия:

а) разработать тип записи TRectangle, в которой будет содержаться информация о прямоугольнике на декартовой плоскости со сторонами, параллельными осям, который полностью задан цветом линии, координатами левой верхней и правой нижней вершин,

б) описать переменные Rect_1, Rect_2 этого типа,

в) ввести в поля переменной Rect_1 данные, используя их составные имена, вывести содержимое полей на экран,

г) ввести в поля переменной Rect_2 данные, используя оператор присоединения with, вывести содержимое полей на экран.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]