Вопрос 29.doc
Оценка 4.9

Вопрос 29.doc

Оценка 4.9
doc
13.05.2020
Вопрос 29.doc
Вопрос 29.doc

Вопрос 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);

Поля должны указываться в той последовательности, в какой они перечислены в объявлении типа. Если же в записи используется хотя бы одно поле файлового типа, то такую запись нельзя объявлять типизированной константой. Для записи с вариантными полями указывается только один из возможных вариантов констант.


Вопрос 29. 3. Записи. Запись (

Вопрос 29. 3. Записи. Запись (

N_ZACH, STIP: integer; end; var

N_ZACH, STIP: integer; end; var

Замечание. Вариантная часть не завершается словом end

Замечание. Вариантная часть не завершается словом end
Скачать файл