- •Понятие о структуре данного. Уровни представления структур данных.
- •Классификация сд в программах пользователя и в памяти эвм
- •Сд в оперативной памяти
- •Сд типа массив.
- •Сд типа запись (прямое декартово произведение).
- •Сд типа таблица.
- •Операции над таблицей:
- •Временная сложность алгоритмов.
- •Сд типа хеш-таблица.
- •Операция включения элемента в таблицу.
- •Операция исключения элемента из таблицы:
- •Сортировки. Улучшенные методы сортировок.
- •Классификация задач по временной сложности.
- •Сд типа стек.
- •Алгоритм сортировки Хоара (стек используется для хранения границ сортируемой области в таблице):
- •Сд типа очередь.
- •Связное распределение памяти.
- •Сд типа линейный односвязный список.
- •Сд типа указатель.
- •Статические и динамические переменные.
- •Сд типа циклический линейный список.
- •Сд типа двусвязный линейный список.
- •Сд типа дек.
- •Многосвязные списки.
- •Средства объектно-ориентированного программирования.
- •Объекты и свойства инкапсуляции.
- •Наследование и переопределение.
- •Полиморфизм. Виртуальные методы.
- •Динамические объекты. Деструкторы.
- •Обработка ошибок при работе с динамическими объектами.
- •Модули, экспортирующие объекты.
- •Нелинейные структуры данных.
- •Сд типа дерево.
- •Представление деревьев в связной памяти эвм.
- •Алгоритмы прохождения деревьев в глубину и в ширину.
- •Представление деревьев в виде бинарных.
- •Представление бинарных деревьев в связной памяти. Прошитые деревья
- •Формирование бинарного дерева.
- •Применение бинарных деревьев в алгоритмах поиска.
- •Операция включения в сд типа бинарное дерево.
- •Операция исключения из бинарного дерева.
- •Представление бинарного дерева в прямоугольной памяти.
- •Применение бинарных деревьев.
- •Сд типа граф.
- •Представление графа в памяти эвм.
- •Алгоритмы прохождения графа.
- •Топологическая сортировка.
- •Организация данных во внешней памяти. Типы и характеристики устройств внешней памяти.
- •Сд типа последовательный файл.
- •Сд типа файл прямого доступа.
- •Сд типа индексно-последовательный файл.
- •Сд типа хеш-файл.
- •Внешняя сортировка.
- •Алгоритм прямого слияния.
- •Многофазная сортировка.
- •Сущность базы данных. Системы управления базами данных.
- •Общая структура субд.
- •Реляционная модель субд.
- •Язык реляционной алгебры.
Наследование и переопределение.
Наследование – это свойство объектов, позволяющее при построении нового объекта использовать уже созданные ранее объекты. Пусть, например, необходимо построить объектовый тип, управляющий геометрической фигурой – кругом. Структура информации для определения круга очень похожа на описанную выше структуру для точки, поэтому для определения круга будем иметь объектовый тип следующего вида:
Type Circle = Object (Point)
Radius: integer;
end;
Описание такого объекта осуществляется с помощью применения наследования: объект Point является родителем, а Circle – потомком. При этом новый тип автоматически получает все поля и методы ранее введенного типа и может их использовать:
Var ObCircle: Circle;
begin
ObCircle.Init (30, 40);
…………………….
Таким образом, наследование на языке Turbo Pascal может быть описано таким образом:
Type <имя нового объекта> = Object (имя объекта-родителя)
< новые поля данных>
<новые методы потомка>
end;
Следует заметить, что один тип может являться предком для произвольного числа типов- потомков, в то время как любой объектовый тип может наследовать поля и методы только одного типа-родителя.
Переопределение – это свойство объектов, позволяющее переопределить в объекте-потомке методы объекта-родителя, оставив при этом прежние имена подпрограмм:
Type Circle =Object (Point)
Radius: integer;
Procedure Init (a, b, R: integer);
Procedure SwitchOn;
Procedure SwitchOff;
Procedure Move (dx, dy: integer);
Function GetR: integer;
End;
Procedure Circle.Init (a, b, R: integer);
begin
Point.Init (a, b);
Radius:=R;
end;
…………………………..
Procedure Circle.SwitchOn;
begin
v:=true;
Graph.Circle (x, y, R);
end;
…………………………
Из свойства наследования вытекают новые правила присваивания для переменной типа Object: присваивать можно не только объекты эквивалентных типов, но операция присваивания осуществляется также для типов, которые находятся в отношении наследования, причем присваивание происходит в направлении:
<родитель>::=<наследник>
При этом копируются только те поля, которые являются общими для обоих типов.
Как правило, основная часть работы по написанию объектно-ориентированных программ состоит в построении иерархии объектов.
Полиморфизм. Виртуальные методы.
Имеем описания двух объектовых типов:
Type Point =Object
x, y: integer;
v: boolean;
Procedure Init (a, b: integer);
Procedure SwitchOn;
Procedure SwitchOff;
Procedure Move (dx, dy: integer);
Function GetX: integer;
Function GetY: integer;
End;
Type Circle =Object (Point)
Radius: integer;
Procedure Init (a, b, R: integer);
Procedure SwitchOn;
Procedure SwitchOff;
Procedure Move (dx, dy: integer);
Function GetR: integer;
End;
Алгоритм метода Move похож для обоих типов, поэтому определим его для объектового типа Point, а тип-потомок Circle унаследует его без переопределения:
Procedure Move (dx, dy: integer);
begin
SwitchOff;
x:=x+dx; y:=y+dy;
SwitchOn;
end;
Имеем экземпляры двух объектов рассматриваемых типов:
Var ObPoint: Point;
ObCircle: Circle;
В случае такого описания объектовых типов при выполнении следующих двух сообщений: ObPoint.Move (20, 30); ObCircle.Move (10, 15); возникает коллизия. Причиной ее является то, что унаследованный метод Move жестко связан с методом Point, поэтому метод Move всегда будет вызывать метод Point.SwitchOff. Связь этих методов является статической, т.к. она была определена при компиляции. Таким образом, при выполнении сообщения ObCircle.Move (10, 15); на экране также будет перемещаться точка, а не круг.
………... Move ……….
Код метода Point.Move
Код метода Point.SwitchOff
статическая связь
ObPoint
Код метода Circle.SwitchOff
……….. Move ……….
ObCircle
Таким образом, если мы имеем один метод для различных объектов, то необходимо разорвать статическую связь, а также обеспечить возможность для Move подключать либо метод Point.SwitchOff, либо метод Circle.SwitchOff в зависимости от того, какой объект вызывает Move. Такой механизм называется динамическим или поздним связыванием и достигается с помощью применения виртуальных методов.
Для того, чтобы определить виртуальный метод, необходимо указать после его заголовка в объектовом типе служебное слово virtual. При этом во всех потомках объектового типа переопределяющие методы должны также специфицироваться как виртуальные; кроме того, они должны иметь такой же набор формальных параметров, что и самый первый виртуальный метод. Таким образом, для правильного выполнения нашего примера, вышеуказанные объекты должны быть описаны следующим образом:
Type Point =Object
…………………….
Constructor Init (a, b: integer);
Procedure SwitchOn; virtual;
Procedure SwitchOff; virtual;
Procedure Move (dx, dy: integer);
…………………….
End;
Type Circle =Object (Point)
…………………….
Constructor Init (a, b, R: integer);
Procedure SwitchOn; virtual;
Procedure SwitchOff; virtual;
…………………….
End;
В этом случае, при выполнении цепочки вызовов ObPoint.Move (20, 30); ObCircle.Move (10, 15); один и тот же метод Move будет работать по-разному в зависимости от того, какой объект этот метод вызывает. Такое свойство называется полиморфизмом.
При виртуализации методов должны выполняться следующие условия:
Если родительский тип объекта описывает метод как виртуальный, то все его производные типы, которые реализуют метод с тем же именем, тоже описываются как виртуальные (т.е. нельзя виртуальный метод заменять статическим).
Если переопределяется реализация виртуального метода, то заголовок заново определяемого виртуального метода в производном типе или объекте не может быть изменен.
В описании объекта должен обязательно описываться специальный метод (обычно это метод, выполняемый первым – метод инициализации). Слово Procedure, при этом, заменяется ключевым словом Constructor. Это особый вид процедуры, определяющий установочную функцию для механизма виртуальных методов. Суть механизма виртуальных методов состоит в том, что каждый объектный тип (но не экземпляр) имеет свою таблицу виртуальных методов ,которая содержит размер объекта и адреса кодов виртуальных методов. При вызове виртуального метода каким-либо экземпляром местонахождение кода определяется по таблице. Конструктор же определяет связь между экземпляром объекта и таблицей виртуальных методов. Конструкторы могут быть только статическими, хотя внутри его могут быть использованы виртуальные методы.
Выбор метода. Необходимо делать метод виртуальным, если есть хотя бы малейшая вероятность того, что понадобится переопределение этого метода. Это обеспечивает расширяемость программ. С другой стороны, если объект имеет хотя бы один виртуальный метод, то для него создается таблица виртуальных методов и каждый вызов виртуального метода происходит через обращение к таблице. Таким образом, выбор надо делать между некоторым малозаметным увеличением скорости вычислений при эффективном использовании памяти, которое дают статические методы, и гибкостью, которую представляют виртуальные методы.