
§3. Записи
3.1. Понятие записи в языке Паскаль
Существует ряд экономических, информационно-поисковых задач, связанных с получением, хранением и обработкой различных списков, ведомостей и других документов.
Например:
ФИО Курс Группа N_зачетки Стипендия
Иванов И.И. 5 56 987671 125
Петрова Н.Н. 5 55 987654 105
Федорова А.А. 5 53 987650 83
.....
Этот список состоит из строк (их число ограничено только объемом памяти компьютера или внешнего носителя информации) и из фиксированного числа столбцов или компонентов (в данном примере 5). В первом столбце записана символьная информация, а во 2–5 столбцах – числовая.
Организовать эти данные в одну структуру, такую как массив, невозможно, так как массив может состоять только из однотипных элементов. Появляется необходимость объединить данные любого типа в новую структуру - запись.
Запись (RECORD) - это структура сложных данных, состоящая из фиксированного числа компонентов различного типа.
Таким образом, каждая строка из списка (информация об одном студенте) есть запись. Имя записи - STUDENT, имена компонентов записи: FIO (ФИО), K (Курс), GR (Группа), N_ZACH (N_зачетки), STIP (Стипендия).
Наглядным представлением записи может служить образ "перевернутого дерева" - структура, в вершине которой находится один (корневой) элемент с исходящими от него ответвлениями к другим элементам. Изобразим "дерево" для записи STUDENT.
S
TUDENT
FIO K GR N_ZACH STIP
В этой структуре (1-го типа) компоненты FIO, K, GR, N_ZACH, STIP записи STUDENT являются неделимыми. Такие компоненты называют полями. Если компоненты предполагают дальнейшую детализацию, то они представляют собой записи.
З
аписи
в Паскале могут иметь вложенную
структуру (2-го типа), т.е. такую, в которой
одна запись может выступать как составная
часть другой записи. Например, запись
STUDENT можно изобразить структурой 2-го
типа следующим образом
STUDENT
K
GRUP
F
IO
N_ZACH STIP GR
В этой структуре компонент K - поле, а компонент GRUP - запись, содержащая поля: FIO, N_ZACH, STIP, GR, то есть структура 2-го типа изображает вложенные записи.
В первом случае содержимое компонента GR - номер группы, во втором - компонент GRUP распадается на 4 поля, т.е. является записью.
3.2. Объявление записи в языке Паскаль
Записи объявляются в разделе описаний и используются в разделе операторов. Объявление записи можно делать в разделе переменных var или с использованием раздела типов type.
Первый способ объявления переменной типа запись (с использованием раздела типов Type ):
Type
<имя типа> = record
<имя поля 1> : <тип поля 1>;
<имя поля 2> : <тип поля 2>;
. . . . . .
<имя поля n> : <тип поля n>;
end;
var
<имя записи-переменной> : <имя типа>;
Второй способ объявления переменной типа запись (в разделе переменных Var):
var
<имя записи-переменной> : record
<имя поля 1> : <тип поля 1>;
<имя поля 2> : <тип поля 2>;
. . . . . .
<имя поля n> : <тип поля n>;
end;
Служебное слово record выполняет роль открывающей скобки, end - закрывающей.
Замечание. Поля одного типа можно задавать списком (разделитель в списке - запятая).
Пример1. Объявление записи STUDENT (структура 1-го типа, первый способ описания):
type
STUD_REC = record
FIO : string [15];
K : 1..5;
GR : 51..56;
N_ZACH : integer;
STIP : integer;
end;
var
STUDENT : STUD_REC;
Объявление записи STUDENT (структура 1-го типа, второй способ описания):
var
STUDENT : record
FIO : string [15];
K : 1..5;
GR : 51..56;
N_ZACH : integer;
STIP : integer;
end;
Замечание. Оба способа (1 и 2) объявления записи приемлемы, однако, первый более универсален. Определяя тип записи, мы приобретаем дополнительную гибкость в использовании соответствующих записей - переменных, включая возможность передачи их в подпрограмму.
Так как поля N_ZACH и STIP одного типа (integer), то объявить запись STUDENT можно было и таким образом:
Type
STUD_REC = record
FIO : string [15];
K : 1..5;
GR : 51..56;
N_ZACH, STIP : integer;
end;
var
STUDENT : STUD_REC;
Пример 2. Объявление записи STUDENT (структура 2-го типа):
Описать структуру 2-го типа, т.е. вложенные записи, можно несколькими способами.
Первый способ. Сначала описываем записи самого низкого уровня, затем более высокого, поднимаясь постепенно к корневым, например,
type
GRUP_REC= record
FIO : string [15];
GR : 51..56;
N_ZACH, STIP : integer
end;
STUD_REC = record
K : 1..5;
GRUP : GRUP_REC
end;
var
STUDENT : STUD_REC;
Второй способ. Начинаем с описания записи самого высокого уровня. Поля этой записи, в свою очередь, являющиеся записями, описываем соответствующим образом:
а) type
STUD_REC = record
K : 1..5;
GRUP : record
FIO : string [15];
GR : 51..56;
N_ZACH,STIP : integer
end
end;
var
STUDENT : STUD_REC;
или таким образом:
б) var
STUDENT : record
K : 1..5;
GRUP : record
FIO : string [15];
GR : 51..56;
N_ZACH,STIP : integer
end
end;
Замечание. Объявляя запись-переменную без предварительного определения типа (пример 2, способ 2, б), мы лишаем себя возможности передать ее какой-либо подпрограмме в качестве фактического параметра. Напомним, что в подпрограмме каждый параметр может быть описан с типом, выраженным только простым именем.