При организации хранения информации на ЭВМ требуется группировать данные разного типа, логически относящиеся к одному объекту. Например, целесообразно объединить данные об автомобиле и его владельце (номер, марка машины, год выпуска, цвет, фамилия владельца, его адрес) в одной структуре. Для этого в языке Pascal предназначен комбинированный тип, который называется запись. Записи могут использоваться в любых случаях, где желательно группировать логически связанные элементы в один блок.
Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов разного типа. Определение типа начинается идентификатором Record и заканчивается ключевым словом end. Между ними заключён список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля.
Формат описания типа запись:
Type
<имя типа> = Record
<Идентификатор поля>:<Тип компонента>;
.......
<Идентификатор поля>:<Тип компонента>;
end;
Var
<Идентификатор, ...> : <Имя типа>;
Пример 1.
Type
avto = Record
Nomer:string[6]; { Регистрационный номер }
Marka:string[15]; { Марка автомобиля }
God:integer; { Год выпуска }
Color: string[20]; { Цвет }
Fam:string[20]; { Фамилия владельца }
Adress:string[40]; { Адрес владельца }
end;
Var
m,v:avto;
В данном примере запись avto содержит 6 компонентов: номер, марка машины, год выпуска, цвет, фамилия владельца, его адрес. Доступ к полям записи осуществляется через переменные m и v типа Record.
Имя поля должно быть уникальным в пределах записи. Объём памяти, необходимый для хранения записи, складывается из длин полей.
Значения полей записи могут быть использованы в выражениях. Обращение к значению поля осуществляется с помощью составного имени, включающего идентификатор переменной и идентификатор поля, разделённые точкой. Например, чтобы получить доступ к полям записи m типа avto, надо записать:
Для присваивания полям записей значений используются оператор присваивания:
m.nomer:=’ав345х’;
m.marka:=’ВАЗ 2110’;
m.god:=1995;
Составные имена можно использовать, в частности, в операторах ввода-вывода:
Write(’Введите фамилию владельца автомобиля ’,m.nomer, ’ ’);
Readln(m.fam);
Допускается применение оператора присваивания к записям в целом, если они имеют один и тот же тип, например m:=v. После этого значения полей записи m станут равны значениям соответствующих полей записи v.
В ряде задач удобно пользоваться массивами из записей. Их можно описать, например, следующим образом:
Type
Person = record
Fam:string[20]; { фамилия сотрудника }
Pol:char; { Пол сотрудника }
Age:16..60; { Возраст сотрудника}
Dolgnost: string[20]; { Должность }
end;
Var
otdel:array [1..50] of Person;
Обращение к полям записей имеет несколько громоздкий вид, что особенно заметно при использовании идентификаторов длиной более 5 символов. Для решения этой проблемы применяется оператор With, который имеет следующий формат:
With <переменная типа record> do <оператор>;
Один раз указав имя переменной типа Record в операторе With, далее в пределах блока <оператор> можно работать с именами полей, как с обычными переменными, то есть без указания перед идентификатором поля имени переменной, определяющей запись:
With Otdel[25] do
begin
fam:=’Васильев’;
Pol:=’М’;
Age:=45;
Dolgnost:=’Директор’;
end;
Pascal допускает вложение записей друг в друга, т.е. поле в записи может в свою очередь быть записью, соответственно оператор With может быть вложенным.
Записи используются обычно для организации файлов с данными на магнитных дисках.
Задания
Организовать ввод, хранение в массиве, вывод на экран следующих данных:
1. Информация о движении поездов включающая номер поезда, пункт отправления, пункт назначения, дата и время отправления, время в пути.
2. Информация о продаже билетов в кинотеатре, включающая дату, время сеанса, ряд, место, признак проданного билета.
3. Информация о знакоместах экрана монитора, работающего в текстовом режиме: строка, позиция в строке, символ, цвет символа, цвет фона.
4. Информация об адресе человека: почтовый индекс, страна, город, улица, номер дома, номер квартиры.
5. Информация о владельцах животных: фамилия владельца, вид животного, порода, окрас, пол, возраст животного.
6. Экзаменационная ведомость: предмет, номер группы, дата экзамена, 10 строчек с фамилиями студентов, номерами их зачётных книжек, оценками.
7. Информация о движении самолетов: номер рейса, пункт назначения, периодичность, тип самолета, время вылёта, время прилёта.
8. Информация о командах, участвующих в турнире по хоккею: название команды, город, количество побед, ничьих, поражений, количество забитых и пропущенных шайб.
9. Информация о лекарствах, имеющихся в аптеке: название, фирма-производитель, вид (таблетки, мазь, микстура и т.д.), цена, дата изготовления, срок годности, признак разрешения свободной продажи.
10. Информация о квартиросъёмщиках в многоквартирном доме: номер квартиры, фамилия квартиросъёмщика, подъезд, этаж, общая площадь, жилая площадь, количество проживающих.
11. Информация о выдаче книг в библиотеке: шифр книги, тематика, автор, название, издательство, год издания, количество страниц.