===== Объединение разнородных элементов (Запись) ===== Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединяем разнородную информацию. Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (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;