• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

Бакалаврская программа «Экономика и анализ данных»

Программирование на C++ (углубленный курс)

2026/2027
Учебный год
RUS
Обучение ведется на русском языке
4
Кредиты
Статус:
Курс по выбору
Когда читается:
1-й курс, 1, 2 модуль

Преподаватели

Программа дисциплины

Аннотация

Курс продолжает базовое программирование и посвящён тому, как C++ устроен внутри и как на нём пишут промышленный код. Мы разбираем полный путь программы от исходника до исполняемого файла (единицы трансляции, ODR, линковка, сборка через CMake), модель памяти и время жизни объектов, объектную модель (таблицы виртуальных функций, RTTI, множественное наследование), управление ресурсами через RAII и move-семантику, шаблоны — от базовых до concepts C++20, контейнеры и алгоритмы стандартной библиотеки, аллокаторы и влияние расположения данных в памяти на скорость, а также проектирование обработки ошибок и интерфейсов. Практика построена вокруг одного сквозного индивидуального проекта: студент пишет консольный поисковый движок, который читает документы из нескольких форматов баз данных, токенизирует их и ранжирует результаты по запросу, а на продвинутом уровне строит и использует векторный индекс на библиотеке FAISS. Каждая лекция даёт инструмент, который на ближайших занятиях сразу уходит в проект. Дополнительно в течение семестра проводятся четыре контеста в тестирующей системе (быстрая проверка понимания языка) и четыре контрольных домашних задания расчётно-исследовательского типа, где нужно не просто написать код, а измерить и объяснить его поведение.
Цель освоения дисциплины

Цель освоения дисциплины

  • Понимать модель трансляции и сборки C++-программы: единицы трансляции, ODR, статическая и динамическая линковка; уметь собирать многофайловый проект средствами CMake и подключать сторонние зависимости.
  • Знать модель памяти C++: storage duration, linkage, время жизни объектов, выравнивание и padding; уметь объяснить разницу между стеком и кучей на уровне машинного представления
  • Уметь пользоваться инструментами отладки и динамического анализа: gdb, valgrind, ASan/UBSan.
  • Уметь проектировать классы с явно сформулированным инвариантом; знать устройство таблицы виртуальных функций и цену динамического полиморфизма.
  • Знать правила разрешения перегрузки (overload resolution, ADL) и уметь корректно перегружать операторы, включая оператор <=> (C++20).
  • Владеть идиомой RAII и move-семантикой: rule of zero/three/five, std::move, RVO и copy elision; уметь обоснованно выбирать между unique_ptr, shared_ptr и weak_ptr.
  • Уметь писать шаблонный код: специализации, нетиповые параметры, variadic templates, perfect forwarding; уметь ограничивать шаблоны через SFINAE и через concepts (C++20).
  • Знать устройство и асимптотику ассоциативных контейнеров, уметь обоснованно выбирать контейнер под задачу; уметь применять алгоритмы стандартной библиотеки и ranges C++20.
  • Понимать работу аллокаторов и влияние расположения данных в памяти (cache locality, SoA vs AoS) на производительность; уметь ставить замеры и интерпретировать их результаты.
  • Уметь проектировать обработку ошибок и контракты интерфейсов: коды возврата vs исключения, noexcept, assert, std::expected.
Планируемые результаты обучения

Планируемые результаты обучения

  • Студент самостоятельно организует C++-проект с нуля: структура репозитория, сборка на CMake, разделение на библиотеку и исполняемый файл, подключение сторонних зависимостей (FetchContent / find_package).
  • Читает и понимает современный C++-код (C++17/20), включая шаблонный, и умеет объяснить, что происходит на уровне памяти и вызовов.
  • Диагностирует утечки, неопределённое поведение и падения с помощью gdb, valgrind и санитайзеров, умеет работать с core dump.
  • Пишет классы, безопасные по владению ресурсами: без утечек, двойных освобождений и висячих ссылок.
  • Обоснованно выбирает структуру данных и контейнер под задачу, аргументируя выбор асимптотикой и характером доступа к памяти.
  • Умеет измерять производительность, сравнивать альтернативные реализации и делать выводы по замерам, а не по интуиции.
  • Доводит до конца индивидуальный проект среднего размера и защищает принятые в нём технические решения
Содержание учебной дисциплины

Содержание учебной дисциплины

  • Компиляция и сборка C++
  • Модель памяти C++
  • Структуры и классы
  • ООП, часть 1: наследование и виртуальные функции
  • ООП, часть 2: полиморфизм, RTTI, множественное наследование
  • Перегрузка функций и операторов
  • RAII, move-семантика, rule of five, умные указатели
  • Шаблоны, часть 1
  • Шаблоны, часть 2: от функторов до concepts
  • Ассоциативные контейнеры и хранение альтернативных типов
  • Библиотека алгоритмов и STL
  • Аллокаторы и хранение данных
Элементы контроля

Элементы контроля

  • неблокирующий Контесты 1–4
    Четыре контеста в тестирующей системе, выдаются после лекций № 1, 3, 5 и 8. Каждый контест содержит 5 задач по материалу предыдущих лекций и семинаров (сборка и ODR, классы и инварианты, виртуальные функции и полиморфизм, шаблоны). Проверка автоматическая по скрытым тестам, окружение — Linux, gcc/clang, стандарт C++20. Срок сдачи — 10 дней с момента выдачи Бонусы: в каждом контесте доступна одна дополнительная задача повышенной сложности (+2 балла). Бонусные баллы могут быть добавлены к любому контесту или КДЗ, выполненному не на максимальный балл; оценка за отдельную форму контроля при этом не может превышать 10 баллов.
  • неблокирующий Контрольные домашние задания 1-4
    Четыре контрольных домашних задания расчётно-исследовательского типа, выдаются после лекций № 2, 4, 7 и 9. КДЗ 1 — замер stack vs heap и эффект выравнивания на размер структур; КДЗ 2 — иерархия «читателей файлов» на виртуальных функциях; КДЗ 3 — бенчмарк copy vs move для контейнера документов; КДЗ 4 — логгер с perfect forwarding. Сдаётся код плюс краткий отчёт (методика замера, результаты, объяснение). КДЗ 2 и КДЗ 4 являются частями проекта и переиспользуются в нём. Срок сдачи — 2 недели.
  • блокирующий Проект
    Сквозной индивидуальный проект: консольный поисковый движок. Уровень 8/10 — CLI-приложение: чтение БД (SQL/Excel/Document), поиск по запросу, ранжирование, консольный вывод результата. Уровень 10/10 — то же плюс построение и использование FAISS-индекса, два режима работы: построение индекса из документа и поиск по готовому индексу. Промежуточная веха (уровень 8/10) сдаётся после лекции № 11, финальная версия — после лекции № 12. Защита проекта (блокирующая) Проводится на последнем занятии (после лекции № 14) в устной форме, очно или на платформе Zoom. Студент демонстрирует работающую программу, проводит короткое код-ревью своих ключевых решений и отвечает на вопросы по любому месту собственного кода и по материалу курса, который в этом коде задействован. Пользоваться собственным кодом и документацией разрешается, помощь третьих лиц запрещена.
Промежуточная аттестация

Промежуточная аттестация

  • 2026/2027 2nd module
    0.2 * Контесты 1–4 + 0.25 * Контрольные домашние задания 1-4 + 0.55 * Проект
Список литературы

Список литературы

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

  • Scott Meyers. (2014). Effective Modern C++ : 42 Specific Ways to Improve Your Use of C++11 and C++14. O’Reilly Media.

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

  • Die C++ - Programmiersprache : Deutsche Ausgabe der Special Edition, Stroustrup, B., 2000

Авторы

  • Эрлих Иван Генрихович