мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
pascal:records [17/10/2011 11:49] – создано dnaumov | pascal:records [17/10/2011 13:04] (текущий) – dnaumov | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
===== Объединение разнородных элементов (Запись) ===== | ===== Объединение разнородных элементов (Запись) ===== | ||
- | Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, | + | Массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, |
- | Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, | + | Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, |
- | **Запись | + | **Запись – структурированный комбинированный тип данных, |
- | Например, | + | Например, |
{{: | {{: | ||
Строка 13: | Строка 13: | ||
Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом: | Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа **record (запись)**. Задать тип можно следующим образом: | ||
- | < | + | < |
type < имя _ типа >=record | type < имя _ типа >=record | ||
- | < | + | < |
- | < | + | < |
| | ||
- | < | + | < |
end ; | end ; | ||
</ | </ | ||
+ | |||
+ | где **record** – служебное слово, а **< | ||
+ | |||
+ | Описание анкеты ученика в Паскале будет выглядеть так: | ||
+ | |||
+ | <code pascal|Пример фрагмента программы описания записи Паскаля> | ||
+ | Type anketa=record | ||
+ | fio: string[45]; | ||
+ | pol: char; | ||
+ | | ||
+ | | ||
+ | cl: string[5]; | ||
+ | gr: string[3]; | ||
+ | end; | ||
+ | </ | ||
+ | |||
+ | Такая запись Паскаля, | ||
+ | |||
+ | Поля записи Паскаля могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | <code pascal|Пример фрагмента программы описания записи Паскаля> | ||
+ | Type anketa1=record | ||
+ | fio: string[45]; | ||
+ | pol: char; | ||
+ | | ||
+ | god: integer; | ||
+ | mes: string[10]; | ||
+ | den: 1..31; | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | | ||
+ | dom, kv: integer; | ||
+ | end; | ||
+ | cl: string[5]; | ||
+ | gr: string[3]; | ||
+ | end; | ||
+ | </ | ||
+ | |||
+ | ===== Поля ===== | ||
+ | |||
+ | После того, как определен тип записи Паскаля, | ||
+ | |||
+ | <code pascal|Задание переменной> | ||
+ | var | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Теперь нам нужно узнать, | ||
+ | |||
+ | <code pascal|Уточняющий идентификатор> | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Например, | ||
+ | |||
+ | <code pascal|Обращение к полю cl> | ||
+ | pupil.cl :=3; | ||
+ | < | ||
+ | |||
+ | Для того чтобы обратиться к полю god в записи pupil1, необходимо записать уточняющий идентификатор, | ||
+ | |||
+ | <code pascal|Обращение к полю god> | ||
+ | pupil1.dat_r.god: | ||
+ | </ | ||
+ | |||
+ | Использование полей записи Паскаля в выражениях и условиях идентично использованию обычных переменных. | ||
+ | |||
+ | ===== Операции над записями ===== | ||
+ | |||
+ | Единственная операция, | ||
+ | |||
+ | |||
+ | <code pascal|Присваивание> | ||
+ | var | ||
+ | | ||
+ | |||
+ | begin | ||
+ | |||
+ | ... | ||
+ | |||
+ | | ||
+ | |||
+ | ... | ||
+ | |||
+ | end. | ||
+ | </ | ||
+ | |||
+ | Все другие операции производятся над отдельными полями записи. | ||
+ | |||
+ | ===== Пример решения задачи с использованием записей ===== | ||
+ | |||
+ | Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран. | ||
+ | |||
+ | Пусть нам необходимо заполнить сведения об ученике (Ф.И.О., дата рождения, | ||
+ | |||
+ | <code pascal|Пример программы c записью Паскаля> | ||
+ | program primer1; | ||
+ | |||
+ | type anketa=record | ||
+ | fio: string[45]; | ||
+ | | ||
+ | | ||
+ | cl: string[5]; | ||
+ | gr: string[3] | ||
+ | end; | ||
+ | |||
+ | var pupil: anketa; | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end. | ||
+ | </ | ||
+ | |||
+ | А теперь слегка усложним задачу. Пусть нам необходимо иметь сведения о многих учениках, | ||
+ | |||
+ | <code pascal|Пример программы c записью Паскаля> | ||
+ | program primer2; | ||
+ | |||
+ | type anketa=record | ||
+ | fio: string[45]; | ||
+ | | ||
+ | | ||
+ | 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; | ||
+ | | ||
+ | | ||
+ | | ||
+ | for I:=1 to 100 do | ||
+ | if pupil[I].cl=' | ||
+ | | ||
+ | end. | ||
+ | </ | ||
+ | |||
+ | ===== Оператор присоединения или как избавиться от префикса ===== | ||
+ | |||
+ | **Префикс** – обязательная предшествующая часть составного идентификатора для имен полей в структуре типа запись Паскаля. Очень часто у программиста возникает желание не указывать префикс в имени полей, например, | ||
+ | |||
+ | <code pascal|Оператор присвоения> | ||
+ | with < | ||
+ | </ | ||
+ | |||
+ | Следует обратить внимание на то, что после служебного слова **do** может стоять только один оператор, | ||
+ | |||
+ | Например, | ||
+ | |||
+ | <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); | ||
+ | | ||
+ | < |