Программирование на языке C++. (односеместровый) 2026

Материал из Public ATP Wiki
Перейти к навигации Перейти к поиску

Программирование на C++

О курсе

Односеместровый курс (основной поток).

Параметр Значение
Формат 15 лекций + 15 семинаров (1 пара лекция + 1 пара семинар в неделю)
Стандарт языка C++17 (отдельные элементы C++20)
Среда разработки MSVC / g++ / clang++ — на выбор студента
Система сборки CMake или встроенная сборка IDE (без отдельной лекции)
Домашние работы 5 блоковых заданий (1–2 недели каждое) + итоговый проект
Использование LLM Разрешено при обязательной устной защите решения

Курс посвящён изучению современного C++ от базовых конструкций языка до продвинутых возможностей, применяемых в промышленной разработке. В ходе обучения слушатели освоят синтаксис языка, работу с памятью, указателями, функциями, контейнерами STL и обработкой ошибок, а также научатся писать безопасный и эффективный код.

Особое внимание уделяется объектно-ориентированному программированию, принципам проектирования (SOLID), шаблонам, исключениям, RAII, умным указателям, move-семантике и современным возможностям C++17/20. Отдельный блок посвящён стандартной библиотеке STL, алгоритмам, контейнерам и современному стилю разработки.

По завершении курса участники смогут разрабатывать надёжные приложения на C++, грамотно управлять ресурсами, проектировать архитектуру программ, использовать современные возможности языка и эффективно применять стандартную библиотеку для решения практических задач.

Пререквизиты

Для успешного освоения курса слушателю достаточно иметь базовые навыки программирования: понимать, что такое переменные, типы данных, условные операторы, циклы и функции. Желателен опыт написания простых программ на любом языке программирования (например, Python, Java, C#, Pascal или JavaScript), а также уверенное владение компьютером и средой разработки. Специальных знаний по C++ не требуется, так как курс начинается с основ языка.

Команда курса

  • Руководитель и лектор курса: Виденин Сергей Александрович
  • Семинаристы:
    • Виденин Сергей Александрович
    • Обжерин Евсей Романович
    • Халтурин Евгений Александрович
  • Ассистенты:
    • Пелевин Леонид Андреевич
    • Черноморцев Ярослав Сергеевич
    • Якупов Динар Элинарович
    • Шелегеда Наталья Андреевна
    • Хомченко Илья Романович

Коммуникация

Ссылка на чат курса в Tg

Прогресс студентов

Ссылка на таблицу студентов с оценками (ближе к старту семестра).

Программа курса

Неделя Темы лекций Темы семинаров Домашние задания
1 Введение в C++ и первая программа Знакомство со средой и первые программы ДЗ 1. Основы C++: текстовый обработчик данных. Срок сдачи: после 4-го семинара.
2 Объявления, выражения, управление потоком, ошибки Разбор ошибок и управляющих конструкций
3 Указатели, память, массивы Работа с указателями и динамической памятью
4 Функции, ссылки, const Функции и эффективная передача данных Сдача ДЗ 1
5 Классы и инкапсуляция Проектирование простых классов ДЗ 2. ООП: полиморфная предметная область.
6 Конструкторы, деструкторы, правило трёх Класс с управлением ресурсом (Rule of Three)
7 Наследование, интерфейсы и полиморфизм Полиморфная иерархия классов
8 SOLID, композиция, агрегация, паттерны Рефакторинг и проектирование Сдача ДЗ 2
9 Шаблоны Шаблоны на практике ДЗ 3. Шаблоны и исключения: generic-контейнер.
10 Исключения и RAII Безопасный код с исключениями Сдача ДЗ 3
11 Умные указатели Умные указатели вместо new/delete ДЗ 4. Современный C++: ресурсный менеджер.
12 Move-семантика и приведения типов Move и cast на практике
13 Вывод типов, лямбды, std::function Современный стиль C++ Сдача ДЗ 4
14 STL: контейнеры, итераторы, алгоритмы STL на практике ДЗ 5. STL: прикладная задача на контейнерах и алгоритмах.
Итоговый проект (параллельно с ДЗ 5).
15 Итоги: современный C++ и перспективы Итоговое занятие Сдача ДЗ 5. Защита итогового проекта.

Более подробную программу курса можно посмотреть здесь:

Подробная программа курса

Критерии оценивания и формы контроля успеваемости

Описание и критерии оценивания домашних заданий и итогового проекта

Название Задание Критерии оценивания Срок сдачи

Домашнее задание 1. Основы C++: текстовый обработчик данных

Цель: Закрепить базовый синтаксис, работу с vector/map/string, функциями и корректной обработкой ошибок без ООП.

  1. Реализовать консольную программу «Анализатор текстового файла».
  2. Вход: путь к файлу (аргумент командной строки или ввод с клавиатуры).
  3. Функциональность: подсчёт строк, слов, символов; частотный словарь слов (std::map<std::string, int>);топ-10 самых частых слов.
  4. Обработка ошибок: файл не найден, пустой файл — понятные сообщения, код возврата.
  5. Код без предупреждений компилятора при -Wall -Wextra.
  6. Разбить на функции; не использовать классы (только свободные функции).
  7. Краткий отчёт (½–1 стр.): какие конструкции C++ использовали и почему.
  • Корректность на тестовых файлах (включая граничные случаи).
  • Чистота кода: именование, разбиение на функции, отсутствие дублирования.
  • Отсутствие утечек и UB (проверка ASan — плюс).
  • Устная защита: объяснить выбор контейнеров и способ передачи аргументов.

После семинара 4 (конец 4-й недели)

Домашнее задание 2. ООП: полиморфная предметная область

Цель: Закрепить инкапсуляцию, правило трёх, наследование, полиморфизм и базовое проектирование (композиция предпочтительнее лишнего наследования).

  1. Выбрать предметную область: геометрические фигуры, транспорт, библиотека, игровые персонажи (на выбор, согласовать с преподавателем).
  2. Не менее 3 классов-наследников одного абстрактного базового класса.
  3. Один класс с правилом трёх (ресурс внутри: строка, буфер, файл).
  4. Полиморфная коллекция через std::vector<std::unique_ptr<Base>>.
  5. Применить минимум 2 паттерна (Strategy, Factory Method или аналог).
  6. UML-диаграмма классов (1 страница).
  7. Набор ручных тестов / демо-сценарий в main.
  8. Краткая защита (5 мин): почему выбрано наследование или композиция в каждом месте.
  • Корректность полиморфизма (virtual destructor, override).
  • Отсутствие slicing и утечек при копировании/присваивании.
  • Качество проектирования: SRP, разумное использование наследования.
  • Читаемость, UML, устная защита.

После семинара 8 (конец 8-й недели)

Домашнее задание 3. Шаблоны и исключения: generic-контейнер

Цель: Закрепить шаблоны классов, RAII, обработку ошибок и exception-safety.

  1. Реализовать шаблонный класс Stack<T> (или Queue<T>) «с нуля» на массиве с динамическим ростом (unique_ptr<T[]> или vector внутри).
  2. Методы: push, pop, top, empty, size; strong или basic exception guarantee.
  3. При ошибке (переполнение лимита, pop из пустого) — исключение std::logic_error.
  4. Специализация или отдельная перегрузка для T = std::string (опционально).
  5. Юнит-тесты: пустой стек, копирование, исключение при pop, RAII при throw.
  6. Отчёт: какие гарантии exception-safety обеспечены и как.
  • Корректность шаблона для разных T (int, string, свой класс).
  • Отсутствие утечек при исключениях.
  • Чистота интерфейса и документирование гарантий.
  • Устная защита: RAII, throw/catch, правило пяти/нуля.

После семинара 10 (конец 10-й недели)

Домашнее задание 4. Современный C++: ресурсный менеджер

Цель: Закрепить умные указатели, move-семантику, правило пяти/нуля и современный стиль.

  1. Доработать класс из ДЗ 2 (или String/Vector) до rule of five с move.
  2. Все raw new/delete заменить на unique_ptr или контейнеры STL.
  3. Один участок кода с shared_ptr + weak_ptr (обосновать выбор).
  4. Использование лямбд и алгоритмов STL (<algorithm>) вместо ручных циклов.
  5. Минимум 3 осмысленных применения auto/structured bindings.
  6. Код с noexcept на move-операциях где уместно.
  7. Защита: показать на Godbolt или объяснить разницу copy/move.
  • Корректность rule of five; отсутствие утечек и double-free.
  • Уместность unique vs shared vs weak.
  • Использование move, emplace, лямбд.
  • Устная защита с вопросами по cast и value categories.

После семинара 13 (конец 13-й недели)

Домашнее задание 5. STL: прикладная задача на контейнерах и алгоритмах

Цель: Закрепить выбор контейнеров, итераторы, алгоритмы STL и современный стиль.

  1. Реализовать одну из задач (на выбор):
  • Книжный каталог: добавление, поиск по ISBN/автору, сортировка по году (map/unordered_map + vector);
  • Анализ лог-файла: парсинг строк, подсчёт статистики по IP/кодам ответа (unordered_map);
  • Топ-K частых слов в большом тексте (unordered_map + priority_queue).
  1. Обязательно: минимум 3 разных контейнера STL и 5 алгоритмов из <algorithm>.
  2. Без ручных циклов там, где есть алгоритм STL (обосновать исключения).
  3. Обработка ошибок ввода; чтение из файла.
  4. Краткий отчёт: таблица «контейнер — операция — асимптотика».
  • Корректность и эффективность выбора контейнеров.
  • Использование итераторов и алгоритмов.
  • Качество кода и отчёт.
  • Устная защита: почему map, а не unordered_map (и наоборот).

После семинара 14 (начало 15-й недели)

Итоговый проект

Цель: интегрировать все темы курса в законченную программу.

Формат защиты: Презентация 10 мин+ вопросы.

  1. Консольная или простая модульная утилита (калькулятор выражений, текстовый квест, менеджер задач, мини-база данных и т.п.).
  2. Не менее 5 классов; иерархия с полиморфизмом или чёткое разделение ответственности.
  3. Шаблонный код (хотя бы один шаблон класса или функции).
  4. Умные указатели; rule of five/zero; move-семантика.
  5. STL-контейнеры и алгоритмы; обработка исключений; RAII.
  6. Лямбды или std::function.
  7. CMakeLists.txt или проект IDE; README с инструкцией сборки.
  8. Если использовался LLM — приложение с промптами и комментарием, что сделано вручную.
  • Полнота и работоспособность (40%).
  • Архитектура и качество кода (30%).
  • Использование тем курса (20%).
  • Защита и README (10%).

Конец семестра


Итоговая оценка по курсу формируется суммой баллов из следующих компонентов:

  • Домашние задания: максимум 5 баллов (5 заданий по 1 баллу).
  • Устный зачет: до 3 баллов.
  • Командный проект: до 2 баллов.

Ни один из компонентов не является обязательным. Вы можете набрать необходимое число баллов любым удобным способом. Набранные баллы напрямую переводятся в итоговую оценку по дисциплине.

Материалы курса

Список вопросов к экзамену можно посмотреть здесь.


Рекомендуемая литература

Основы и синтаксис (с нуля)

  1. Бьерн Страуструп — «Программирование. Принципы и практика использования C++»
    Один из лучших вводных курсов от создателя языка. Много примеров, объясняет не только «как», но и «почему».
  2. Стенли Липпман, Жози Лажойе, Барбара Му — «Язык программирования C++. Базовый курс» (5-е издание)
    Системное введение в язык и STL, с акцентом на правильные привычки и современные возможности C++.
  3. Герберт Шилдт — «C++: базовый курс» (3-е издание)
    Более «школьный» формат: много задач, пошаговое объяснение синтаксиса.

Для тех, кто уже знает синтаксис

  1. Скотт Мейерс — «Эффективное использование C++» и «Наиболее эффективное использование C++»
    Классика: более 55 советов по стилю, управлению ресурсами, RAII, const и правильному использованию STL.
  2. Герб Саттер — «Новые сложные задачи на C++» и «Решение сложных задач на C++»
    Примеры нетривиальных ситуаций, показывают, как думать о коде, а не только о синтаксисе.
  3. Николай Джосаттис — «C++. Стандартная библиотека»
    Подробный справочник по STL: контейнеры, алгоритмы, итераторы, с примерами и замечаниями по эффективности.

Современный C++17/20 и продвинутые темы

  1. Бьерн Страуструп — «A Tour of C++» (2-е и 3-е издания)
    Обзор современного C++ для опытных программистов: кратко, но полно о возможностях C++11/14/17/20, идеях дизайна и типичных паттернах.
  2. Андрей Александреску, Герб Саттер — «C++ Coding Standards: 101 Rules, Guidelines, and Best Practices»
    Стандарты кода, именование, безопасность, производительность, использование шаблонов и STL.
  3. Николай Джосаттис — «C++20. The Complete Guide»
    Обзор новых возможностей C++20: modules, coroutines, ranges, константные вычисления и улучшения шаблонов.