===== Объединение разнородных элементов (Запись) =====
Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединяем разнородную информацию.
Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова **record** и перечисления входящих в запись элементов с указанием типов этих элементов.
**Запись – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.**
Например, анкетные данные об ученике школы могут быть представлены в виде информационной структуры
{{:pascal:new-14.gif|Представление структуры записи Паскаля}}
Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом:
type < имя _ типа >=record
<имя_поля_1>: тип;
<имя_поля_2>: тип;
......
<имя_поля_K >: тип
end ;
где **record** – служебное слово, а **<имя_типа>** и **<имя_поля>** - правильные идентификаторы языка Паскаль.
Описание анкеты ученика в Паскале будет выглядеть так:
Type anketa=record
fio: string[45];
pol: char;
dat_r: string[8];
adres: string[50];
cl: string[5];
gr: string[3];
end;
Такая запись Паскаля, так же как и соответствующее ей дерево, называется двухуровневой.
Поля записи Паскаля могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения об учениках можно отобразить трехуровневым деревом.
{{:pascal:new-15.gif|Представление структуры записи Паскаля}}
Type anketa1=record
fio: string[45];
pol: char;
dat_r: record
god: integer;
mes: string[10];
den: 1..31;
end;
adres: record
gorod: string[25];
ulica: string [20];
dom, kv: integer;
end;
cl: string[5];
gr: string[3];
end;
===== Поля =====
После того, как определен тип записи Паскаля, можно определять переменную этого типа. Переменная определяется путем задания ее идентификатора и указания типа.
var
pupil: anketa;
pupil1: anketa1;
Теперь нам нужно узнать, как правильно получать доступ к элементам записи Паскаля. Элементы записи называются **полями**, а обращение к ним производится через использование их имен – идентификаторов полей. Практически, поля записи обрабатываются точно так же, как и любые другие переменные. Но в отличие от обычной переменной имена полей должны предваряться ссылкой на идентификатор записи Паскаля и отделяться от него **точкой**. Такая запись называется уточняющий идентификатор:
<имя_записи>.<имя_поля>
Например, чтобы обратиться к полю **cl** переменной **pupil** , необходимо указать следующее составное имя:
pupil.cl :=3;
Для того чтобы обратиться к полю god в записи pupil1, необходимо записать уточняющий идентификатор, состоящий из трех имен:
pupil1.dat_r.god:=1982;
Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных.
===== Операции над записями =====
Единственная операция, которую можно произвести над однотипными записями Паскаля – это *присваивание*.
var
pupil1, pupil2: anketa1;
begin
...
pupil1:=pupil2;
...
end.
Все другие операции производятся над отдельными полями записи.
===== Пример решения задачи с использованием записей =====
Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран.
Пусть нам необходимо заполнить сведения об ученике (Ф.И.О., дата рождения, адрес, класс и группа), а затем вывести эти сведения на экран.
program primer1;
type anketa=record
fio: string[45];
dat_r: string[8];
adres: string[50];
cl: string[5];
gr: string[3]
end;
var pupil: anketa;
begin
writeln (‘введите сведения об ученике’);
{обратите внимание, ввод каждого поля осуществляется отдельно}
writeln (‘введите фамилию, имя и отчество’);
readln (pupil.fio);
writeln (‘введите дату рождения’);
readln (pupil.dat_r);
writeln (‘введите адрес’);
readln(pupil.adres);
writeln (‘введите класс’);
readln(pupil.cl);
writeln (‘введите группу’);
readln (pupil.gr);
writeln (‘ввод закончен’);
writeln ;
{обратите внимание, что вывод записи осуществляется по полям}
writeln (‘фамилия ученика: ’, pupil.fio );
writeln(‘ дата рождения : ’, pupil.dat_r);
writeln(‘ адрес : ’, pupil.adres);
writeln(‘ класс : ’, pupil.cl);
writeln(‘ группа : ’, pupil.gr);
end.
А теперь слегка усложним задачу. Пусть нам необходимо иметь сведения о многих учениках, например, вашего класса. Следовательно, необходимо организовать массив записей Паскаля. А затем из общего списка вывести фамилии учеников 11-1-го класса.
program primer2;
type anketa=record
fio: string[45];
dat_r: string[8];
adres: string[50];
cl: string[5];
gr: string[3]
end;
var pupil: array [1..100] of anketa;
I: integer;
begin
{последовательно вводим каждую запись}
for I:=1 to 100 do
begin
writeln (‘введите сведения о’, I , ‘-м ученике’);
writeln (‘введите фамилию, имя и отчество’);
readln (pupil[I].fio);
writeln (‘введите дату рождения’);
readln (pupil[I].dat_r);
writeln (‘введите адрес’);
readln(pupil[I].adres);
writeln (‘введите класс’);
readln(pupil[I].cl);
writeln (‘введите группу’);
readln (pupil[I].gr);
end;
writeln (‘ввод закончен’);
writeln ;
{просматриваем массив записей и выбираем только учеников 11-1 класса }
for I:=1 to 100 do
if pupil[I].cl='11-1' then
writeln(‘ фамилия студента : ’, pupil[I].fio);
end.
===== Оператор присоединения или как избавиться от префикса =====
**Префикс** – обязательная предшествующая часть составного идентификатора для имен полей в структуре типа запись Паскаля. Очень часто у программиста возникает желание не указывать префикс в имени полей, например, когда идет постоянное использование одних и тех же записей. В языке Паскаль предусмотрена такая возможность, реализуемая при помощи оператора присоединения, который в общем виде выглядит так:
with <имя_записи> do <действие с полем записи>;
Следует обратить внимание на то, что после служебного слова **do** может стоять только один оператор, но он может быть составным (любая последовательность операторов, заключенная в операторные скобки begin end ).
Например, фрагмент из предыдущей программы с использованием оператора присоединения будет выглядеть так:
for I:=1 to 100 do
with pupil[I] do
begin
writeln (‘введите сведения о’, I , ‘-м ученике’);
writeln (‘введите фамилию, имя и отчество’);
readln (fio);
writeln (‘введите дату рождения’);
readln (dat_r);
writeln (‘введите адрес’);
readln(adres);
writeln (‘введите класс’);
readln(cl);
writeln (‘введите группу’);
readln (gr);
end;