Программирование на языке C++. (односеместровый) 2026: различия между версиями
| Строка 156: | Строка 156: | ||
'''Домашние задания. Критерии оценивания''' | '''Домашние задания. Критерии оценивания''' | ||
== Домашние задания == | |||
{| class="wikitable" | |||
! Название | |||
! Задание | |||
! Критерии оценивания | |||
! Срок сдачи | |||
|- | |||
| | |||
'''Домашнее задание 1. Основы C++: текстовый обработчик данных''' | '''Домашнее задание 1. Основы C++: текстовый обработчик данных''' | ||
'''Цель:''' Закрепить базовый синтаксис, работу с vector/map/string, функциями и корректной обработкой ошибок без ООП. | '''Цель:''' Закрепить базовый синтаксис, работу с vector/map/string, функциями и корректной обработкой ошибок без ООП. | ||
| | |||
# Реализовать консольную программу «Анализатор текстового файла». | |||
# Вход: путь к файлу (аргумент командной строки или ввод с клавиатуры). | |||
# Функциональность: | |||
## подсчёт строк, слов, символов; | |||
## частотный словарь слов (std::map<std::string, int>); | |||
## топ-10 самых частых слов. | |||
# Обработка ошибок: файл не найден, пустой файл — понятные сообщения, код возврата. | |||
# Код без предупреждений компилятора при -Wall -Wextra. | |||
# Разбить на функции; не использовать классы (только свободные функции). | |||
# Краткий отчёт (½–1 стр.): какие конструкции C++ использовали и почему. | |||
| | |||
* Корректность на тестовых файлах (включая граничные случаи). | * Корректность на тестовых файлах (включая граничные случаи). | ||
* Чистота кода: именование, разбиение на функции, отсутствие дублирования. | * Чистота кода: именование, разбиение на функции, отсутствие дублирования. | ||
* Отсутствие утечек и UB (проверка ASan — плюс). | * Отсутствие утечек и UB (проверка ASan — плюс). | ||
* Устная защита: объяснить выбор контейнеров и способ передачи аргументов. | * Устная защита: объяснить выбор контейнеров и способ передачи аргументов. | ||
| | |||
После семинара 4 (конец 4-й недели) | |||
|- | |||
| | |||
'''Домашнее задание 2. ООП: полиморфная предметная область''' | '''Домашнее задание 2. ООП: полиморфная предметная область''' | ||
'''Цель:''' Закрепить инкапсуляцию, правило трёх, наследование, полиморфизм и базовое проектирование (композиция предпочтительнее лишнего наследования). | '''Цель:''' Закрепить инкапсуляцию, правило трёх, наследование, полиморфизм и базовое проектирование (композиция предпочтительнее лишнего наследования). | ||
| | |||
# Выбрать предметную область: геометрические фигуры, транспорт, библиотека, игровые персонажи (на выбор, согласовать с преподавателем). | |||
# Не менее 3 классов-наследников одного абстрактного базового класса. | |||
# Один класс с правилом трёх (ресурс внутри: строка, буфер, файл). | |||
# Полиморфная коллекция через std::vector<std::unique_ptr<Base>>. | |||
# Применить минимум 2 паттерна (Strategy, Factory Method или аналог). | |||
# UML-диаграмма классов (1 страница). | |||
# Набор ручных тестов / демо-сценарий в main. | |||
# Краткая защита (5 мин): почему выбрано наследование или композиция в каждом месте. | |||
| | |||
* Корректность полиморфизма (virtual destructor, override). | |||
* Отсутствие slicing и утечек при копировании/присваивании. | |||
* Качество проектирования: SRP, разумное использование наследования. | |||
* Читаемость, UML, устная защита. | |||
| | |||
После семинара 8 (конец 8-й недели) | |||
|- | |||
| | |||
*Корректность полиморфизма (virtual destructor, override). | |||
*Отсутствие slicing и утечек при копировании/присваивании. | |||
*Качество проектирования: SRP, разумное использование наследования. | |||
*Читаемость, UML, устная защита. | |||
'''Домашнее задание 3. Шаблоны и исключения: generic-контейнер''' | '''Домашнее задание 3. Шаблоны и исключения: generic-контейнер''' | ||
'''Цель:''' Закрепить шаблоны классов, RAII, обработку ошибок и exception-safety. | '''Цель:''' Закрепить шаблоны классов, RAII, обработку ошибок и exception-safety. | ||
| | |||
# Реализовать шаблонный класс Stack<T> (или Queue<T>) «с нуля» на массиве с динамическим ростом (unique_ptr<T[]> или vector внутри). | |||
# Методы: push, pop, top, empty, size; strong или basic exception guarantee. | |||
# При ошибке (переполнение лимита, pop из пустого) — исключение std::logic_error. | |||
# Специализация или отдельная перегрузка для T = std::string (опционально). | |||
# Юнит-тесты: пустой стек, копирование, исключение при pop, RAII при throw. | |||
# Отчёт: какие гарантии exception-safety обеспечены и как. | |||
| | |||
* Корректность шаблона для разных T (int, string, свой класс). | |||
* Отсутствие утечек при исключениях. | |||
* Чистота интерфейса и документирование гарантий. | |||
* Устная защита: RAII, throw/catch, правило пяти/нуля. | |||
| | |||
После семинара 10 (конец 10-й недели) | |||
|- | |||
| | |||
'''Домашнее задание 4. Современный C++: ресурсный менеджер''' | |||
''' | '''Цель:''' Закрепить умные указатели, move-семантику, правило пяти/нуля и современный стиль. | ||
| | |||
# Доработать класс из ДЗ 2 (или String/Vector) до rule of five с move. | |||
# Все raw new/delete заменить на unique_ptr или контейнеры STL. | |||
# Один участок кода с shared_ptr + weak_ptr (обосновать выбор). | |||
# Использование лямбд и алгоритмов STL (<algorithm>) вместо ручных циклов. | |||
# Минимум 3 осмысленных применения auto/structured bindings. | |||
# Код с noexcept на move-операциях где уместно. | |||
# Защита: показать на Godbolt или объяснить разницу copy/move. | |||
| | |||
* Корректность rule of five; отсутствие утечек и double-free. | |||
* Уместность unique vs shared vs weak. | |||
* Использование move, emplace, лямбд. | |||
* Устная защита с вопросами по cast и value categories. | |||
''' | | | ||
После семинара 13 (конец 13-й недели) | |||
|- | |||
| | |||
'''Домашнее задание 5. STL: прикладная задача на контейнерах и алгоритмах''' | |||
'''Цель:''' Закрепить выбор контейнеров, итераторы, алгоритмы STL и современный стиль. | |||
* | | | ||
* | # Реализовать одну из задач (на выбор): | ||
*Устная защита: | ## Книжный каталог: добавление, поиск по ISBN/автору, сортировка по году (map/unordered_map + vector); | ||
## Анализ лог-файла: парсинг строк, подсчёт статистики по IP/кодам ответа (unordered_map); | |||
## Топ-K частых слов в большом тексте (unordered_map + priority_queue). | |||
# Обязательно: минимум 3 разных контейнера STL и 5 алгоритмов из <algorithm>. | |||
# Без ручных циклов там, где есть алгоритм STL (обосновать исключения). | |||
# Обработка ошибок ввода; чтение из файла. | |||
# Краткий отчёт: таблица «контейнер — операция — асимптотика». | |||
| | |||
* Корректность и эффективность выбора контейнеров. | |||
* Использование итераторов и алгоритмов. | |||
* Качество кода и отчёт. | |||
* Устная защита: почему map, а не unordered_map (и наоборот). | |||
| | |||
После семинара 14 (начало 15-й недели) | |||
|} | |||
Версия от 12:00, 16 июля 2026
Программирование на 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++ не требуется, так как курс начинается с основ языка.
Команда курса
- Руководитель и лектор курса: Виденин Сергей Александрович
- Семинаристы:
- Виденин Сергей Александрович
- Обжерин Евсей Романович
- Халтурин Евгений Александрович
- Ассистенты:
- Пелевин Леонид Андреевич
- Черноморцев Ярослав Сергеевич
- Якупов Динар Элинарович
- Шелегеда Наталья Андреевна
- Хомченко Илья Романович
Программа курса
| Неделя | Темы лекций | Темы семинаров | Домашние задания |
|---|---|---|---|
| 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, функциями и корректной обработкой ошибок без ООП. |
|
|
После семинара 4 (конец 4-й недели) |
|
Домашнее задание 2. ООП: полиморфная предметная область Цель: Закрепить инкапсуляцию, правило трёх, наследование, полиморфизм и базовое проектирование (композиция предпочтительнее лишнего наследования). |
|
|
После семинара 8 (конец 8-й недели) |
|
Домашнее задание 3. Шаблоны и исключения: generic-контейнер Цель: Закрепить шаблоны классов, RAII, обработку ошибок и exception-safety. |
|
|
После семинара 10 (конец 10-й недели) |
|
Домашнее задание 4. Современный C++: ресурсный менеджер Цель: Закрепить умные указатели, move-семантику, правило пяти/нуля и современный стиль. |
|
|
После семинара 13 (конец 13-й недели) |
|
Домашнее задание 5. STL: прикладная задача на контейнерах и алгоритмах Цель: Закрепить выбор контейнеров, итераторы, алгоритмы STL и современный стиль. |
|
|
После семинара 14 (начало 15-й недели) |
Итоговый проект
Срок сдачи: конец семестра
Формат защиты: Презентация 10 мин+ вопросы.
Цель: интегрировать все темы курса в законченную программу.
Требования:
• Консольная или простая модульная утилита (калькулятор выражений, текстовый квест, менеджер задач, мини-база данных и т.п.).
• Не менее 5 классов; иерархия с полиморфизмом или чёткое разделение ответственности.
• Шаблонный код (хотя бы один шаблон класса или функции).
• Умные указатели; rule of five/zero; move-семантика.
• STL-контейнеры и алгоритмы; обработка исключений; RAII.
• Лямбды или std::function.
• CMakeLists.txt или проект IDE; README с инструкцией сборки.
• Если использовался LLM — приложение с промптами и комментарием, что сделано вручную.
Критерии оценивания итогового проекта:
- Полнота и работоспособность (40%).
- Архитектура и качество кода (30%).
- Использование тем курса (20%).
- Защита и README (10%).
Итоговая оценка по курсу формируется суммой баллов из следующих компонентов:
- Домашние задания: максимум 5 баллов (5 заданий по 1 баллу).
- Устный зачет: до 3 баллов.
- Командный проект: до 2 баллов.
Ни один из компонентов не является обязательным. Вы можете набрать необходимое число баллов любым удобным способом. Набранные баллы напрямую переводятся в итоговую оценку по дисциплине.
Материалы курса
Рекомендуемая литература
Основы и синтаксис (с нуля)
- Бьерн Страуструп — «Программирование. Принципы и практика использования C++»
- Один из лучших вводных курсов от создателя языка. Много примеров, объясняет не только «как», но и «почему».
- Стенли Липпман, Жози Лажойе, Барбара Му — «Язык программирования C++. Базовый курс» (5-е издание)
- Системное введение в язык и STL, с акцентом на правильные привычки и современные возможности C++.
- Герберт Шилдт — «C++: базовый курс» (3-е издание)
- Более «школьный» формат: много задач, пошаговое объяснение синтаксиса.
Для тех, кто уже знает синтаксис
- Скотт Мейерс — «Эффективное использование C++» и «Наиболее эффективное использование C++»
- Классика: более 55 советов по стилю, управлению ресурсами, RAII, const и правильному использованию STL.
- Герб Саттер — «Новые сложные задачи на C++» и «Решение сложных задач на C++»
- Примеры нетривиальных ситуаций, показывают, как думать о коде, а не только о синтаксисе.
- Николай Джосаттис — «C++. Стандартная библиотека»
- Подробный справочник по STL: контейнеры, алгоритмы, итераторы, с примерами и замечаниями по эффективности.
Современный C++17/20 и продвинутые темы
- Бьерн Страуструп — «A Tour of C++» (2-е и 3-е издания)
- Обзор современного C++ для опытных программистов: кратко, но полно о возможностях C++11/14/17/20, идеях дизайна и типичных паттернах.
- Андрей Александреску, Герб Саттер — «C++ Coding Standards: 101 Rules, Guidelines, and Best Practices»
- Стандарты кода, именование, безопасность, производительность, использование шаблонов и STL.
- Николай Джосаттис — «C++20. The Complete Guide»
- Обзор новых возможностей C++20: modules, coroutines, ranges, константные вычисления и улучшения шаблонов.