Правительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Национальный исследовательский университет «Высшая школа экономики» Факультет компьютерных наук Департамент анализа данных и искусственного интеллекта Программа дисциплины Алгоритмы и структуры данных для направления 010400.62 «Прикладная математика и информатика» подготовки бакалавра Автор программы Корухова Ю.С., кандидат физ.-мат. наук ([email protected]), Одобрена на заседании кафедры Анализа данных и искусственного интеллекта «___»____________ 2014 г. Зав. кафедрой Кузнецов С.О. Москва, 2014 Настоящая программа не может быть использована другими подразделениями университета и другими вузами без разрешения кафедры-разработчика программы. 1. Аннотация Дисциплина «Алгоритмы и структуры данных» предназначена для подготовки бакалавров направления «Прикладная математика и информатика». Она продолжает цикл дисциплин, связанных с основами информационных технологий и программирования. В курсе изучаются абстрактные типы данных и методы их реализации на языке высокого уровня с учетом принципов объектно-ориентированного конструирования программ. Рассматриваются способы синхронизации и организации взаимодействия параллельных процессов, использующих разделяемые ресурсы, а также библиотеки построения интерфейсов программ. Теоретический материал курса подкрепляется практическими занятиями по программированию заданий по изучаемой тематике. 2. Область применения и нормативные ссылки Настоящая программа устанавливает минимальные требования к знаниям и умениям студента и определяет содержание и виды учебных занятий и отчетности. Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов второго года обучения в бакалавриате по направлению 010400.62 «Прикладная математика и информатика». Программа разработана в соответствии с: Образовательным стандартом ВПО ГОБУ НИУ ВШЭ; Образовательной программой подготовки бакалавра по направлению 010400.62 «Прикладная математика и информатика»; Рабочим учебным планом подготовки бакалавра по направлению 010400.62, утвержденным в 2013 г. 3. Цели освоения дисциплины Данная дисциплина ставит своей целью изучение основных структур данных, используемых в информатике, и освоение навыков алгоритмизации задач на базе этих структур. Эти базовые знания и навыки необходимы в профессиональной деятельности специалистов по математическому моделированию и информатике. 4. Компетенции, формируемые в результате освоения дисциплины В результате изучения дисциплины студенты должны: Знать базовые абстрактные типы данных (контейнеры) и основные методы их реализации на языках программирования высокого уровня; Понимать особенности архитектуры современных компьютеров, машинных языков и языков программирования высокого уровня, существенные для эффективной реализации алгоритмов и их исполнения в вычислительных системах; Владеть основами объектно-ориентированного программирования, а также навыками оценки сложности разрабатываемых алгоритмов; Уметь разрабатывать на императивном объектно-ориентированном языке программы с использованием абстрактных типов данных и средств построения пользовательского интерфейса. 2 В результате изучения дисциплины студент осваивает и развивает следующие компетенции: Компетенция Умение работать на компьютере, навыки использования основных классов программного обеспечения, работы в компьютерных сетях Способность решать задачи производственной и технологич. деятельности на профессион. уровне, включая разработку математических моделей, алгоритмических и программных решений Способность применять в профессиональной деятельности современные языки программирования и языки баз данных, операционные системы, электронные библиотеки и пакеты программ и т.п. Формы и методы обучения, способствующие формированию и развитию компетенции Студент демонстрирует Выполнение лабораторных владение инструментальной работ и домашних заданий в средой программирования для инструментальной среде объектно-ориентированного программирования императивного языка Студент составляет программы Лекции по алгоритмам на языке высокого уровня, обработки различных реализующие алгоритмы и структур данных; домашние математические модели для задания, ориентированные на обработки различных структур программную реализацию данных изученных алгоритмов и моделей Студент демонстрирует Лекции по основным владение основными средствам объектного языка конструкциями императивного программирования, решение объектно-ориентированного задач и выполнение языка программирования при домашних заданий на реализации алгоритмов программирование обработки различных структур Код по Дескрипторы – основные ФГОС/ признаки освоения (показатели НИУ достижения результата) ИК-2 ПК-8 ПК-9 5. Место дисциплины в структуре образовательной программы Настоящая учебная дисциплина входит в базовую часть цикла дисциплин информационных технологий в учебной программе подготовки бакалавра направления 010400.62 «Прикладная математика и информатика». Изучение курса «Алгоритмы и структуры данных» требует базовых знаний по дискретной математике и линейной алгебре (в объеме бакалаврской программы первого года обучения по направлению 010400.62). Необходимо также владение основами программирования на языке высокого уровня (в объеме курса «Информатика и программирование» первого года обучения указанной бакалаврской программы). Основные положения дисциплины «Алгоритмы и структуры данных» должны быть использованы в дальнейшем при изучении следующих дисциплин программы бакалавра: Анализ и обработка данных, Теория баз данных, Машинное обучение. 3 6. Тематический план дисциплины «Алгоритмы и структуры данных» № Всего часов Аудиторные часы СамостоНазвание темы по Сем. и ятельная дисциплине Лекции практика работа занятия Первый модуль (32 часа / 16+16) Введение в объектно-ориентированное программирование. ООП с 1 использованием языка С++. Абстрактные типы данных. 12 4 2 6 Перегрузка функций и операций. 18 4 4 10 Этапы трансляции программ на С++. 3 Препроцессор. Автоматическая сборка многомодульных программ. 12 2 4 6 Наследование. Виртуальные функции, абстрактные классы. Механизм 4 динамической идентификации типа (RTTI) 18 4 4 10 10 2 2 6 18 4 4 10 20 2 4 14 32 10 8 14 2 5 Обработка ошибок в С++. Механизм исключений. Второй модуль (32 часа / 16 + 16) Работа с файловыми системами. Понятие системного вызова. 6 Низкоуровневая работа с файлами. Перенаправление ввода/вывода. Параллельные процессы. Организация работы с процессами с помощью 7 системных вызовов ОC UNIX (fork, exec, wait). Средства взаимодействия процессов. 8 Часть 1 – именованные и неименованные каналы, сигналы. Третий модуль (40 часов / 20 + 20) 4 Средства взаимодействия процессов. 9 Часть 2 – разделяемая память, очереди сообщений, семафоры 18 4 4 10 Классические задачи синхронизации процессов (обедающие философы, 10 задача о спящем парикмахере, читатели и писатели). 8 2 2 4 Средства взаимодействия процессов. Часть 3 – взаимодействие в сети, 11. организация клиент-серверного взаимодействия. 18 4 4 10 12. Обобщенное программирование на С++: шаблоны классов и функций 8 2 2 4 13. Обзор основных возможностей библиотеки STL 18 4 4 10 14. Обзор основных алгоритмов библиотеки STL 20 4 4 12 Четвертый модуль (40 часов /20 + 20) 15. Создание интерфейсов программ. Обзор библиотеки Qt. 16 4 6 6 16. Элементы управления Qt. Язык QtScript. 26 6 4 16 32 6 6 20 Профилирование программ. Анализ производительности. 20 4 4 12 Итого 324 72 72 180 17. Обзор библиотеки OpenGL. 18. 7. Формы контроля знаний студентов Курс «Алгоритмы и структуры данных» читается в 1, 2, 3 и 4 модуле. Текущий контроль – выполнение практических заданий и лабораторных работ, три контрольные работы (в первом, третьем и в четвертом модулях). Промежуточный контроль – 1 зачёт (в конце второго модуля). 5 Итоговый контроль – экзамен (60 мин.). Преподаватель оценивает работу студентов на семинарских и практических занятиях путём проведения самостоятельных работ. Оценки за работу на семинарских и практических занятиях преподаватель выставляет в рабочую ведомость. Результирующая оценка по 10-ти балльной шкале за работу на семинарских и практических занятиях определяется перед промежуточным или итоговым контролем - Оаудиторная. Преподаватель оценивает самостоятельную работу студентов: выполнение домашних заданий. Оценки за самостоятельную работу студента преподаватель выставляет в рабочую ведомость. Результирующая оценка по 10-ти балльной шкале за самостоятельную работу определяется перед промежуточным или итоговым контролем – Осам. работа. Результирующая оценка за промежуточный контроль в форме зачета выставляется по следующей формуле, где Озачет – оценка за работу непосредственно на зачете: Опромежуточный = 0,3·Озачет + 0,4·Осам. работа +0,3 Оаудиторная Результирующая оценка за итоговый контроль в форме экзамена выставляется по следующей формуле, где Оэкзамен – оценка за работу непосредственно на экзамене: Оитоговый = 0,3·Оэкзамен + 0,4·Осам. работа + 0,3·Оаудиторная На пересдаче студенту не предоставляется возможность получить дополнительный балл для компенсации оценки за текущий контроль. В диплом выставляет результирующая оценка по учебной дисциплине, которая формируется по следующей формуле: Одисциплина = 0,3·Опромежуточный + 0,7·Оитоговый 8. Содержание программы по темам Тема 1. Введение в объектно-ориентированное программирование. ООП с использованием языка С++. Абстрактные типы данных. Объектно-ориентированное программирование (ООП) как новая парадигма программирования. Основные свойства объектно-ориентированных языков: средства определения абстрактных типов данных инкапсуляция, наследование, полиморфизм. Переход от С к С++ - появление новых языковых конструкций, поддерживающих ООП. Описание абстрактных типов данных с помощью классов. Специальные функции класса: конструктор, деструктор, конструктор копирования, их определение и генерация по умолчанию. Статические и константные члены класса. Тема 2. Перегрузка функций и операций. Понятие перегруженных функций. Пространства имен. Функции с аргументами по умолчанию. Перегрузка операций с помощью функции – члена класса, с помощью внешней по отношению к классу функции. Друзья класса. Конструктор преобразования. Операция приведения типа. Тема 3. Этапы трансляции программ на С++. Препроцессор. Автоматическая сборка многомодульных программ Этапы трансляции программы на С++: препроцессирование, трансляция в ассемблер, ассемблирование компоновка. Препроцессор: директивы include, define, undef, директивы условной компиляции. Понятие объектного модуля. Раздельная трансляция модулей. Использование утилиты make для сборки программы. 6 Основная литература 1. Столяров А.В. Операционная среда ОС UNIX для изучающих программирование http://stolyarov.info/books/unixref Тема 4. Наследование. Виртуальные функции, абстрактные классы. Механизм динамической идентификации типа (RTTI) Наследование как механизм повторного использования кода и как способ моделирования иерархических отношений объектов. Наследование с квалификаторами public, private, protected. Определение и использование виртуальных функций. Полиморфные типы. Абстрактные классы. Приведение типов в стиле C++. Механизм динамической идентификации типа: typeid и dynamic_cast. Тема 5. Обработка ошибок в С++. Механизм исключений. Способы обработки ошибок в С++. Генерация исключения (throw), try-catch блоки. Алгоритм обработки исключения, выбор подходящего обработчика, свертка стека. Спецификация исключений функции: throw(список типов). Функции terminate и unexpected и их переопределение. Генерация новых типов исключений на основе класса exception стандартной библиотеки, функция what. Тема 6. Работа с файловыми системами. Понятие системного вызова. Низкоуровневая работа с файлами. Перенаправление ввода/вывода. Понятие системного вызова, интерфейс библиотечных функций и системных вызовов (работа с переменной errno, strerror, perror), системные вызовы open, close, read, write, dup, dup2, позиционирование в файле. Тема 7. Параллельные процессы. Организация работы с процессами с помощью системных вызовов ОC UNIX (fork, exec, wait). Мультипрограммный режим работы ЭВМ. Определение процесса. Разделение ресурсов. Проблемы распределения ресурсов. Порождение копии процесса (fork), замещение тела процесса (семейство вызовов exec). Синхронизация работы процессов (wait). Тема 8. Средства взаимодействия процессов. Часть 1 – именованные и неименованные каналы, сигналы. Взаимодействия процессов через неименованный канал (pipe), особенности работы системных вызовов read и write при работе с каналом. Ограничения на использование неименованного канала. Именованные каналы. Примеры взаимодействия неродственных процессов. Сигналы как средство взаимодействия. Отправка сигнала, установка реакции на сигнал. Тема 9. Средства взаимодействия процессов. Часть 2 – разделяемая память, очереди сообщений, семафоры. Семафор Дейкстры. Принципы работы с семафорами. Примеры синхронизации доступа к ресурсам с использованием семафоров. Синхронизация доступа к разделяемым ресурсам с помощью очереди сообщений. Принципы работы с разделяемыми ресурсами System V IPC, доступ по ключу, создание и удаление ресурса. Использование разделяемой памяти, массива семафоров и очереди сообщений System V IPC. Примеры программирования. Тема 10. Классические задачи синхронизации процессов (обедающие философы, задача о спящем парикмахере, читатели и писатели). 7 Задача об обедающих философах. Задача о спящем парикмахере. Задача о читателях и писателях (производителях и потребителях). Тема 11. Средства взаимодействия процессов. Часть 3 – взаимодействие в сети, организация клиент-серверного взаимодействия. Особенности сетевого взаимодействия. Использование сокетов с установлением соединения (виртуального канала). Использование сокетов без установления соединения. Организация работы сервера с помощью системного вызова select. Тема 12. Обобщенное программирование на С++: шаблоны классов и функций. Определение шаблонной функции. Настройка на конкретный тип при вызове. Алгоритм выбора перегруженной функции с учетом шаблонов. Шаблон класса. Статические функции шаблонного класса. Друзья шаблонного класса. Тема 13. Обзор основных возможностей библиотеки STL Понятие контейнера и итератора. Последовательные и ассоциативные контейнеры. Категории итераторов. Тема 14 Обзор основных алгоритмов библиотеки STL. Основные алгоритмы библиотеки. Понятия предиката и функтора. Лямбда-функции. Захват переменных. Генерация лямбда-функций. Тема 15. Создание интерфейсов программ. Обзор библиотеки Qt. Принципы создания дружественных интерфейсов. Библиотека Qt. ВИджеты, слоты и сигналы, их соединение. Иерархия объектов. Компиляция Qt-программ. Работа с метаобъектным компилятором. Тема 16. Элементы управления Qt. Язык QtScript. Основные виджеты библиотеки Qt. Классы QPushButton, QLineEdit, QTextEdit, QCheckBox, QRadioButton, QMenu, QProgressBar. Меню и диалоговые окна. Написание простейших интерфейсов. Обзор синтаксиса и возможностей языка QtScript. Тема 17. Обзор библиотеки OpenGL Класс QGLWidget. Графические примитивы. Работа с двумерной графикой в OpenGL. Понятие контекста. Тема 18. Профилирование программ. Анализ производительности. Архитектура современных микропроцессоров. Иерархия памяти, кэш память. Виртуальная память. Инструментальные средства профилирования программ. Автоматическая оптимизация с использованием результатов профилирования. 9. Образовательные технологии В преподавании данной дисциплины сочетаются: лекции в традиционной форме, на лекциях используется мультимедиа проектор, рабочике материалы в виде слайдов доступны студентам; семинарские и практические занятия, в ходе которых решаются задачи по темам курса; домашние практические задания по программированию по всем основным темам дисциплины. 8 10. Оценочные средства для текущего и итогового контроля Примеры домашних работ 1. Реализовать абстрактный тип данных и продемонстрировать работу с ним. Объектами типа данных являются: а) электрические счетчики б) почтовые адреса в) двоичные деревья поиска 2. Реализовать на языке на C++ программу вычисления значения выражения, заданного в постфиксной записи. При вычислении использовать стек, реализацию которого оформить в виде отдельного модуля. 3. Разработать иерархию классов (не менее трех), для выбранной предметной области, в базовом классе использовать поле – указатель и динамическую память. Перегрузить несколько операций для работы с объектами написанных классов. Реализовать взаимодействие объектов, используя виртуальные функции. 4. Реализовать программу – командный интерпретатор, которая запускает заданные ей программы, в том числе предусмотреть условный запуск программ, перенаправление ввода вывода, запуск программ конвейером. 5. Реализовать систему для обмена текстовыми сообщениями между программами, выполняющимися на компьютерах локальной сети (использовать сокеты с установлением соединения) Вопросы для оценки качества освоения дисциплины Тема 1. 1. Перечислите основные принципы объектно-ориентированного программирования 2. Приведите примеры конструкторов, конструкторов копирования и деструкторов. 3. В чем заключается инкапсуляция? 4. Какие функции-члены класса имеются у класса по умолчанию? 5. Сформулировать, в каких случаях вызывается конструктор копирования? 6. Сформулировать, в каких случаях вызывается деструктор для объектов класса? Тема 2. 1. Привести пример перегруженных функций. 2. Что такое конструктор преобразования? 3. Сформулировать алгоритм выбора перегруженной функции для функций с одним параметром и для функций с несколькими параметрами. 4. Привести пример операции, перегруженной с помощью метода класса. Возможно ли выполнить перегрузку написанной операции внешней по отношению к классу функцией? 5. Какие операции перегружаются только методами класса? 6. Как выполняется перегрузка операций ввода и вывода для пользовательских типов? 7. Как перегружается операция приведения типа? Приведите пример. Тема 3. 1. Как программа на С++ разбивается на модули? 2. В чем преимущество раздельной трансляции модулей? 3. И каких этапов состоит трансляция программы на С++ и что является результатом каждого из этапов? 4. Как препроцессор обрабатывает директивы include? 5. Как препроцессор обрабатывает директивы define? 6. Что такое makefile? Каким образом утилита make отслеживает зависимости межд файлами проекта? Тема 4. 9 1. Как реализуется связь классов в иерархии на языке С++? Какие еще есть отнощения между объектами классов, кроме иерархических? 2. Объясните, как происходит создание, удаление и копирование объектов производных классов? 3. Что такое виртуальные функции? Когда они вызываются? 4. Дать определение и привести пример абстрактного класса. 5. Как выполняется явное приведение типов в С++? Назовите 4 категории преобразований. 6. Что такое механизм динамической идентификации типа? Приведите пример его использования? Тема 5. 1. В чем заключается работа механизма исключений? 2. Какие действия выполняются при работе оператора throw выражние; ? 3. Описать последовательность действий, выполняемых программой, при обработке исключения. 4. Как определить новый тип исключения на основе стандартного exception? 5. Что такое свертка стека? 6. Как описать список исключений функции? В каком случае вызывается функция unexpected? 7. Как переопределить функции terminate() и unexpected()? Тема 6. 1. Что такое системный вызов? Привести примеры библиотечных функций языка С++ использующих системные вызовы в своей реализации. 2. Как определить, что в результате системного вызова произошла ошибка и идентифицировать эту ошибку? 3. Привести пример работы с файлами с помощью системных вызовов. 4. Как выполнить перенаправление стандартного вывода/вывода/потока ошибок программы в командной строке OC UNIX? Как реализовать такое перенаправление в программе? Тема 7. 1. Дать определение мультипрограммного режима работы компьютера. Сформулировать требования к архитектуре, необходимые для организации такого режима. 2. Как в одной программе запустить параллельно 2 процесса? Какие есть средства синхронизации их работы? 3. Как в пользовательской программе запустить другую программу и проанализировать успешность ее выполнения? Тема 8. 1. Сравнить средства взаимодействия процессов: именованные каналы, неименованные каналы, сигналы. 2. Привести пример использования сигналов для синхронизации работы параллельных процессов. 3. Объясните, в чем заключаются особенности выполнения операций чтения из неименованного канала и записи в него. 4. Привести пример использования именованного канала для синхронизации работы параллельных процессов. Тема 9. 1. Дать определение семафора Дейкстры. Как организовать доступ к ресурсу в режиме взаимного исключения? 2. Как использовать очередь сообщений для организации доступа к разделяемым ресурсам? 3. Сформулировать общие принципы работы с разделяемыми объектами System V IPC. 10 4. Привести пример использования несколькими процессами разделяемой памяти, доступ к которой разграничивается при помощи очереди сообщений. 5. Привести пример использования несколькими процессами разделяемой памяти, доступ к которой разграничивается при помощи массива семафоров. Тема 10. 1. Сформулировать задачу об обедающих философах. Предложить вариант решения, не приводящий к тупику. 2. Сформулировать задачу о спящем парикмахере. Предложить алгоритм решения на языке С++. 3. Сформулировать задачу о читателях и писателях (производителях и потребителях). Предложить алгоритм решения на языке С++. Тема 11. 1. Рассказать об особенностях организации взаимодействия процессов в сети ЭВМ. 2. Принципы работы с сокетами с установлением соединения (виртуального канала). 3. Использование сокетов без установления соединения. Пример программы. 4. Как организовать работу сервера на основе системного вызова select? Тема 12. 1. Что такое шаблонная функция? В какой момент она становится конкретной функцией? 2. Алгоритм выбора перегруженной функции с учетом шаблонов. 3. Привести пример определения и использования шаблона класса. 4. В чем особенности использования статических функций шаблонного класса? 5. В чем особенности использования дружественных функций шаблонного класса? Тема 13. 1. Что такое контейнер (контейнерный класс) библиотеки STL? Перечислить основные контейнеры. 2. Дать определение итератора, назвать категории итераторов. Как организовать перебор элементов контейнера с использованием различных итераторов? Тема 14. 1. Назвать основные алгоритмы библиотеки STL. 2. Дать определение предиката и функтора. 3. Как происходит генерация лямбда-функций. Привести пример Тема 15. 1. Рассказать об основных составляющих библиотеки Qt. Тема 16. 1. Перечислить основные виджеты библиотеки Qt. Привести пример их использования для создания простейшего интерфейса, содержащего меню и диалоговое окно. 2. Какие дополнительные возможности предоставляет язык QtScript? Тема 17. 1. Рассказать о графических возможностях, предоставляемых классом QGLWidget. Тема 18. 1. Привести схему базовой архитектуры процессора. 2. Привести иерархию памяти в вычислительной системе. Указать на ней место кэш памяти и рассказать об ее назначении. 3. Привести пример инструментального средства профилирования программ. Как оптимизировать программу с учетом результатов профилирования? 11 11. Учебно-методическое и информационное обеспечение дисциплины Базовые учебники 1. Страуструп Б. Язык программирования С++. Бином, 2011. 2. М. Шлее Qt 4.5 Профессиональное программирование на С++ - БХВ-Петербург, 2009, 896 стр. Основная литература 1. Кормен Т., Лейзерзон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е изд. – М.: Вильямс, 2005. 2. Корухова Ю.С. Сборник задач и упражнений по языку С++ - М.: Изд. Отдел факультета ВМК МГУ, 2009, http://al.cs.msu.su/system/files/CPP_Korukhova.pdf 3. Пол А. Объектно-ориентированное программирование на языке С++. Бином, Невский Диалект, 200 4. Страуструп Б. Язык программирования С++. Бином, 2011. 5. Таненбаум Э. Современные операционные системы. Питер, 2013. 6. Шилдт Г. Самоучитель С++. – БХВ – Петербург, 2006 Дополнительная литература 1. Кнут Д. Искусство программирования для ЭВМ. Т. 1–3. — Пер. с англ. — М.: Мир, 1976–1978. 2. Робачевский А.М. Операционная система UNIX. — СПб.: BHV—Санкт-Петербург, 1997. 3. Столяров А.В. Операционная среда ОС UNIX для изучающих программирование http://stolyarov.info/books/unixref 4. Херн Д., Бейкер М. Компьютерная графика и стандарт OpenGL, Вильямс 1168 стр. 13. Материально-техническое обеспечение дисциплины Для семинарских и практических занятий по темам дисциплины используется проектор и компьютеры с инструментальной средой программирования и выходом в сеть Интернет. Автор программы: _____________________________/ Корухова Ю.С. / 12