next up previous

Next: 5.2.2 Массивы
Up: 5.2 Структурированные типы данных
Previous: 5.2 Структурированные типы данных

5.2.1 Записи

Самый общий метод получения составных объектов -- это объединение некоторого фиксированного числа не обязательно однотипных объектов в новый объект, называемый записью. Объединяемые объекты называются полями записи и снабжаются индивидуальными (различающими их) идентификаторами -- именами полей, через которые и осуществляется вся работа с полями записи. Тип записей определяется синтаксической диаграммой, приведенной на рис. 5.3.
Figure 5.3: Тип записей
Например, можно определить следующие типы записей:

type КОМПЛЕКСНЫЙ = record RE, IM : Real end;
ДАТА = record ДЕНЬ:1..31; МЕСЯЦ:1..12; ГОД:1901..2000 end;
ДЕТАЛЬ = record НОМЕР:Integer; ВЕС:Real; СТАТУС:Boolean; ЦЕНА, СТОИМОСТЬ : Integer end;

Тип КОМПЛЕКСНЫЙ -- это все возможные упорядоченные пары вещественных чисел; первое число каждой пары имеет имя RE, а второе -- имя IM. Тип ДАТА -- множество записей, каждая из которых состоит из трех полей. Первое поле (его имя ДЕНЬ) имеет тип отрезок целых от 1 до 31, второе поле (МЕСЯЦ) -- отрезок целых от 1 до 12, а третье (поле с именем ГОД) -- отрезок целых от 1901 до 2000. Тип ДАТА содержит записи для всех комбинаций значений типов полей, например, включая запись, имеющую следующие значения полей: 31,2,87 (хотя хорошо известно, что не все комбинации значений полей имеют смысл -- являются датами реальных дней).

Figure 5.4: Поле переменной типа записей
Пусть имеются описания переменных

var А, AA : КОМПЛЕКСНЫЙ; В, BB : ДАТА; С, CC : ДЕТАЛЬ; D : Integer; E : Real; F : Boolean;

тогда правильны следующие операторы:

C:=CC; F:=A=AA; F:=B$<>$BB; A.RE:=3.14; A.IM:=E*(A.IM+A.RE); Read(В.ДЕНЬ, В.МЕСЯЦ, В.ГОД); D := Abs(С.ЦЕНА-С.СТОИМОСТЬ).

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

A.RE:=3.14

заменяет в переменной А текущее значение первого поля на число 3.14, а оператор

Read(В.ДЕНЬ, В.МЕСЯЦ, В.ГОД)

последовательно вводит три целых числа из файла Input и присваивает их полям ДЕНЬ, МЕСЯЦ, ГОД переменной В. Оператор

D := ABS(С.ЦЕНА-С.СТОИМОСТЬ)

вычисляет значение, равное абсолютной величине разности между текущими значениями полей ЦЕНА и СТОИМОСТЬ переменной С, и присваивает это значение переменной D. Рассмотрим небольшой пример использования записей.

program СТАТИСТИКА;
{Анкета студента содержит следующую информацию:
факультет ('F' -- физический, 'M' -- математический, 'C'-- химический),
день рождения (месяц, число) и средний балл.
В заданной последовательности анкет определить, есть ли среди анкетированных студентов такие математики, которые родились в первую и третью декаду февраля и имеют балл больше четырех.}
const МАТЕМАТИЧЕСКИЙ = 'M'; ДА = 'Анкеты таких математиков в списке есть'; НЕТ = 'Анкет таких математиков в списке нет';
type АНКЕТА = record ФАК :Char; МЕСЯЦ:1..12; ЧИСЛО:1..31; БАЛЛ:Real end;
var НАЙДЕН :Boolean; A: АНКЕТА ;
begin НАЙДЕН := False;
while not (Eof or НАЙДЕН ) do
begin Read(A.ФАК, А.МЕСЯЦ, А.ЧИСЛО, А.БАЛЛ );
НАЙДЕН := (А.ФАК=МАТЕМАТИЧЕСКИЙ)and (А.БАЛЛ > 4) and ((A.ЧИСЛО > 20) or (A.ЧИСЛО>20)) and (А.МЕСЯЦ = 2)
{Input содержит такую анкету <--> НАЙДЕН}
end;
{Input содержит такую анкету <--> НАЙДЕН}
if НАЙДЕН then Write (ДА) else Write (НЕТ)
end.

Next: 5.2.2 Массивы
Up: 5.2 Структурированные типы данных
Previous: 5.2 Структурированные типы данных


© В.Н. Касьянов, 2001