Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ПАСКАЛЕ.doc
Скачиваний:
12
Добавлен:
04.09.2019
Размер:
2.98 Mб
Скачать

9. Комбинированный тип. Данные типа record

Ранее было рассмотрено, как удобно работать с массивами. Однако все элементы массива всегда должны иметь один и тот же тип. И в ряде случаев это вызывает определенные ограничения.

Рассмотрим в качестве примера задачу заполнения анкеты с некоторыми данными, например: имя, адрес, телефон, возраст, пол, семейное положение. Каждое из этих данных имеет свой тип. Однако все эти данные взаимосвязаны, принадлежат всегда одному человеку, и хотелось бы, чтобы все они имели общее имя. Для таких случаев Паскаль предоставляет новый, комбинированный тип переменной, называемой записью – тип RECORD.

9.1. Оператор типа record

Так же, как и массив, запись объединяет переменные. Однако у записи переменные могут быть различных типов. Каждая компонента записи называется полем. Каждое поле записи имеет свой тип.

Мы уже знаем, что элементы массива всегда могут использоваться как отдельные переменные. Например, определив

type RY = array [1..10] of integer;

var A : RY ,

можно писать А [1], ..., A [10]. Аналогичная ситуация имеет место и для записи. Здесь также можно использовать поля записи как отдельные переменные, например:

type PATIENT = record

NAME : string [20];

MALADI : string [40];

AGE : integer;

MARIE : boolean;

end;

.......................

var NEKTO: PATIENT.

Это есть описание типа RECORD. Структура записи такого типа определяется здесь с помощью всех полей между RECORD и END (см. рис. 38).

В рассмотренном выше примере всей структуре этого типа присвоено имя PATIENT (пациент). Запись типа PATIENT состоит из четырех отдельных переменных, т.е. полей, которые имеют имена: NAME, MALADI, AGE, MARIE. Каждое из этих полей имеет свой тип. В разделе TYPE описывается тип PATIENT, который затем присваивается переменной NEKTO. Именно NEKTO есть переменная типа PATIENT, т.е. переменная типа RECORD.

Рис. 38. Синтаксическая диаграмма типа RECORD

Чтобы обратиться к некоторым полям записи, следует написать имя переменной и имя поля. Эти два идентификатора должна разделять точка, например:

NEKTO.NAME := 'MANUELA'; NEKTO.AGE := 20;

NEKTO.MALADI := 'GRIP'; NEKTO.MARIE := true.

Отметим, что поле записи, например поле NEKTO.AGE, может рассматриваться как обычная простая переменная целого типа: NEKTO.AGE := NEKTO.AGE + 1. Вместе с тем запись может рассматриваться как единое целое. Пусть имеется следующее описание:

type DATE = record

DAY : 1..31 ;

MONTH : (JAN, FEB, MAR, APR, MAY, JUN, JUL,

AUG, SEP, OCT, NOV, DEC);

YEAR : integer;

end;

var HB, MB : DATE .

Мы видим, что HB и MB имеют тип DATE. Помимо действий над отдельными полями записей HB и МB можно выполнять операции над всей записью, например: HB := MB.

Это присваивание эквивалентно следующей последовательности операторов:

HB.DAY := MB.DAY;

HB.MONTH : = MB.MONTH;

HB.YEAR := MB.YEAR.

Для переменных этого типа вводятся сравнения: «=» и «<>».

Так, в нашем случае логическое выражение МB = HB является истинным.

Так как на тип компонент массива не накладывается ограничений, то можно образовывать массивы, компонентами которых являются записи. Например, вместо VAR NEKTO: PATIENT можно записать VAR NEKTO: ARRAY [1..N] OF PATIENT. Тогда фамилию первого пациента можно указать как NEKTO [1]. NAME. Аналогично можно задать множество дат рождений N персон VAR BD: ARRAY[1..N] OF DATE.

Отсюда мы видим, что компоненты (элементы) массива BD есть записи. Чтобы обратиться к некоторому полю определенной записи массива, следует определить имя массива, индекс интересующей записи и имя необходимого поля. Например, для печати года рождения 3-й персоны необходим оператор WRITELN (BD [3].YEAR).

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