Различия

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

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

Следующая версия
Предыдущая версия
pascal:records [17/10/2011 11:49]
dnaumov создано
pascal: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>​
pascal/records.txt · Последние изменения: 17/10/2011 13:04 — dnaumov
CC Attribution-Noncommercial 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0