- •Алгоритмы и структуры данных
- •Введение
- •1.1. Практикум по теме
- •Индивидуальные задания к темам «Хеш-таблицы» и «Деревья двоичного поиска»
- •1.2. Требования к отчёту
- •1.3. Контрольные вопросы
- •2. Деревья двоичного поиска
- •2.1. Практикум по теме
- •Варианты вида дерева для реализации в теме «Деревья двоичного поиска»
- •2.2. Требования к отчёту
- •2.3. Контрольные вопросы
- •3. Поддержка произвольной последовательности в структуре данных для множеств
- •3.1. Практикум по теме
- •Индивидуальные задания к теме «Последовательности»
- •3.2. Требования к отчёту
- •3.3. Контрольные вопросы
- •4. Работа с иерархией объектов: наследование и полиморфизм
- •4.1. Учебная программа «Библиотека фигур»
- •4.2. Практикум по теме
- •Коллекция дополнительных фигур
- •Продолжение табл. 4.1
- •Окончание табл. 4.1
- •Индивидуальные задания к теме «Наследование и полиморфизм»
- •4.3. Требования к отчёту
- •4.4. Контрольные вопросы
- •5. Поддержка обработки исключительных ситуаций
- •5.1. Практикум по теме
- •5.2. Требования к отчёту
- •5.3. Контрольные вопросы
- •6. Использование стандартной библиотеки шаблонов
- •6.1. Практикум по теме
- •6.2. Требования к отчёту
- •6.3. Контрольные вопросы
- •7. Курсовая работа. Измерение временной сложности алгоритма
- •7.1. Пример программы для эксперимента
- •7.2. Обработка результатов эксперимента
- •7.3. Оформление результатов эксперимента
- •7.4. Выводы
- •Список литературы
- •Приложение Измерение времени запросом внутреннего счётчика тактов процессора
- •Содержание
- •197376, С.-Петербург, ул. Проф. Попова, 5
3.2. Требования к отчёту
В отчёте по этой теме должно быть обоснование выбора способа дополнения базовой структуры данных для обеспечения возможности выполнения операций с последовательностями. В выводах можно дать заключение, насколько выбор оказался удачным.
3.3. Контрольные вопросы
1. Почему для хранения произвольной последовательности структуру данных для множества (хеш-таблицу или ДДП) приходится дорабатывать?
2. Какие доработки возможны?
3. Можно ли предложить оптимальный вариант доработки?
4. Влияет ли доработка структур данных для множеств для поддержки последовательностей на временную сложность операций над множествами?
5. Какую структуру данных проще дорабатывать — хеш-таблицу или ДДП?
6. Какова оптимальная доработка структуры данных и временная сложность для операции исключения части последовательности между указанными позициями?
7. То же — для операции вставки с указанной позиции?
8. То же — для замены?
4. Работа с иерархией объектов: наследование и полиморфизм
Производные классы — это простое, гибкое и эффективное средство определения класса с целью повторного использования готового программного кода. Новые возможности добавляются к уже существующему классу, не требуя его перепрограммирования или перекомпиляции. С помощью производных классов можно организовать общий интерфейс с несколькими различными классами так, что в других частях программы можно будет единообразно работать с объектами этих классов. Понятие виртуальной функции позволяет использовать объекты надлежащим образом даже в тех случаях, когда их тип на стадии трансляции неизвестен. Основное назначение производных классов — упростить программисту задачу выражения общности классов.
Любое понятие не существует изолированно, оно существует во взаимосвязи с другими понятиями, и мощность данного понятия во многом определяется наличием таких связей. Раз класс служит для представления понятий, встаёт вопрос, как представить взаимосвязь понятий. Понятие производного класса и поддерживающие его языковые средства служат для представления иерархических связей, иными словами, для выражения общности между классами. Например, понятия окружности и треугольника связаны между собой, так как оба они представляют ещё понятие фигуры, т. е. содержат более общее понятие. Чтобы представлять в программе окружности и треугольники и при этом не упускать из вида, что они являются фигурами, надо явно определять классы окружность и треугольник так, чтобы было видно, что у них есть общий класс — фигура. Эта простая идея по сути является основой того, что обычно называется объектно-ориентированным программированием.
Подробнее см. [6, с. 149–180], [7, с. 200–210].
Рассмотрим учебную программу, использующую некоторые из этих идей, прототип которой взят из [6]. Программа предназначена для вывода на экран картинок, составленных из набора заготовок — «фигур».
В программе объявлен абстрактный класс «фигура» (shape). Все конкретные фигуры — линия, прямоугольник и т. п. — являются производными от этого класса. Класс «фигура» поддерживает действия, необходимые для всех фигур: он создаёт из всех объявляемых фигур общий список, который может быть обработан программой рисования при выдаче фигур на экран. Кроме того, в классе «фигура» объявлен набор функций-членов, которые должны поддерживать все фигуры, чтобы из них можно было создавать картинки. Это функции, возвращающие координаты всех крайних точек фигуры, по которым их можно будет стыковать. Эти функции — чисто виртуальные, они должны быть обязательно определены затем отдельно в каждой фигуре. Имеются также два дополнительных класса, уточняющие свойства фигур. Некоторые фигуры можно поворачивать. Для таких фигур имеется базовый класс rotatable, производный от shape. Для других фигур возможна операция отражения относительно горизонтальной или вертикальной оси. Эти фигуры можно строить на базе класса reflectable. Если фигура имеет оба этих свойства, то она должна быть производной от обоих классов.
Класс «фигура» является ядром библиотеки фигур snape.h. Имеется также библиотека поддержки работы с экраном screen.h, в которой определены размеры экрана, введено понятие точки и перечислены утилиты работы с экраном, конкретизированные затем в shape.h. Для простоты и универсальности работа с экраном реализована как формирование и построчный вывод матрицы символов.
Предполагается, что файлы screen.h и shape.h — покупные, а разработчик создаёт только третий файл — с самой прикладной программой.
