Программа курса
"Практикум на ЭВМ" (алгоритмы и структуры данных)
В. В. Борисенко
2011-12 учебный год
-
Основные понятия объектно-ориентированного программирования:
класс, описание класса и объекты. Члены и методы класса.
Примеры объектно-ориентированных языков. Язык С++ как
промежуточный между традиционными и объектно-ориентированными
языками. Основные различия между традиционными и
объектно-ориентированными языками на примере различий
между C++ и C# или Java (наличие контролируемой динамической
память и процесса сборки мусора, различия при размещении
объектов в памяти, в создании и удалении объектов).
Достоинства и недостатки объектно-ориентированных
языков.
-
Язык C++.
Типы, операции. Классы, члены классов, методы.
Конструктор по умолчанию и copy-конструктор. Переопределение
операторов для классов на примере классов "вектор на плоскости",
"точка", "прямоугольник". Правильное
использование модификатора const и задание типов возвращаемых
значений для разных типов операторов и методов.
-
Обработка исключений в языке C++.
Стек, реализация стека на базе массива.
Обратная польская запись формул.
Проект "Стековый калькулятор". Другие примеры
использования обратной польской записи: язык PostScript,
промежуточный код в языках Java и C#.
-
Статические члены и методы классов.
Наследование классов, виртуальные методы.
Программирование в оконных средах:
общие принципы. Преимущества объектно ориентированного
в случае программирования в оконной среде. Проект
"График функции".
-
Абстрактные типы данных и контейнеры как обобщение
структур данных. Описание абстрактного типа данных
и его реализация. Основные виды контейнеров, используемые
в программировании:
последовательного доступа -- стек, очередь,
дек, двусвязный и односвязный списки; прямого доступа -- массив,
динамический массив (вектор), матрица, множество, нагруженное
множество (отображение, словарь), дерево, граф.
Реализация стека и дека (очереди) на базе массива.
Способы реализация циклов "для каждого элемента", итераторы.
-
Схема построения цикла с помощью инварианта.
Применения этой схемы: алгоритм Евклида,
алгоритм быстрого возведения в степень,
расширенный алгоритм Евклида,
вычисление логарифма без разложения в ряд,
бинарные алгоритмы умножения и деления чисел.
-
Непрерывные реализации множества и нагруженного множества
(отображения, ассоциативного массива):
наивная реализация, реализация с помощью бинарного поиска.
Применение сxемы построения цикла с помощью инварианта
в алгоритме бинарного поиска.
-
Бинарная куча и ее реализация.
-
Задача сортировки массива.
Оценка минимального числа сравнений в произвольном
алгоритме сортировки. Три алгоритма сортировки.
-
Сортировка кучей (Heap Sort):
идея, применение схемы построения цикла с помощью
инварианта для написания программы и доказательства
ее правильности.
-
Сортировка слиянием, идея.
-
Алгоритм быстрой сортировки (Quick Sort).
Применение схемы построения
цикла с помощью инварианта для написания подпрограммы,
разделяющей массив на три отрезка: элементы меньше медианы,
медиана, элементы больше медианы.
-
Непрерывные и ссылочные реализации контейнеров.
Идея ссылочной реализации, достоинства и недостатки
непрерывных и ссылочных реализаций.
Реализация Л2-списка на С++: классы L2ListHeader и
L2List. Особенность реализации с использованием
динамической памяти: наследование и виртуальные
деструкторы.
-
Бинарные деревья и деревья поиска.
Идея реализации множества и нагруженного множества (отображения)
с помощью бинарного дерева поиска.
Алгоритмы поиска и добавления элемента для
деревьев поиска.
Алгоритм нахождение следующей вершины дерева и
обхода вершин дерева в порядке их возрастания.
Сбалансированные и почти сбалансированные деревья,
AVL-деревья.
-
Красно-черные деревья: определение и свойства.
Восстановление структуры красно-черного дерева при
добавлении элемента: операции вращения вершины вправо и влево,
рассмотрение различных случаев при добавлении элемента с
нарушением свойств красно-черного дерева.
Реализация нагруженного множества на основе
красно-черного дерева: проект "TreeSet".
Рекомендуемая литература
-
Б. Страуструп. Язык программирования C++ (третье издание). —
Пер. с англ. — СПб., М.: «Невский диалект». Издательство
«Бином», 1999.
-
Д. Кнут. Искусство программирования для ЭВМ. Т. 1–3. — Пер. с англ. —
М.: Мир, 1976–1978.
-
Н. Вирт. Алгоритмы + структуры данных = программы. —
Пер. с англ. — М.: Мир, 1985.
-
А. Г. Кушниренко, Г. В. Лебедев.
Программирование для математиков:
Учебное пособие для вузов. — М., Наука, 1988.
-
А. Г. Кушниренко, Г. В. Лебедев, Р. А. Сворень. Основы
информатики и вычислительной техники. — М.: Просвещение, 1996.
-
В. В. Борисенко. Основы программирования. —
М., Интернет-университет информационных технологий–ИНТУИТ.ру, 2005.
-
У. Робинсон. C# без лишних слов. —
Пер. с англ. — М., ДМК-Пресс, 2002.
-
Френл М. Каррано, Джаннет Дж. Причард. Абстракция данных
и решение задач на C++. Стены и зеркала. 3-е издание.
"Диалектика-Вильямс", 2003.
-
Роберт Седжвик. Алгоритмы на C++. Фундаментальные алгоритмы
и структуры данных. 2 книги в одной! "Диалектика-Вильямс", 2010.
-
Бьярне Страуструп. Программирование: принципы и практика использования
языка C++. Вильямс, 2010.
-
Бертран Мейер. Объектно-ориентированное конструирование
программных систем + CD. Интернет-университет информационных
технологий - ИНТУИТ.ру, Русская Редакция, 2005.