
- •Структуры и алгоритмы обработки данных
- •Логическая и физическая структуры данных
- •Классификация структур данных
- •Основные операции над структурами данных
- •Алгоритм и примеры задач, решаемых с помощью алгоритмов
- •Адресация и распределение памяти
- •Адресные пространства и модели оперативной памяти
- •Формирование физического адреса в реальном режиме
- •Особенности адресации в защищенном режиме
- •Кэширование
- •Анализ алгоритмов
- •Быстродействие – основной показатель эффективности алгоритма
- •Подсчет числа простейших операций
- •Лучший, средний и худший случаи
- •Алгоритмы и платформы
- •Виртуализация памяти
- •Использование кэша
- •Выравнивание данных
- •Рандомизированные алгоритмы
- •Общая характеристика записей и способы описания в Delphi
- •Многоуровневые записи
- •Выравнивание и упакованные записи
- •Записи с вариантной частью
- •Массивы
- •Общая характеристика массивов
- •Статические (стандартные) массивы
- •Многомерные статические массивы
- •Свойства статических массивов
- •Открытые массивы
- •Динамические массивы
- •Динамические векторы
- •Многомерные динамические массивы
- •Массивы типа Variant
- •Вставка и удаление в массиве
- •Связные списки и алгоритмы их обработки
- •Списки и их разновидности
- •Односвязный список
- •Общая характеристика односвязного списка
- •Структура элемента односвязного списка
- •Формирование односвязного списка
- •Просмотр односвязного списка
- •Вставка элемента в односвязный список
- •Удаление элемента из односвязного списка
- •Линейный двухсвязный список
- •Структура элемента двухсвязного списка
- •Реализация операций в линейном двухсвязном списке
- •Нелинейный двухсвязный список
- •Нелинейный трехсвязный список
- •Определение плекса и его общие признаки
- •Иерархическая списковая структура. Сетевая структура
- •Достоинства и недостатки связных списков
- •Функциональные и свободные списки
- •Общая характеристика функционального и свободного списка
- •Методы формирования свободного списка
- •Стеки, очереди, деки и операции в них
- •Общая характеристика
- •Очередь
- •Динамические множества и словари
- •Общая характеристика
- •Операции в динамических множествах
- •Деревья
- •Общая характеристика и некоторые определения
- •Представление дерева в памяти
- •Естественное представление дерева
- •Представление дерева с помощью вектора
- •Представление дерева с использованием списков сыновей
- •Методы обхода деревьев
- •Бинарное дерево
- •Структура бинарного дерева
- •Формирование бинарного дерева
- •Обход бинарного дерева
- •Преобразование любого дерева к бинарному дереву
- •Включение и исключение в дереве
- •Включение в дереве
- •Исключение в дереве
- •Поиск: определение и общая терминология
- •Линейный (последовательный) поиск
- •Последовательный поиск в упорядоченной таблице
- •Последовательный поиск при накоплении запросов
- •Индексно-последовательный поиск
- •Бинарный поиск
- •Поиск, использующий бинарное дерево
- •Сортировка
- •Общие сведения и некоторые определения
- •Внутренняя сортировка
- •Сортировка прямыми включениями
- •Сортировка бинарными включениями
- •Сортировка прямым выбором
- •Сортировка прямым обменом
- •Сортировка методом Шелла
- •Сортировка с помощью бинарного дерева
- •Пирамидальная сортировка
- •Быстрая сортировка разделением
- •Внешняя сортировка
- •Сортировка прямым слиянием
- •Сортировка естественным слиянием
- •Сортировка многопутевым слиянием
- •Многофазная сортировка
- •Хеширование и хеш-таблицы
- •Общие сведения и определения
- •Коллизии при хешировании
- •Разрешение коллизий при хешировании
- •Разрешение коллизий методом открытой адресации
- •Разрешение коллизий методом цепочек
- •Функции хеширования
- •Поисковые деревья
- •Бинарное дерево поиска
- •Структура бинарного дерева поиска и алгоритм поиска
- •Вставка элемента в бинарное дерево поиска
- •Удаление из бинарного дерева поиска
- •Красно-черные деревья
- •Определение красно-черного дерева, структура его элементов
- •Повороты
Записи с вариантной частью
Иногда в записях в зависимости от ситуации могут присутствовать различные наборы полей или поля могут иметь различные типы. Было бы нерационально отводить место под все возможные поля, если все они одновременно не используются. В этих случаях можно вводить в запись вариантную часть, в которой перечисляются варианты полей и условия их использования.
Вариантная часть оформляется как оператор множественного выбора Case, который размещается в описании типа записи после объявления обязательных полей (т. е. полей, присутствующих при любых условиях). Вариантная часть начинается ключевым словом Case. Тег (tag ярлык, признак) любой допустимый идентификатор. Его указание не обязательно. Если тег указывается, то в запись включается соответствующее ему поле, по значению которого можно узнать, какой именно вариант полей используется. При отсутствии тега не записывается и двоеточие после него. Приведем общую форму описания записи с вариантной частью.
|
Type <имя типа> = Record <список имен обязательных полей>: <тип 1>; <список имен обязательных полей>: <тип m>; Case <тег> : <порядковый тип> Of <список значений 1>: (<вариант 1>); <список значений n>: (<вариант n>); End;
|
Вариантная часть |
После тега или сразу после слова Case, если тег отсутствует, указывается порядковый тип. В случае, когда тег указан, этот тип является типом поля тега. Если тега нет, то это просто тип значений, которые будут перечисляться ниже.
В части <список значений> указывается одно или несколько значений заданного порядкового типа (типа тега). А <вариант>, указываемый в круглых скобках, это разделенный символами «;» список объявлений вариантных полей, не входящих в списки обязательных полей. Каждое такое объявление имеет вид:
<список имен полей> : <тип>;
Указываемые типы полей не могут быть длинными строками, динамическими массивами, интерфейсами, Variant или структурами, содержащими эти запрещенные типы. Но тип поля может быть указателем на подобные типы.
Объявленные варианты полей занимают в памяти один и тот же участок. Компилятор отводит слот для всей записи, ориентируясь на самый большой по размеру вариант. Все обязательные поля, поле тега и все поля всех вариантов доступны программе в любой момент времени, независимо от значения тега. Программа может в любой момент занести в запись значение любого поля любого варианта. Но если после этого заносится значение поля другого варианта, оно может изменить значение предыдущего варианта. Для контроля таких изменений предназначен тег. Например, пусть имеются следующие объявления:
Type
TRecVar = Record
Flag: Boolean;
longField: LongInt;
Case logVal: Boolean Of
True: (X1, Y1: Real; intField: Integer);
False:(A1: Real; ch1, ch2: Char);
End;
Var RecVar: TRecVar;
Адрес всей переменной RecVar совпадает с адресом ее поля Flag, допустим, этот адрес равен $41. Несмотря на то, что поле Flag занимает один байт, адрес поля longField будет на 4 больше за счет выравнивания, т. е. он будет равен $45. Поля Х1 и А1 будут занимать один и тот же слот размером 8 байт. Поэтому если программа присвоит некоторое значение полю Х1, то это же значение будет наблюдаться в поле А1. Вывод: чтобы избежать ошибок, связанных с интерпретацией содержимого различных полей, необходимо внимательно контролировать значение тега.