

Лабораторная работа №6 Структурные типы данных. Записи.
Введение
В лабораторной работе рассматривается работа с типом запись. Рассматриваются также некоторые методы работы с данным типом.
Тип запись
Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от других структурных типов, тип запись может содержать в себе данные различных типов. Синтаксис типа запись имеет следующий вид
<идентификатор типа>=record <имя поля>:<тип поля>; <имя поля>:<тип поля>;
...
[<вариантная часть>]
end;
где <идентификатор типа> – правильный идентификатор; record – зарезервированное слово;
<имя поля> – правильный идентификатор, уникальный в пределах объявления типа запись;
<тип поля> – любой тип Object Pascal, в том числе и структурный. <вариантная часть> – необязательная часть записи, рассматривается ниже.
Рассмотрим пример объявления типа запись для описания информации о некоторой персоне.
type TPerson=record |
|
name: string[12]; |
//имя |
familia: string[16];//фамилия |
|
Age: byte; |
//возраст |
end; |
|
Значения переменных типа записи можно присваивать переменным того же типа. var a, b:TPerson;
begin
...
a:=b;
...
end.
Для того чтобы получить доступ к каждому из компонентов записи необходимо использовать составное имя. Для этого после имени переменной необходимо поставить точку и имя поля.
var a, b:TPerson;
begin
...
a.name:=’Иван’; a.familia:=’Иванов’; a.age:=18;
...

end.
Так как поле в типе запись может быть любого типа, в том числе и быть записью, то для таких полей необходимо продолжать уточнения, например
type TBirthDay=record Day, //день Month:byte;//месяц Year :word;//год end;
TPerson=record
name :string[12]; //имя familia:string[16]; //фамилия BirthDay:TBirthDay; //дата рождения end;
var Person:TPerson;
begin
...
Person.name:=’Иван’; Person.familia:=’Иванов’; Person.BirthDay.Day:=1; Person.BirthDay.Month:=1; Person.BirthDay.Year:=2000;
...
end.
Для упрощения доступа к полям записи можно использовать следующий оператор
with <переменная> do <оператор>;
где with, do – зарезервированные слова;
<переменная> – переменная типа запись, за которой, возможно следует список вложенных полей;
<оператор> – любой оператор Object Pascal.
Для примера перепишем фрагмент программы приведенный выше с использованием оператора with do.
var Person:TPerson;
begin
...
with Person do begin name:=’Иван’; familia:=’Иванов’; BirthDay.Day:=1; BirthDay.Month:=1; BirthDay.Year:=2000; end;
...
end.
В выше приведенном фрагменте можно применить еще раз оператор with do.
var Person:TPerson;
begin
...
with Person do begin name:=’Иван’; familia:=’Иванов’;

with BirthDay do begin Day:=1;
Month:=1;
Year:=2000; end;{BirthDay}
end;{Person}
...
end.
Использование типизированных констант
Возможно создание типизированных констант типа запись. Синтаксис объявления выглядит следующим образом:
(имя поля: значение; имя поля: значение; ... )
Например, для приведенных примеров записей, объявление констант будет выглядеть так
const cPerson:TPerson=(name: 'Иван'; familia: 'Иванов'; age: 15);
и так, соответственно
const cPerson:TPerson=( name: 'Иван'; familia: 'Иванов'; BirthDay: (
Day: 1;
Month: 1; Year: 2000));
Обратите внимание, что для вложенных записей значения задаются рекурсивно. Пример задания константы в виде массива записей.
const cPersons: array [0..2] of TPerson=(
(name: |
'Иван'; |
familia:'Иванов'; |
|
BirthDay: (Day: 1; Month:1; Year: 2000)), |
|||
(name: |
'Петр'; |
familia:'Петров'; |
|
BirthDay: (Day: 7; Month:3; Year: 2000)), |
|||
(name: |
'Дмитрий'; |
familia:'Сидоров'; |
BirthDay: (Day: 21; Month:8; Year: 2000)));
Как видно, элементы массива отделяются друг от друга запятыми, а каждый элемент массива является записью, поля которой задаются в круглых скобках.
Использование вариантных полей
Object Pascal разрешает использовать в записи так называемые вариантные поля. Синтаксис определения вариантных полей приведен ниже.
case <порядковый тип> of <значение>: ( <имя поля>:<тип поля>;
<имя поля>:<тип поля>;
...);
< значение >: ( <имя поля>:<тип поля>;
<имя поля>:<тип поля>;
...);
...
Вариантная часть записи должна всегда находится в конце записи после всех фиксированных полей. Запись может иметь только одну вариантную часть. Вариантная секция в записи является не обязательной и обычно отсутствует.

Пример использования записей с вариантной частью приведен ниже.
type TPerson=record
name :string[12]; //имя familia:string[16]; //фамилия case byte of//род занятий 0:( //первый вариант
Type_computer:string[20]; //компьютеры MByte:Integer;
Compatible:Boolean); 1: //второй вариант
Instrument: array[1..3] of string[10]; //музыка
end;
В данном примере определено два варианта: первый вариант предназначен для человека увлекающегося компьютерами, а второй для человека увлекающегося музыкой. Особенностью вариантных полей является то, что нельзя использовать одновременно поля для различных вариантов, т.к. им выделяется одна и та же область памяти. Вариантные поля обычно используют для хранения взаимоисключающей информации с целью экономии памяти. На месте ключа в конструкции case of может стоять любой встроенный или пользовательский порядковый тип. Выбор этого типа не имеет значения и, по сути, игнорируется компилятором.
Обращение к вариантным полям происходит также как и к обычным, например
var Person:TPerson;
begin
...
with Person do begin name:=’Иван’; familia:=’Иванов’; Type_computer:=’AMD Athlon’; MByte:=1024; Compatible:=true;
end;
...
end.
Ввод и вывод переменных типа запись
Для операций ввода-вывода для записей в Object Pascal не предусмотрено ни каких средств, поэтому ввод и вывод данных для записей необходимо реализовывать самостоятельно. Ниже приведен пример организации ввода и вывода записи.
Листинг 1 – Ввод записей
program InOutRec; {$APPTYPE CONSOLE} type TStudent=record
name :string[12]; //имя familia:string[16]; //фамилия gruppa :string[4]; //группа end;
var Student:TStudent; begin
writeln('Vvedite dannie');
//ввод записи
with Student do begin