Федеральное государственное бюджетное образовательное
учреждение высшего образования 
Московский государственный университет имени М.В. Ломоносова
Факультет вычислительной математики и кибернетики

УТВЕРЖДАЮ
декан факультета вычислительной математики и кибернетики
______________/И.А. Соколов /
«___» ________________20___г.

РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ
Наименование дисциплины:
Проектирование и программирование на С++
Уровень высшего образования:
бакалавриат
Направление подготовки / специальность:
01.03.02 «Прикладная математика и информатика» (3++)
Направленность (профиль):
Системное программирование и компьютерные науки
Форма обучения:
очная

Москва 2023
Рабочая программа дисциплины (модуля) разработана в соответствии с самостоятельно установленным МГУ образовательным стандартом (ОС МГУ) для реализуемых основных профессиональных образовательных программ высшего образования по направлению подготовки 01.03.02, 01.04.02 "Прикладная математика и информатика" программы бакалавриата  Утвержден приказом МГУ от 30 августа 2019 года № 1041 (в редакции приказов МГУ от 11 сентября 2019 года № 1109, от 10 июня 2021 года № 609, от 7 октября 2021 года № 1048, от 21 декабря 2021 года № 1404, от 2 ноября 2022 года № 1299)

1. Дисциплина относится к базовой части ОПОП ВО.

2. Входные требования для освоения дисциплины (модуля): учащиеся должны владеть знаниями по алгоритмам и алгоритмическим языкам, системам программирования и операционным системам в объеме, соответствующем программе первого и второго годам обучения основных образовательных программ бакалавриата по укрупненным группам направлений и специальностей 01.00.00 «Математика и механика», 02.00.00 «Компьютерные и информационные науки».

3. Результаты обучения по дисциплине (модулю), соотнесенные с требуемыми компетенциями выпускников.

Компетенции выпускников, частично формируемые при реализации дисциплины (модуля):

•	ОПК-1.Б Знание основных принципов и подходов к разработке больших комплексов программ; 
•	ОПК-2.Б Способность расширять функциональность больших комплексов программ для решения различных прикладных математических задач, в том числе различных задач автоматизации проектирования СБИС, разрабатывая новые модули и интегрируя их в уже существующий комплекс программ

Планируемые результаты обучения по дисциплине (модулю):

Знать:
1.	основные принципы разработки больших программных комплексов

Уметь:  
1.	расширять функциональность больших комплексов программ для решения различных прикладных задач

Владеть:  
1.		навыками разработки и внедрения новых модулей в существующие комплексы программ

4. Формат обучения: лекции проводятся с использованием меловой доски и проектора. В процессе обучения используются выложенные в сеть Интернет задачи с тестами для автоматической проверки.

5. Объем дисциплины (модуля) составляет 3 з.е., в том числе 36 академических часа, отведенных на контактную работу обучающихся с преподавателем, 72 академических часов на самостоятельную работу обучающихся. 

6. Содержание дисциплины (модуля), структурированное по темам (разделам) с указанием отведенного на них количества академических часов и виды учебных занятий.

Наименование и краткое содержание разделов и тем дисциплины (модуля),

Форма промежуточной аттестации по дисциплине (модулю)	Всего
(часы)	В том числе	
		Контактная работа 
(работа во взаимодействии с преподавателем)
Виды контактной работы, часы	Самостоятельная работа обучающегося, часы 	
		Занятия лекционного типа*	Занятия семинарского типа*	Всего		
1.	Особенности стандарта C++ 11
2.	Вывод типов шаблонов, вывод типа auto, использование decltype.
3.	Range-based циклы, инициализация с фигурными скобками.
4.	Ключевые слова override, final, удаленные функции.
5.	Перечисления с областью видимости, псевдонимы, constexpr-значения и constexpr-функции.
6.	Лямбда-выражения. Связыватели std::bind, использование std::function, std::apply	12	6	-	6	6	
1.	Семантика перемещения. Типы ссылок. std::move. Оператор перемещения и перемещающий конструктор. Универсальные ссылки.
2.	Прямая передача. Свертывание ссылок. Проблемы перегрузки универсальных ссылок.
3.	Return value optimization. Автоматическая генерация компилятором перемещающих и копирующих операций.	12	6	-	6	6	
1.	Интеллектуальные указатели.
2.	Динамическое выделение памяти. Размещающие операторы new и delete. Аллокаторы. Недостатки сырых указателей.
3.	Указатель std::unique_ptr и исключительное владение.
4.	Указатель std::shared_ptr и совместное владение. Указатель  std::weak_ptr.
5.	Особенности использования make-функций. Пользовательские удалители.	16	8	-	8	8	
1.	Паттерны и идиомы в проектировании.
2.	Идиомы CRTP и PImpl. 
3.	Паттерны проектирования Bridge, Command, Strategy.
4.	Паттерн проектирования Singleton, Decorator, Observer.
5.	Паттерн проектирования Visitor. Создание объектов с помощью фабрик. Идиома Type Erasure.	12	6	-	6	6	
1.	Метапрограммирование
2.	Правило SFINAE. 
3.	Диспетчеризация дескрипторов. Способы решения проблем перегрузки с универсальными ссылками. 
4.	Вычисления на этапе компиляции при помощи шаблонов.  Подход X-macro.	8	4	-	4	4	
1.	Обработка ошибок
2.	Возврат ошибки, опциональное значение.
3.	Обработка исключений, захват исключений в std::exception_ptr, подход ValueOrError. Asserts времени компиляции и времени выполнения	4	2	-	2	2	
1.	Оптимизация программ на C++. Оптимизация алгоритмов, динамической памяти, строк, функций. Идиома COW. Закон Амдала.	8	4	-	4	4	
Аттестация: экзамен	36				36	
Итого:	108	36	-	36	72	

7. Фонд оценочных средств (ФОС) для оценивания результатов обучения по дисциплине (модулю)
7.1. Типовые контрольные задания или иные материалы для проведения текущего контроля успеваемости.
1.	Требуется написать программу на C++, определив класс TExcхeption, унаследовав его от одного из стандартных исключений, определив в нем оператор << для записи в объект исключения сопровождающего текста при его генерации,  породить из него несколько классов-наследников. Требуется продемонстрировать перехват исключений этого типа. 
2.	Требуется написать шаблон для вычисления биномиального коэффициента на этапе компиляции.
3.	Используя идиому Type Erasure, требуется написать класс Any, сохраняющий объекты любого типа, и обеспечивающий к ним доступ.
4.	Требуется спроектировать и реализовать иерархию классов для генерации случайных чисел, а также фабрику для создания экземпляра класса генератора с заданными параметрами. Необходимо поддержать три типа распределения: Пуассона, Бернулли и геометрическое. Тип распределения задаётся строковым параметром type, который принимает значения из множества {poisson, bernoulli, geometric}. При создании генератора передаются также параметры распределений.
5.	Требуется написать функцию Compose, которая строит функтор-суперпозицию двух заданных функциональных объектов (принимающих на вход одну переменную).
7.2. Типовые контрольные задания или иные материалы для проведения промежуточной аттестации.
Вопросы к экзамену.
1.	Вывод типов шаблонов, вывод типа auto и их отличия. Использование decltype. Инициализация с фигурными скобками. Range-based циклы.
2.	Ключевые слова override, final, удалённые функции. 	
3.	Перечисления с областью видимости, псевдонимы, constexpr-значения и constexpr-функции.	
4.	Лямбда-выражения. Связыватели std::bind. Использование std::function и std::mem_fn.
5.	Типы ссылок. std::move. Оператор перемещения и move-конструктор. Универсальные ссылки.
6.	Прямая передача. Свертывание ссылок. Return value optimization. Проблемы перегрузки универсальных ссылок.
7.	Автоматическая генерация компилятором перемещающих и копирующих операций.
8.	Динамическое выделение памяти. Размещающие операторы new и delete. Аллокаторы.
9.	Указатель std::unique_ptr и исключительное владение.
10.	Указатель std::shared_ptr и совместное владение. Указатель std::weak_ptr.
11.	Особенности использования std::make_unique и std::make_shared. Пользовательские удалители.
12.	 Идиома CRTP.
13.	Идиома PImpl. Особенности использования std::unique_ptr в основном интерфейсе. Паттерн проектирования Bridge.
14.	 Паттерны проектирования Command и Strategy.
15.	 Паттерн проектирования Singleton.
16.	 Паттерн проектирования Decorator.
17.	 Паттерн проектирования Observer.
18.	 Паттерн проектирования Visitor.
19.	Создание объектов с помощью фабрик. 
20.	Идиома Type Erasure.
21.	Правило SFINAE. Применение std::integral_constant. std::enable_if, std::is_base_of.
22.	Диспетчеризация дескрипторов. Способы решения проблем перегрузки с универсальными ссылками.
23.	Вычисления на этапе компиляции при помощи шаблонов.
24.	Подход X-macro.
25.	Возврат ошибки, опциональное значение. 
26.	Обработка исключений, захват исключений в std::exception_ptr, подход ValueOrError.
27.	Asserts времени компиляции и времени выполнения.
28.	 Оптимизация программ на C++. Оптимизация строк, идиома COW.
29.	Примеры оптимизации алгоритмов, структур данных, и размещения в динамической памяти.
30.	Примеры оптимизации функций. Закон Амдала.

Типовые задачи для экзамена.

1. Требуется описать, какие проблемы могут возникнуть при перегрузке для универсальных ссылок.
2. Требуется описать общую идею и схему использования паттерна Visitor.
3. Функция Do определена следующим образом:

    template <class T>
    void Do(const std::shared_ptr<T>& a, const std::shared_ptr<T>& b);

Требуется описать проблемы, связанные с таким вызовом:

    Do(new T(1), new T(3));

Требуется переписать этот вызов так, чтобы устранить проблемы.
	4. Рассматривается следующий код:
    class A {
      public:
        A() { /*...*/ }
        A(const A&) { /*...*/ }
        A(A&&) { /*...*/ }
    };
Клиентский код устроен следующим образом:
\begin{minted}{cpp}
    void Get(size_t, A&) { /*...*/ }
    int main() {
        std::vector<A> v;
        A a;
        for (size_t i = 0; i < 100; ++i) {
            Get(i, a);
            v.push_back(a);
        }
    }

При выполнении такого кода конструктор перемещения никогда не будет вызван в main, но будет вызван некоторое количество раз конструктор копирования.
Требуется изменить код класса, чтобы избавиться от вызовов конструктора копирования без изменения клиентского кода. Также требуется указать каким образом можно изменить клиентский код, чтобы избавиться от вызовов конструктора копирования без изменения кода класса.  	

Письменная экзаменационная работа может состоять из 15 заданий на выполнение которых выделяется 90 минут. Максимальное число баллов может составить 30. Итоговая сумма, не меньшая 24, соответствует оценке «отлично», от 18 до 23 – оценке «хорошо», от 12 до 18 – оценке «удовлетворительно», меньшая 12 – оценке «неудовлетворительно». Практическое контрольное задание для промежуточной аттестации выполняется учащемся самостоятельно во время обучения и может принести дополнительные баллы учащемуся.

8. Ресурсное обеспечение:

Основная литература:
  
1.	С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г. – 304 c.
2.	Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
3.	К. Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности, изд. Вильямс, М.: 2017 г. – 400 c. 
4.	Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования. Паттерны проектирования. Изд. Питер, 2016 г.– 366 c. 

Дополнительная литература:

1.	Anthony Williams. C++ Concurrency in Action: Practical Multithreading. Manning publ, 2012 – 506 p.
2.	Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация. Изд. Вильямс, 2008 г. — 224 с. 
3.	Б. Страуструп, Язык программирования С++. Изд. Бином, 2016 г. – 1136 с.
4.	D. Abrahams, A. Gurtovoy C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond. Addison-Wesley, 2004 – 400 p.
5.	А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2015 г. – 336 c. 

Информационные справочные системы:
1.	http://www.cplusplus.com
2.	http://stackoverflow.com 

Материально-техническое обеспечение: 	аудитория с партами и меловой доской, оборудованная проектором.

9. Язык преподавания:	русский.

10. Преподаватели:  	Доцент факультета ВМК МГУ к.ф.- м.н., Коноводов Владимир Александрович 

11. Авторы программы:  	Доцент факультета ВМК МГУ к.ф.- м.н., Коноводов Владимир Александрович