Записи. Бинарные файлы
Записи
Продолжая изучение структурированных типов данных, переходим к записям.
Как и массивы, записи являются структурами прямого доступа, однако, в отличие от массивов, могут хранить элементы, относящиеся к разным типам данных.
Таким образом, запись - это вектор, компоненты которого ( поля ) могут относиться к разным типам данных.
Описание записей
В разделе var переменную типа запись описывают так:
var <имя_записи>: record <имя_поля1>: <тип_поля1>;
[<имя_поля2>: <тип_поля2>;]
[...]
end;Имена полей должны подчиняться общим правилам построения идентификаторов. Повторение имен полей внутри одной записи не допускается.
Замечание: Имена полей могут совпадать с именами других переменных, поскольку на самом деле являются составными:
<имя_записи>.<имя_поля>.
Поэтому можно записать:
var x: real;
r: record x: real;
y: real
end;Поля могут относиться к любым стандартным (базовым или сконструированным) или определенным ранее типам, даже к файловому или процедурному (см. лекцию 8).
Если несколько подряд идущих полей принадлежат к одному типу данных, их описания можно объединить:
var <имя_записи>: record <имя_поля1>,_,<имя_поляN>: <тип_полей>;
<имя_поляS>: <тип_поляS>;
...
end;Например:
var zap1: record x,y: real;
i,j,k: integer;
flag: boolean;
s: set of 'a'..'z';
a: array[1..100] of byte;
data: record day:1..31;
month: 1..12;
year: 1900..2100;
end;
end;Эта запись содержит 9 полей, три из которых сами являются составными.
Наиболее распространенный способ использования записей - двумерная таблица, каждый столбец которой имеет свой тип. Такую структуру описывают, например, следующим образом:
var tabl: array[1..100] of zap1;
Задание записей константой
Как и массивы, записи не могут быть заданы неименованной или нетипизированной константой.
Для того чтобы задать запись типизированной константой, следует вначале описать соответствующий тип в разделе type, а затем воспользоваться им в разделе const:
type <имя_типа> = record <имя_поля1>: <тип_поля1>;
[<имя_поля2>: <тип_поля2>;]
[...]
end;
const <имя_константы>: <имя_типа> = <начальное_значение>;Начальное значение для переменной типа запись задается перечислением в круглых скобках начальных значений для всех полей (соответствующих типов!) с обязательным указанием имени задаваемого поля. Имя поля от его начального значения отделяется двоеточием, значения соседних полей разделяются точкой с запятой:
(<имя_поля1>: <значение_поля1>; _; <имя_поляN>: <значение_поляN>);
Например:
type data = record day: 1..31;
month: 1..12;
year: 1900..2100;
end;
const my_birthday: data = (day:17; month:3; year:2004);Можно, конечно, не описывать тип константы отдельно, а объединить оба определения:
const my_birthday: record day: 1..31; month: 1..12; year: 1900..2100; end; = (day:17; month:3; year:2004);
Если описана двумерная таблица, то ее начальные значения задаются как вектор, каждый компонент которого является записью. Таким образом, правила задания типизированной константы-таблицы сочетают в себе правила задания массива и записи:
type family = (mother, father, child); const birthdays : array[family] of data = ((day: 8; month: 3; year: 1975), (day: 23; month: 2; year: 1970), (day: 1; month: 9; year: 2000));