Программа курса
"Практикум на ЭВМ" (алгоритмы и структуры данных)
В. В. Борисенко
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.