- •1.1. Основные этапы создания программы
- •1.2. Алгоритмы
- •2.1. Структура типов в Turbo Pascal
- •Стандартные скалярные типы. Типы целых чисел
- •2.3. Операции побитовой обработки
- •2.4. Представление вещественных чисел в эвм
- •2.5. Символьный тип
- •2.6. Булевский тип
- •2.7. Перечисленный тип
- •2.8. Интервальный тип (диапазон)
- •3.1. Структура программы на turbo pascal
- •3.2. Основные операторы языка
- •3.2.1. Простые операторы
- •3.2.2. Операторы ввода-вывода
- •3.2.3. Структурные операторы
- •3.2.4. Условные операторы
- •3.2.5. Операторы повтора (цикла)
- •4.1. Массивы
- •4.2. Строковый тип
- •4.3. Множества
- •5.1. Процедуры и функции
- •5.2. Процедуры и функции пользователя
- •5.3. Передача параметров по значению и по ссылке
- •5.4. Рекурсивные процедуры и функции
- •6.1. Структура модулей
- •6.2. Компиляция и использование модулей
- •7.1. Записи
- •7.2. Вложенные записи
- •7.3. Записи с вариантами (вариантные записи)
- •7.4. Файлы
- •7.5. Подпрограммы для работы с файлами
- •7.5.1. Процедуры
- •7.5.2. Функции
- •7.6. Примеры программ для обработки файлов
- •7.7. Текстовые файлы
- •8.1. Структура оперативной памяти для программ на Turbo Pascal
- •8.2. Динамические структуры данных
- •8.3. Основные процедуры и функции для работы с динамическими переменными
- •8.4. Динамика выделения памяти в куче
- •8.5. Линейные списки. Способы создания и обработки
- •8.6. Нелинейные списки. Способы создания и обработки
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
7.2. Вложенные записи
Поля записей могут в свою очередь быть тоже записями. В этом случае мы имеем дело с вложенными записями. Например, рассмотренную раннее запись можно расширить так:
type
wed = record
nomer: 1..100;
fio: record
fam: string[20];
name: string[10];
forname: string[10];
end;
gr: 1900.2007;
zp: real;
end;
var spisok: wed;
mspisok: array[1..100] of wed;
Для того, чтобы обратиться к какому-либо полю вложенной записи, необходимо через точку указать имя основной записи, имя вложенной записи и название
соответствующего поля: например, оператор writeln(spisok.fio.name) выведет на экран имя сотрудника.
Для вложенных записей можно использовать вложенный оператор with.
111
7.3. Записи с вариантами (вариантные записи)
Основная идея вариантной записи состоит в том, что находясь в рамках единой записи (структуры), определить в ней сразу несколько различных (альтернативных) записей. В самом общем случае такая запись может состоять из фиксированной и вариантной частей. Структура фиксированной части остается постоянной для всех экземпляров записей данного типа. Структура же вариантной части не постоянна, она меняется в зависимости от значения особого поля – поля селектора.
Рассмотрим пример базы данных прокатного пункта автомобилей. Общая характеристика базы данных представлена следующей схемой:
Автомобиль
Общая хар-ка Хар-ка пробега Прокат
Марка Пробег до проката Стоимость проката
Цвет Пробег после проката В прокате:
Год выпуска ФИО
Дата начала проката.
В ремонте:
Причина поступления
Дата поступления.
На месте:
Пустая запись.
Определим тип запись, соответствующий заданной схеме.
{Определяем значения селектора}
type st (в прокате, в ремонте, на месте);
{Определяем тип первой вложенной записи}
общая хар-ка = record
112
марка :string;
цвет :string;
год выпуска :1990..2006;
end;
{Определяем тип второй вложенной записи}
хар-ка пробега = record
пробег до проката : integer;
пробег после проката : integer;
end;
{Определяем третью вложенную запись, содержащую} {вариантную часть}
прокат = record
{Начало фиксированной части}
стоимость проката: real;
{Начало вариантной части}
case признак: st of
в прокате: (фио: string[20];
дата начала проката: string[10]);
в ремонте: (причина поступления : string[30];
(дата поступления : string[6]);
на месте: ( );
end;
автомобиль = record
d : общая хар-ка;
m : хар-ка пробега;
p : прокат
end;
var base1, base2: array[1..10] of автомобиль;
Отметим особенности определения вариантной записи:
- описание всех полей, относящихся к определенному значению селектора, заключено в круглые скобки; скобки играют роль ограничителей, указывающих начало и конец соответствующей группы полей;
113
- вариантная часть не завершается словом end, парным слову case, как это делается при обычном использовании case; это возможно, так как вариантная часть всегда должна размещаться в самом конце записи и слово end завершает одновременно и всю запись и ее вариантную часть.
Планируя размещение вариантной записи в памяти компьютера, компилятор всегда резервирует пространство для самого из протяженных из возможных вариантов полей. То есть, запись занимает максимальную область памяти, даже, если в какой-то момент она использует ее частично. При размещении в вариантной части записи нового варианта записи, старый вариант автоматически стирается.
Для рассматриваемого примера под вариантную запись отводится 36 байт. В зависимости от того, какой вариант используется, этот объем памяти может быть использован полностью (поле – в ремонте), частично (30 байт для поля – в прокате) и совсем не использоваться (поле – на месте).