Вопрос 29.
3. Записи.
Запись (RECORD) - это структура сложных данных, состоящая из фиксированного числа компонентов различного типа.
Таким образом, каждая строка из списка есть запись. Имя записи - STUDENT, имена компонентов записи: FIO (ФИО), К (Курс), GR (Группа), N_ZACH (№_зачетки), STIP (Стипендия).
Наглядным представлением записи может служить образ "перевернутого дерева" - структура, в вершине которой находится один (корневой) элемент с исходящими от него ответвлениями к другим элементам. Изобразим "дерево" для записи STUDENT.
В этой структуре (1-го типа) компоненты FIO,
К, GR, N_ZACH,
STIP записи STUDENT являются
неделимыми. Такие компоненты называют полями. Если компоненты предполагают
дальнейшую детализацию, то они представляют собой записи.
Записи в Паскале могут иметь вложенную структуру (2-го типа), т.е. такую, в которой одна запись может выступать как составная часть другой записи. Например, запись STUDENT можно изобразить структурой 2-го типа следующим образом
В этой структуре компонент К - поле, а компонент GRUP - запись, содержащая поля: FIO, N_ZACH, STIP,
GR, то есть структура 2-го типа изображает вложенные
записи.
В первом случае содержимое компонента GR - номер группы, во втором - компонент GRUP распадается на 4 поля, т.е. является записью.
Объявление записи в языке Паскаль Записи объявляются в разделе описаний и используются в разделе операторов. Объявление записи можно делать в разделе переменных var или с использованием раздела типов type.
Первый способ объявления переменной типа запись (с использованием раздела типов Туре ):
Туре <имя типа> = record
<имя поля 1> : <тип поля 1>;
<имя поля 2> : <тип поля 2>;….
<имя поля n> : <тип поля n>;
end;
var
<имя записи-переменной> : <имя типа>;
Второй способ объявления переменной типа запись (в разделе переменных Var):
var <имя записи-переменной> : record
<имя поля 1> : <тип поля 1>;
<имя поля 2> : <тип поля 2>;
<имя поля n> : <тип поля n>;
end;
Служебное слово record выполняет роль открывающей скобки, end -закрывающей.
Замечание. Поля одного типа можно задавать списком (разделитель в списке - запятая).
Замечание. Оба способа (1 и 2) объявления записи приемлемы, однако, первый более универсален. Определяя тип записи, мы приобретаем дополнительную гибкость в использовании соответствующих записей - переменных, включая возможность передачи их в подпрограмму.
Так как поля N_ZACH и STIP одного типа (integer), то объявить запись STUDENT можно было и таким образом:
Туре STUD_REC = record
FIO : string [15];
K:1..5;
GR:51..56;
N_ZACH, STIP: integer;
end;
var
STUDENT:STUD_REC;
Обращение к записи и ее элементам (полям). Обращение к полю записи можно выполнить с помощью так называемой "точечной" нотации. Формат ее имеет вид:
<имя записи-переменной> . <имя поля>
При использовании вложенных записей мы должны указать полный маршрут: имена записей от высшего уровня до низшего, ведущие к данному полю. При этом каждая разделяющая точка символизирует определенный уровень вложенности.
В "точечном" обозначении поля записи следует указывать имена записей- переменных, но не их типов.
Поле записи используется в программе в том же смысле, что и обычная переменная. Поэтому поле записи можно указывать как в левой части оператора присваивания, так и в правой.
При объявлении записи для каждого ее поля указывается тип. Поэтому над полями записи можно выполнять действия, допустимые для данных заказанного типа.
Полям можно присваивать значения и выводить содержимое полей на экран (или печать).
Оператор присоединения
Используя "точечную" нотацию при обращении к полям записи, мы
выписывали всю цепочку имен, начиная с высшего уровня до имени конкретного объекта (или поля), к которому шло обращение. Оператор присоединения позволяет упростить обращение к полю записи-. Имя записи выносится в заголовок оператора присоединения, а в теле оператора используются только имена полей записи.
Формат оператора присоединения:
with <имя записи-переменной> do
<оператор>;
Если после do стоят несколько операторов (составной оператор), то их заключают в операторные скобки, и оператор присоединения имеет формат:
with <имя записи-переменной> do
begin
<оператор 1>;
<оператор 2>;…
<оператор n>;
end;
Имя записи-переменной, указанное в заголовке оператора присоединения, автоматически присоединяется ко всем именам полей, упомянутым в теле оператора with.
В одном заголовке оператора with можно задать ни одно имя записи, а целый список имен различных записей (от высшенго уровня к низшему), разделенных запятой.
Вариантные записи Основная идея вариантной записи состоит в том, чтобы в рамках единой структуры определить сразу несколько альтернативных записей. В общем случае такая запись может состоять из двух частей: фиксированной и вариантной. Фиксированная часть - это обычная совокупность полей; ее структура остается постоянной для всех экземпляров записей данного типа. Структура вариантной части записи не постоянна: она изменяется в зависимости от значения особого поля, называемого полем признака. Фиксированная (общая) часть структуры записи должна предшествовать вариантной части.
Вариантная часть имеет вид:
case < поле признака>: <тип поля признака> of
<конст1 или список конст1>: (<список полей1>: <тип поля>);
<конст2 или список конст2>: (<список полей2>: <тип поля>);…
<констN или список констn>: (<список полейN-: <тип поля>);
Замечание. Вариантная часть не завершается словом end. Служебное слово end завершает всю запись и одновременно ее вариантную часть.
Значение селектора, указывающее на тот или иной вариант, записывается перед использованием записи. В зависимости от значения поля признака вариантная часть записи будет иметь различные поля.
Константы-записи.
Определение константы-записи имеет следующий вид
<идентификатор>:<тип записи>=(<список значений полей>);
Идентификатор – это имя константы. Список значений полей представляет собой список из последовательностей вида: имени поля, двоеточия и константы. Элементы списка отделяются друг от друга точкой с запятой.
type
point=record
x, y : real;
end;
vector=array [0..1] of point
month=(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Okt, Nov, Dec);
data=record
d : 1..31;
m : month;
y : 1900..1999;
end;
const
point1 : point=(x: 0; y: -1);
line: vector =(x: -3.1; y: 1.5), (x : 5.9; y : 3.0);
someday : data=(d :16; m : Mar; y : 1989);
Поля должны указываться в той последовательности, в какой они перечислены в объявлении типа. Если же в записи используется хотя бы одно поле файлового типа, то такую запись нельзя объявлять типизированной константой. Для записи с вариантными полями указывается только один из возможных вариантов констант.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.