Объединение разнородных элементов (Запись)

Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединяем разнородную информацию.

Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова record и перечисления входящих в запись элементов с указанием типов этих элементов.

Запись – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.

Например, анкетные данные об ученике школы могут быть представлены в виде информационной структуры

Представление структуры записи Паскаля

Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа 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 уровней). Например, те же сведения об учениках можно отобразить трехуровневым деревом.

Представление структуры записи Паскаля

Пример фрагмента программы описания записи Паскаля

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 , необходимо указать следующее составное имя:

Обращение к полю cl

pupil.cl :=3;
<code>
 
Для того чтобы обратиться к полю god в записи pupil1, необходимо записать уточняющий идентификатор, состоящий из трех имен:
 
<code pascal|Обращение к полю god>
pupil1.dat_r.god:=1982;

Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных.

Операции над записями

Единственная операция, которую можно произвести над однотипными записями Паскаля – это *присваивание*.

Присваивание

var
   pupil1, pupil2: anketa1;
 
begin
 
   ...
 
   pupil1:=pupil2;
 
   ...
 
end.

Все другие операции производятся над отдельными полями записи.

Пример решения задачи с использованием записей

Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран.

Пусть нам необходимо заполнить сведения об ученике (Ф.И.О., дата рождения, адрес, класс и группа), а затем вывести эти сведения на экран.

Пример программы c записью Паскаля

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-го класса.

Пример программы c записью Паскаля

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 ).

Например, фрагмент из предыдущей программы с использованием оператора присоединения будет выглядеть так:

<code pascal|Пример фрагмента программы c записью и префиксом Паскаля> 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; 

<code>

pascal/records.txt · Последние изменения: 17/10/2011 12:04 — dnaumov
CC Attribution-Noncommercial 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0