мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| 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); | ||
| + | | ||
| + | < | ||