мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
pascal:records [17/10/2011 11:49] – создано dnaumovpascal:records [17/10/2011 13:04] (текущий) dnaumov
Строка 1: Строка 1:
 ===== Объединение разнородных элементов (Запись) ===== ===== Объединение разнородных элементов (Запись) =====
  
-Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединим разнородную информацию. +Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединяем разнородную информацию. 
  
-Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова record и перечисления входящих в запись элементов с указанием типов этих элементов.+Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова **record** и перечисления входящих в запись элементов с указанием типов этих элементов.
  
-**Запись Паскаля – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.**+**Запись – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.**
  
-Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры+Например, анкетные данные об ученике школы могут быть представлены в виде информационной структуры
  
 {{:pascal:new-14.gif|Представление структуры записи Паскаля}} {{:pascal:new-14.gif|Представление структуры записи Паскаля}}
Строка 13: Строка 13:
 Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом:  Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом: 
  
-<code>+<code pascal|Описание типа>
 type < имя _ типа >=record type < имя _ типа >=record
-   <имя_поля1>: тип; +   <имя_поля_1>: тип; 
-   <имя_поля2>: тип;+   <имя_поля_2>: тип;
    ......    ......
-   <имя_поля >: тип+   <имя_поля_K >: тип
 end ;  end ; 
 </code> </code>
 +
 +где **record** – служебное слово, а **<имя_типа>** и **<имя_поля>** - правильные идентификаторы языка Паскаль.
 +
 +Описание анкеты ученика в Паскале будет выглядеть так:
 +
 +<code pascal|Пример фрагмента программы описания записи Паскаля>
 +Type anketa=record
 +   fio: string[45];
 +   pol: char;
 +   dat_r: string[8];
 +   adres: string[50];
 +   cl: string[5];
 +   gr: string[3];
 +end; 
 +</code>
 +
 +Такая запись Паскаля, так же как и соответствующее ей дерево, называется двухуровневой.
 +
 +Поля записи Паскаля могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения об учениках можно отобразить трехуровневым деревом. 
 +
 +{{:pascal:new-15.gif|Представление структуры записи Паскаля}}
 +
 +<code pascal|Пример фрагмента программы описания записи Паскаля>
 +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; 
 +</code>
 +
 +===== Поля =====
 +
 +После того, как определен тип записи Паскаля, можно определять переменную этого типа. Переменная определяется путем задания ее идентификатора и указания типа.
 +
 +<code pascal|Задание переменной>
 +var
 +   pupil: anketa;
 +   pupil1: anketa1;
 +</code>
 +
 +Теперь нам нужно узнать, как правильно получать доступ к элементам записи Паскаля. Элементы записи называются **полями**, а обращение к ним производится через использование их имен – идентификаторов полей. Практически, поля записи обрабатываются точно так же, как и любые другие переменные. Но в отличие от обычной переменной имена полей должны предваряться ссылкой на идентификатор записи Паскаля и отделяться от него **точкой**. Такая запись называется уточняющий идентификатор:
 +
 +<code pascal|Уточняющий идентификатор>
 +<имя_записи>.<имя_поля>
 +</code>
 +
 +Например, чтобы обратиться к полю **cl** переменной **pupil** , необходимо указать следующее составное имя:
 +
 +<code pascal|Обращение к полю cl>
 +pupil.cl :=3;
 +<code>
 +
 +Для того чтобы обратиться к полю god в записи pupil1, необходимо записать уточняющий идентификатор, состоящий из трех имен:
 +
 +<code pascal|Обращение к полю god>
 +pupil1.dat_r.god:=1982;
 +</code>
 +
 +Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных. 
 +
 +===== Операции над записями =====
 +
 +Единственная операция, которую можно произвести над однотипными записями Паскаля – это *присваивание*.
 +
 +
 +<code pascal|Присваивание>
 +var
 +   pupil1, pupil2: anketa1;
 +
 +begin
 +
 +   ...
 +
 +   pupil1:=pupil2;
 +
 +   ...
 +
 +end.
 +</code>
 +
 +Все другие операции производятся над отдельными полями записи. 
 +
 +===== Пример решения задачи с использованием записей =====
 +
 +Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран.
 +
 +Пусть нам необходимо заполнить сведения об ученике (Ф.И.О., дата рождения, адрес, класс и группа), а затем вывести эти сведения на экран.
 +
 +<code pascal|Пример программы 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.
 +</code>
 +
 +А теперь слегка усложним задачу. Пусть нам необходимо иметь сведения о многих учениках, например, вашего класса. Следовательно, необходимо организовать массив записей Паскаля. А затем из общего списка вывести фамилии учеников 11-1-го класса.
 +
 +<code pascal|Пример программы 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. 
 +</code>
 +
 +===== Оператор присоединения или как избавиться от префикса =====
 +
 +**Префикс** – обязательная предшествующая часть составного идентификатора для имен полей в структуре типа запись Паскаля. Очень часто у программиста возникает желание не указывать префикс в имени полей, например, когда идет постоянное использование одних и тех же записей. В языке Паскаль предусмотрена такая возможность, реализуемая при помощи оператора присоединения, который в общем виде выглядит так:
 +
 +<code pascal|Оператор присвоения>
 +with <имя_записи> do <действие с полем записи>;
 +</code>
 +
 +Следует обратить внимание на то, что после служебного слова **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>