В этом примере объявляется тип circle (окружность), который представляет собой запись с полями x, y (координаты центра) и r (радиус). Переменные a и b содержат записи типа circle.
Как и в массиве, значения переменных типа записи можно присваивать друг другу, если их типы совпадают. Доступ к каждому из компонентов записи осуществляется указанием составного имени, состоящего из имени переменной-записи и имени поля, которые разделяются точкой. Например,
a.x := -5; b.y := 6; a.r := 2;
Как и массивы, записи нельзя целиком сравнивать и выводить на экран; эти операции выполняются покомпонентно. Раздел записи может представлять собой описание массива или ранее объявленной записи, при этом глубина вложенности конструкций не ограничена. Имена полей должны быть уникальными в пределах той записи, где они были объявлены, однако на разных уровнях вложенности имена могут повторяться. Например
date = record
day: 1..31;
month: 1..12;
year: word
end;
person = record
name: string[20];
birthday: date;
param: array[1..3] ofbyte;
year: word
end;
pers: person;
mp: array [1..10] ofperson;
В последнем примере запись типа person включает в себя следующие поля структурных типов: name – строка символов, date – запись с полями день, месяц, год и param – массив из трех элементов типа byte. Имя поля year повторяется в записях типа date и типа person, однако значения этих полей физически никак не связаны. Переменная mp представляет собой массив из записей типа person. Доступ к отдельным компонентам такой структуры можно проиллюстрировать на следующем примере:
pers.name := ‘Иванов’;
pers.birthday.day := 12;
pers.birthday.month := 6;
pers.birthday.year := 1967;
pers.param[1] := 5;
mp[3] := pers; { допускается присвоение переменных типа запись друг другу }
В результате выполнения приведенного фрагмента программы на экран будет выведено: «Иванов 1967 5»
9.1 Оператор присоединения with
Чтобы упростить доступ к полям записи, в Паскале введен специальный оператор присоединения, который записывается следующим образом:
with<переменная> do<оператор>
Здесь with, do– зарезервированные слова (с, делать);
<переменная> – имя переменной типа запись, за которой может следовать список вложенных полей;
<оператор> – любой оператор Турбо Паскаля.
Оператор with, собственно, ничего не делает. Он служит для упрощения формы записи: в операторе, стоящем после do, можно использовать имена полей в качестве обычных переменных, при этом имя переменной-записи присоединяется автоматически. Например,
withpers doname := ‘Иванов’;
beginday := 12; month := 6; year := 1967 end;
Пример 1. Написать программу, которая вводит массив записей и затем выводит его на экран в виде таблицы. Каждая запись должна содержать следующие поля: фамилию, дату рождения (число, месяц, год) и место рождения (город). Количество записей - до 5.
Решение. Для наглядности введем дополнительный тип данных, представляющий дату и включающий три поля: число, месяц, год (в рамках данной задачи это, строго говоря, необязательно). Тогда основной тип данных будет представлять собой запись со следующими полями: фамилия (строка символов длиной до 20), дата рождения (запись типа дата) и место рождения (строка символов длиной до 20). Фактическое количество записей в массиве будем вводить с клавиатуры. Программа логически делится на две части – ввод и вывод данных. Ввод трудностей не представляет, достаточно попросить пользователя ввести по очереди все поля каждой записи. Для этого подходит циклическая структура типа for. Вывод реализовать немного сложнее, поскольку последовательный вывод значений полей не образует таблицу. Здесь возможны два варианта – использовать сложный форматный вывод данных с учетом фактической длины строк типа string, либо позиционирование курсора с помощью процедур и функций модуля CRT. Второй путь проще и дает больше возможностей. Действительно, можно очистить экран, а затем перед выводом очередного поля позиционировать курсор в нужную позицию текущей строки. Чтобы таблица выглядела красиво, нужно еще вывести ее заголовок (шапку) перед циклом вывода данных, а также правильно рассчитать позиции на экране. Текст программы с использованием модуля CRT приведен ниже.
program test_rec;
{ Программа иллюстрирует работу с данными типа запись }