
- •9. Перечисляемый тип данных. Строковый тип. Множества. Записи. Файлы
- •9.1. Перечисляемый тип данных
- •Var days: week;
- •9.2. Строковые данные. Типы Char и String
- •Var s1 : String[40];
- •Var Str1, Str2: String[20]; Ch1, Ch2 :Char;
- •Var s: String[20]; I:integer;
- •Var I: byte; begin
- •Var Str_1, Str_2, Str_3:string[10];
- •Insert('any', Str_3,5);
- •9.3. Множества
- •9.3.1. Описание и инициализация множеств
- •9.3.2. Предметные операции с множествами
- •9.3.3. Операции сравнения над множествами
- •9.3.4. Цикл типа For..In. Вывод множеств и их элементов.
- •Var d: week;
- •9.4. Записи
- •Var p_Data: Pers_Data;
- •Var p_Data: record fam:string[20]; adr:string[40]; tel:string[15];
- •Var woker_alpha: woker_firm;
- •Var woker_alpha: array [1..30] of Pers_Data;
- •9.5. Файлы
- •9.5.1. Описание файловых переменных
- •9.5.2. Стандартные операции с файлами. Связывание логических и физических файлов
- •9.5.3. Ввод и вывод данных из физических файлов. Вспомогательные действия
- •9.5.4. Примеры решения задач по обработке текстовых файлов
- •Var I:byte;n:integer; ft:text; FileName,st:string;
- •Var I,Lmas:integer; ft:text; FileName:string;
- •Var n,I:integer; ft:text; FileName:string;
- •Var str,w_s:string;
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, вывести содержимое полей на экран.