мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Последняя версияСледующая версия справа и слева | |||
pascal:records [17/10/2011 11:49] – создано dnaumov | pascal:records [17/10/2011 12:20] – dnaumov | ||
---|---|---|---|
Строка 13: | Строка 13: | ||
Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом: | Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом: | ||
- | < | + | < |
type < имя _ типа >=record | type < имя _ типа >=record | ||
< | < | ||
Строка 21: | Строка 21: | ||
end ; | end ; | ||
</ | </ | ||
+ | |||
+ | где **record** – служебное слово, а **< | ||
+ | |||
+ | Описание анкеты студента в Паскале будет выглядеть так: | ||
+ | |||
+ | <code pascal|Пример фрагмента программы описания записи Паскаля> | ||
+ | Type anketa=record | ||
+ | fio: string[45]; | ||
+ | pol: char; | ||
+ | | ||
+ | | ||
+ | curs: 1..5; | ||
+ | | ||
+ | end; | ||
+ | </ | ||
+ | |||
+ | Такая запись Паскаля, | ||
+ | |||
+ | Поля записи Паскаля могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, | ||
+ | |||
+ | {{: | ||
+ | <code pascal|Пример фрагмента программы описания записи Паскаля> | ||
+ | Type anketa1=record | ||
+ | fio: string[45]; | ||
+ | pol: char; | ||
+ | | ||
+ | god: integer; | ||
+ | mes: string[10]; | ||
+ | den: 1..31; | ||
+ | end; | ||
+ | adres: record | ||
+ | | ||
+ | | ||
+ | dom, kv: integer; | ||
+ | end; | ||
+ | curs: 1..5; | ||
+ | | ||
+ | end; | ||
+ | </ | ||
+ | |||
+ | ===== Поля ===== | ||
+ | |||
+ | После того, как определен тип записи Паскаля, | ||
+ | |||
+ | <code pascal|Задание переменной> | ||
+ | var | ||
+ | student: anketa; | ||
+ | student 1: anketa 1; | ||
+ | </ | ||
+ | |||
+ | Теперь нам нужно узнать, | ||
+ | |||
+ | <code pascal|Уточняющий идентификатор> | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Например, | ||
+ | |||
+ | <code pascal|Обращение к полю curs> | ||
+ | student.curs :=3; | ||
+ | < | ||
+ | |||
+ | Для того чтобы обратиться к полю god в записи student 1, необходимо записать уточняющий идентификатор, | ||
+ | |||
+ | <code pascal|Обращение к полю god> | ||
+ | student1.dat_r.god: | ||
+ | </ | ||
+ | |||
+ | Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных. | ||
+ | |||
+ | ===== Операции над записями ===== | ||
+ | |||
+ | Единственная операция, | ||
+ | |||
+ | Все другие операции производятся над отдельными полями записи. | ||
+ | |||
+ | ===== Пример решения задачи с использованием записей ===== | ||
+ | |||
+ | Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран. | ||
+ | |||
+ | Пусть нам необходимо заполнить сведения об ученике (Ф.И.О., дата рождения, | ||
+ | |||
+ | <code pascal|Пример программы c записью Паскаля> | ||
+ | program primer1; | ||
+ | |||
+ | type anketa=record | ||
+ | fio: string[45]; | ||
+ | | ||
+ | | ||
+ | curs: 1..5; | ||
+ | | ||
+ | end; | ||
+ | |||
+ | var student: anketa; | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end. | ||
+ | </ | ||
+ | |||
+ | А теперь слегка усложним задачу. Пусть нам необходимо иметь сведения о многих учениках, | ||
+ | |||
+ | <code pascal|Пример программы c записью Паскаля> | ||
+ | program primer2; | ||
+ | |||
+ | type anketa=record | ||
+ | fio: string[45]; | ||
+ | | ||
+ | | ||
+ | curs: 1..5; | ||
+ | | ||
+ | end; | ||
+ | |||
+ | var student: array [1..100] of anketa; | ||
+ | I: integer; | ||
+ | |||
+ | begin | ||
+ | | ||
+ | for I:=1 to 100 do | ||
+ | begin | ||
+ | writeln (‘введите сведения о’, I , ‘-м студенте’); | ||
+ | writeln (‘введите фамилию, | ||
+ | readln (student[I].fio); | ||
+ | writeln (‘введите дату рождения’); | ||
+ | readln (student[I].dat_r); | ||
+ | writeln (‘введите адрес’); | ||
+ | readln(student[I].adres); | ||
+ | writeln (‘введите курс’); | ||
+ | readln(student[I].curs); | ||
+ | writeln (‘введите группу’); | ||
+ | readln (student[I].grupp); | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | | ||
+ | for I:=1 to 100 do | ||
+ | if student[I].curs=2 then | ||
+ | | ||
+ | end. | ||
+ | </ | ||
+ | |||
+ | ===== Оператор присоединения или как избавиться от префикса ===== | ||
+ | |||
+ | **Префикс** – обязательная предшествующая часть составного идентификатора для имен полей в структуре типа запись Паскаля. Очень часто у программиста возникает желание не указывать префикс в имени полей, например, | ||
+ | |||
+ | <code pascal|Оператор присвоения> | ||
+ | with < | ||
+ | </ | ||
+ | |||
+ | Следует обратить внимание на то, что после служебного слова **do** может стоять только один оператор, | ||
+ | |||
+ | Например, | ||
+ | |||
+ | <code pascal|Пример фрагмента программы c записью и префиксом Паскаля> | ||
+ | for I:=1 to 100 do | ||
+ | with student[I] do | ||
+ | begin | ||
+ | writeln (‘введите сведения о’, I , ‘-м студенте’); | ||
+ | writeln (‘введите фамилию, | ||
+ | readln (fio); | ||
+ | writeln (‘введите дату рождения’); | ||
+ | readln (dat_r); | ||
+ | writeln (‘введите адрес’); | ||
+ | readln(adres); | ||
+ | writeln (‘введите курс’); | ||
+ | readln(curs); | ||
+ | writeln (‘введите группу’); | ||
+ | readln (grupp); | ||
+ | | ||
+ | < |