Тип запись
Классификация: нестандартный, структурированный (сложный) тип.
Имя определяет программист.
Запись - структура данных, состоящая из фиксированного числа компонентов, названных полями. Каждое поле имеет свое уникальное имя. Компоненты записи могут быть разных типов.
Отличие записи от массива:
- компонентами являются данные разных типов;
- элементу массива соответствует(ют) индекс(ы), а элементу записи (полю) - имя поля.
Таким образом, данное типа запись есть информационная модель объекта, представляющего собой совокупность фиксированного количества разнотипных компонентов. Например, анкетные данные об учащемся - фамилия, год рождения, пол.
Структурная организация
По структуре тип запись - последовательность поименованных полей (рис.22.1). Размер поля определяется типом полей.
Имя первого поля | Тип поля | |
Имя второго поля | Тип поля | |
... | ||
... | ||
Имя последнего поля | Тип поля |
Рис. 22.1. – Структура записи
Определение типа
В общем случае данное типа запись состоит из двух частей – постоянной и вариантной. Пока определим только тип запись с постоянной частью (рис.22.2). Запись с вариантной частью определим позднее.
Например, определим тип запись для анкетных данных ученика
type anketa = record
fam:string[20];
gr: word;
pol:char
end;
Рис. 22.2. – Определение типа запись
Множество значений
Каждое поле может принимать в качестве значения любую величину из множества значений, которое определяет тип поля. Множество значений типа запись включает в себя все значения, которые могут быть размещены в структуре, заданной определением типа.
Множество операций
|
Не существует операций над записью целиком (за исключением унарной операции определения адреса переменной типа запись). Можно выполнять операции с компонентами записи - полями. Тип поля определяет набор операций, которые можно выполнять над полями. Элемент записи (поле) определяется синтаксической диаграммой, показанной на рис. 22.3.
Рис. 22.3. – Элемент записи
Например, имеется var ank:anketa; {тип anketa определен ранее}, необходимо занести в эту переменную анкетные данные Иванова 1965 года рождения:
ank.fam:='Иванов';
ank.gr:= 1965;
ank.pol:='м'
Можно идентифицировать поле записи короче, если использовать присоединяющий оператор, синтаксис которого показан на рис. 22.4.
Рис. 22.4. – Присоединяющий оператор
В операторе, стоящем после символа DO, поле записи можно задавать только именем поля. В этом операторе все имена проверяются на принадлежность записи, имя которой указано после символа WITH. Если имя совпадает с именем поля, то действия производятся над полем записи. Поэтому необходимо быть осторожным при совпадении имен переменных с именами полей записей. Приведенный выше пример может быть записан следующим образом:
with ank do begin
fam:='Иванов';
gr:= 1965;
pol:='м'
end
Имя записи не должно содержать никаких переменных, подлежащих изменению в операторе, стоящем после WITH. Например, если имеется var inform:array[1..100]of anketa, то нельзя записать следующие действия:
with inform[i] do begin
fam:='Иванов';
gr:= 1965;
pol:='м';
i:=i+1
end
так как изменение i внутри тела оператора присоединения изменяет имя записи, которая присоединяется к полям. В этом случае правильной будет следующая последовательность операторов:
|
with inform[i] do begin
fam:='Иванов';
gr:= 1965;
pol:='м'
end;
i:=i+1
Пример использования данных типа запись
О самолете имеется следующая информация:
- бортовой номер (целое число)
- тип самолета (название, состоящие из символов. Например,
- ТУ154, ИЛ86, ЯК42)
- дата очередного профилактического ремонта (день в пределах 1..31, месяц в пределах 1..12, год - целое число);
- бригада, проводившая последний профилактический ремонт (фамилия бригадира, последовательность символов)
Информационная структура представляет собой фиксированный набор разнотипных компонентов, поэтому структура - типа запись. Определить тип ТINF, как тип запись, состоящую из 4-х полей:
ТINF = record
bort:longint;
tip_sam:string[5];
d_prof:data;
brigada:string[10]
end;
запись типа data имеет структуру:
data=record
den:1..31;
mes:1..12;
god:word
end;
Как только объявим переменную SAM типа INF var SAM:INF;
так сразу же в памяти получим структуру, изображенную на рис. 22.5.
SAM | ОП | |
SAM.bort | Longint | Longint |
SAM.tip_sam | String[5] | String[5] |
SAM.d_prof.den | 1..31 | 1..31 |
SAM.d_prof.mes | 1.. 12 | 1.. 12 |
SAM.d_prof.god | Word | Word |
SAM.brigada | String[10] | String[10] |
Рис. 22.5. – Переменная SAM в ОП
Постановка задачи
К аэропорту приписано 200 самолетов. Определить все самолеты, которым на завтра предписан профилактический ремонт.
Задача относится к информационно-поисковым системам. Алгоритмы их достаточно просты. Основным является выбор структуры данных - разработка информационной модели адекватной исследуемым объектам. Для нашего случая, в качестве информационной модели можно выбрать массив из 200 элементов типа запись. Структура этой записи приведена на рис. 22.5.
|
Информационная модель
Обрабатываемый информационный объект можно определить следующим образом:
const n=200;{граница массива}
type data=record {дата}
den:1..31;
mes:1..12;
god:word
end;
INF = record {информация об одном самолете}
bort:longint;
tip_sam:string[5];
d_prof:data;
brigada:string[10]
end;
infarray=array[1..n]of INF; {структура информационного
массива}
var samolets:infarray;
Распределение оперативной памяти соответствующее обрабатываемому информационному объекту показан на рис. 22.6.
Samolets | ОП | |
samolets[1].bort | longint | |
samolets[1].tip_sam | string[5] | |
samolets[1].d_prof.den | 1.. 31 | |
samolets[1].d_prof.mes | 1.. 12 | |
samolets[1].d_prof.god | Word | |
samolets[1].brigada | string[10] | |
samolets[2].bort | longint | |
samolets[2].tip_sam | string[5] | |
Samolets[2].d_prof.den | 1.. 31 | |
samolets[2].d_prof.mes | 1.. 12 | |
samolets[2].d_prof.god | Word | |
samolets[2].brigada | String[10] | |
. . | ||
samolets[200].bort | longint | |
samolets[200].tip_sam | string[5] | |
samolets[200].d_prof.den | 1.. 31 | |
samolets[200].d_prof.mes | 1.. 12 | |
samolets[200].d_prof.god | Word | |
samolets[200].brigada | string[10] |
Рис. 22.6. – Информационный объект
Программная модель
program remont;
const n=200;
type data=record {дата}
den:1..31;
mes:1..12;
god:word
end;
INF = record {информация об одном самолете}
bort:longint;
tip_sam:string[5];
d_prof:data;
brigada:string[10]
end;
infarray=array[1..n]of INF; {структура информационного
массива}
var samolets:infarray;{}
plan_data:data; {дата}
i:integer;
begin
{первоначальное заполнение информации в картотеке}
for i:=1 to n do
with samolets[i] do begin
writeln('Вв.инф. по ',i,' карточке');
readln(bort);
readln(tip_sam);
with d_prof do readln(den, mes, god);
readln(brigada)
end;
writeln('введите плановую дату');
with plan_data do readln(den,mes,god);
{поиск плановых бортов}
writeln('Запланированы на ',
plan.data.den:2,'.',plan.mes:2,'.',plan.god:4,':');
for i:=1 to n do
with samolets [i].d_prof do
if (den=plan_data.den)and
(mes=plan_data.mes)and
(god=plan_data.god) then
writeln('БОРТ=',samolets[i].bort:10,
' ТИП=',samolets[i].tip_sam)
end.