| Предыдущая версия справа и слева
Предыдущая версия
|
|
bb:redbook:111 [2017/12/26 07:54] иван_денисов удалено |
— (текущий) |
| ===== 1.11 Введение в записи ===== | |
| |
| ==== 1. Понятие записи ==== | |
| Записи в **КП** не являются записями как в обыкновенной жизни, но тем не менее, имеют нечто похожее. Записям в жизни //всё-равно//, какого цвета ручка (или может быть это карандаш, фломастер). //Не важно// где выполнена запись — на обрывке листа, полях газеты или тетрадке. Ценность в записи — её //содержимое//. Поэтому, //запись// — это //сущность//, определяющая какую-то информацию. Можно считать, что //запись — это особый вид файла//. Но в отличии от //файла//, которому //безразлично//, что в него записали, у записи есть чёткое //разделение полей//, например: | |
| |
| * Фамилия | |
| * Имя | |
| * Отчество | |
| * Адрес | |
| * Телефон | |
| |
| В какой-то //записи//, например, нет отчества, в другой — нет телефона, но есть общее правило: все записи состоят из //полей//. //Поля// могут быть даже не заполненными, но они //есть//. Очень удобно, когда один раз описав поля записи, можно создать //массив записей//. Примерно так создаются //базы данных// (хотя надо понимать, что базы данных шагнули очень далеко, по сравнению с простым набором записей). Можно, конечно, хранить различные фамилии в одном массиве, а имена в другом массиве, а телефоны в третьем массиве, и собирать эти данные по общему индексу для всех массивов, но гораздо более красивое решение — хранить все эти переменные в одной записи в виде полей. Записи используются на столько широко, у них на столько обширные возможности, что в одной главе осветить охватить всё просто не получится. | |
| ==== 2. Пример записи ==== | |
| В тексте модуля, который приведён ниже, представлено объявление одной записи с несколькими полями: | |
| |
| Привет7.odc | |
| | |
| <code oberon2> | |
| MODULE КнигаПривет7; | |
| (* Этот пример показывает как объявлять записи *) | |
| |
| IMPORT Log, Math; | |
| | |
| VAR | |
| зТочка: RECORD | |
| цКоорд_х, цКоорд_у: INTEGER; | |
| бВключ: BOOLEAN; | |
| мцЦвет: ARRAY 3 OF INTEGER; | |
| END; | |
| |
| PROCEDURE Старт*; | |
| VAR | |
| BEGIN | |
| END Старт; | |
| |
| BEGIN | |
| END КнигаПривет7. | |
| </code> | |
| |
| В секции ''VAR'' модуля объявлена переменная ''зТочка'' с ключевым словом ''RECORD''. Это //не тип данных//, это переменная, которая является точкой входа для записи. В самой записи могут быть //любые// поля любого типа, в неограниченном количестве (конечно, учитывая размер свободной памяти и разумность попытки разместить всё под одним объявление ''RECORD''). Более того, в запись может быть включена другая запись, в которую может быть включена другая запись, в которую... | |
| |
| Описание полей в записи разделяются точкой с запятой, а само объявление записи ограничивается ключевым словом ''END;''. | |
| ==== 3. Обращение к полям записи ==== | |
| | |
| Обращение к полям записи происходит точно также, как и к простой переменной. Обращение к элементу массива в записи, в сущности, ничем не отличается от обращения к элементу простого масcива. Единственное отличие, перед полем записи должно быть указано имя соответствующей переменной с типом RECORD и подряд символ "." ("точка"). Пример такого обращения к записи: | |
| |
| Привет7.odc | |
| |
| <code oberon2> | |
| MODULE КнигаПривет7; | |
| (* Этот пример показывает как объявлять записи *) | |
| |
| IMPORT Log, Math; | |
| |
| VAR | |
| зТочка: RECORD | |
| цКоорд_х, цКоорд_у: INTEGER; | |
| бВключ: BOOLEAN; | |
| мцЦвет: ARRAY 3 OF INTEGER; | |
| END; | |
| |
| PROCEDURE Старт*; | |
| VAR | |
| лцИтер: INTEGER; | |
| BEGIN | |
| зТочка.цКоорд_х := 5; | |
| зТочка.цКоорд_у := 4; | |
| Log.Int(зТочка.цКоорд_х); Log.String(', '); | |
| Log.Int(зТочка.цКоорд_у); Log.Ln; | |
| зТочка.мцЦвет[0] := 4; | |
| зТочка.мцЦвет[2] := - 10; | |
| FOR лцИтер := 0 TO 2 DO | |
| Log.Int(зТочка.мцЦвет[лцИтер]); Log.String(', ') | |
| END; | |
| Log.Ln | |
| END Старт; | |
| |
| BEGIN | |
| END КнигаПривет7. | |
| |
| (!)КнигаПривет7.Старт | |
| </code> | |
| | |
| |
| В этом примере присваиваются значения полям ''цКоорд_Х'' и ''цКоорд_У''. В массиве ''мцЦвет'' элементам с номерами 0 и 2 также присваиваются значения. Обратите внимание, на именование полей — все они с //маленькой// буквы. В записях //могут быть// ссылки на процедуры, а процедуры //должны// именоваться с //большой// буквы (а иначе отличить одно от другого без чтения документации, либо исходных кодов — будет тяжело). Если всё сделано правильно, то будет получен такой вывод: | |
| |
| компилируется "КнигаПривет7" 156 24 | |
| старый модуль КнигаПривет7 выгружен | |
| 5, 4 | |
| 4, 0, -10, | |
| |
| из которого можно сделать вывод, что //действительно// поля записи меняют свои значения. | |
| ==== 4. Заключение ==== | |
| | |
| Это коротенькое введение очень важно. Так как **Компонентный Паскаль** очень сильно приспособлен под использование записей в связи с его подходом к построению программ. Пользоваться записями впереди предстоит часто. | |