comp-science.narod.ru ==> Дидактические материалы по информатике ==> Записи
Запись структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи.
Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту.
Например, информация о рекордах по бегу у мужчин для открытых стадионов может содержать следующие атрибуты
рекордсмен страна статус соревнований (Олимпиада, чемпионат мира) длина дистанции год рекорда время
Структурная диаграмма для записи

идентификатор типа = Record поле1: тип; поле2: тип; … полеN: тип end;Например,
type beg = record
fam: string[25];
srtana: string[20];
status: boolean; {Олимпиада - true; чемпионат мира - false}
dlina: longint;
god: 1900..2009;
vr: string[15];
end;
Var a: beg;
К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:
<имя переменной>.<имя поля>
Например,
a.fam; a.dlina и т.п.
Если, например, требуется полю "status" присвоить значение «true», то это делается так:
a.status := true;
Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями.
Например,
type beg1 = record
fam: string[25];
srtana: string[20];
status: boolean; {Олимпиада - true; чемпионат мира - false}
dlina: longint;
god: 1900..2009;
vr: record min: longint;
sec: real
end
end;
Var a: beg1;
Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например,
a.vr.min a.vr.sec
В программе могут использоваться массивы записей.
Любая обработка записей, в том числе ввод и вывод, производится поэлементно.
Например,
var b: array[1..200] of beg1;
...
write('Число рекордсменов? '); readln(n);
for i:=1 to n do
with b[i] do
begin
write('Фамилия спортсмена? '); readln(fam);
write('Гражданин какой страны спортсмен? '); readln(strana);
write('Статус соревнования? '); readln(status);
write('Длина дистанции? '); readln(dlina);
write('Год проведения соревнования? '); readln(god);
write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);
end;
...
В примере был использован оператор присоединения, который имеет следующий вид:
with <переменная типа запись> do <оператор>;
Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.
Объём памяти, занимаемый записью, определяется суммарным объёмом, занимаемым её полями:
type beg1 = record
fam: string[25]; {26 байт}
srtana: string[20]; {21 байт}
status: boolean; {1 байт}
dlina: longint; {4 байта}
god: 1900..2009; {2 байта}
vr: record min: longint; {4 байта}
sec: real {6 байт}
end
end;
Всего получаем: 26+21+1+4+2+4+6=65 байт
Массив, описанный выше, занимает 65 байт × 200 элементов = 13000 байт оперативной памяти.
При определении типа записи в нее можно включать вариантную часть. Это означает, что разные переменные, хотя они относятся к одному типу, могут иметь различные структуры.
Вариантная часть записи начинается выбором case и следует за общей частью; после ее окончания в записи не могут появляться никакие другие поля, поэтому case закрывается служебным словом end.
Любая запись может иметь только одну вариантную часть, которая должна размещаться в конце записи (после фиксированной части). Однако, внутри какого-либо варианта, в свою очередь, может присутствовать другая вариантная часть, вложенная в первую.
При записи варианта (списков элементов) обязательно наличие круглых скобок, даже если в них ничего не заключается.
Структурная диаграмма для записи с вариантами

Например, пусть необходимо задать информацию о некотором человеке, указав фамилию и год рождения, а также, если это мужчина, то сообщить, военнообязанный ли он и какую имеет специальность, а если это женщина, то указать, замужем ли она и сколько имеет детей.
Type pol=(m,w);
people=record
fam:string[20];
godro:1900..2007;
case mw:pol of
m: ( voen: boolean; spec: string[15]);
w: ( merry: boolean; child: byte)
end;
var p1, p2: people;
Все имена элементов должны быть различными, даже если они встречаются в разных вариантах.
К элементам вариантной части можно обращаться так же, как к элементам фиксированной части записи.
P1.mw:=m; p1.voen:=true; p2.child:=2;
В процессе выполнения программы в структуру записи включается тот вариант, элементам которого в данный момент было присвоено значение. Как только какому-либо элементу другого варианта присваивается некоторое значение, в структуру записи включается этот вариант, а элементы предыдущего варианта становятся неопределенными.
Данное обстоятельство учитывается и при подсчете объема памяти, отводимого под запись с вариантами. Статические поля учитываются обычным образом, а среди вариативной части отыскивается тот случай, где суммарный объем памяти для полей максимальный.
Type pol=(m,w);
people=record
fam:string[20]; {21}
godro:1900..2007; {2}
case mw:pol of {1}
m: ( voen: boolean; spec: string[15]); {1+16=17}
w: ( merry: boolean; child: byte) {1+1=2}
end;
21 + 2 + 1 + max(17, 2) = 41 (байт)
Рассмотрим пример работы с записями без вариантов.
Задача. Сведения о деталях, хранящихся на складе, содержат следующие атрибуты: название, количество, стоимость одной детали. Вывести информацию о детали, суммарная стоимость для которой максимальна.
program ex_zap;
type detal = record a: string[30]; kol, st: integer; end;
var a: array [0..99] of detal; n, i, max: integer;
begin
write('Количество деталей? ');
readln(n);
for i:=0 to n-1 do
With a[i] do
begin write('Информация об ', i, ' детали: ');
readln(a);
readln(kol);
readln(st);
end;
max := 0;
for i:= 1 to n-1 do
if a[max].kol*a[max].st < a[i].kol*a[i].st then max:=i;
writeln('Искомая деталь: ', a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol);
end.
© А.П. Шестаков, 2009