Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
58
Добавлен:
02.05.2014
Размер:
77.82 Кб
Скачать

22. Тип запись

Классификация: нестандартный, структурированный (сложный) тип.

Имя определяет программист.

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

Отличие записи от массива:

  • компонентами являются данные разных типов;

  • элементу массива соответствует(ют) индекс(ы), а элементу записи (полю) - имя поля.

Таким образом, данное типа запись есть информационная модель объекта, представляющего собой совокупность фиксированного количества разнотипных компонентов. Например, анкетные данные об учащемся - фамилия, год рождения, пол.

3. Структурная организация

По структуре тип запись - последовательность поименованных полей (рис.22.1). Размер поля определяется типом полей.

Имя первого поля

Тип поля

Имя второго поля

Тип поля

. . .

. . .

Имя последнего поля

Тип поля

Рис. 22.1. – Структура записи

0. Определение типа

В общем случае данное типа запись состоит из двух частей – постоянной и вариантной. Пока определим только тип запись с постоянной частью (рис.22.2). Запись с вариантной частью определим позднее.

Например, определим тип запись для анкетных данных ученика

type anketa = record

fam:string[20];

gr: word;

pol:char

end;

Рис. 22.2. – Определение типа запись

1. Множество значений

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

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

22.4. Пример использования данных типа запись

О самолете имеется следующая информация:

  • бортовой номер (целое число)

  • тип самолета ( название, состоящие из символов. Например,

  • ТУ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.

Соседние файлы в папке Лекции по Паскалю