Практические задания по C++
:::tip Как пользоваться списком Задания для самостоятельной работы после теории intro. Каждый пункт — мини-проект с критерием готовности. Подсказки «с чего начать» помогают, если застряли; полное решение собирайте сами. Самопроверка: 999. :::
:::tip Критерий «сделано»
Код собирается без предупреждений (-Wall или /W4), проходит описанные проверки, вы можете устно объяснить владение памятью и границы модулей.
:::
Не требуют внешних учебников — только компилятор, CMake и при необходимости Qt SDK / Vulkan SDK.
Уровень 1 — язык и память
1.1. Каталог файлов
Цель: обход каталога, фильтр по расширению .cpp.
Что изучить: std::filesystem (C++17), directory_iterator, path::extension().
С чего начать:
#include <filesystem>
namespace fs = std::filesystem;
for (const auto& entry : fs::recursive_directory_iterator(".")) {
if (!entry.is_regular_file()) continue;
// сравнить entry.path().extension() с ".cpp"
}
Требования:
- вывод относительного пути и размера файла;
- при ошибке доступа — сообщение, программа продолжает обход.
Проверка: каталог с вложенными папками; пустой каталог — вежливое сообщение, без падения.
1.2. RAII-лог
Цель: класс LogScope, пишущий в файл при создании строку enter <имя> и при уничтожении leave <имя>.
Подсказка по каркасу:
class LogScope {
std::string name_;
std::ofstream& log_;
public:
LogScope(std::string name, std::ofstream& log);
~LogScope(); // записать leave
LogScope(const LogScope&) = delete;
LogScope& operator=(const LogScope&) = delete;
};
Требования:
- запрет копирования;
- в
main— вложенные блоки{ LogScope a(...); { LogScope b(...); throw ... } }— для уже созданных scope строкиleaveвсё равно появляются.
1.3. Rule of Five в мини-строке
Цель: класс SmallString с буфером в куче: конструктор, копирование, перемещение, деструктор, operator=.
Минимальный API: size(), data() или c_str(), push_back(char).
Проверка: AddressSanitizer / UB-санитайзер — нет утечек при цепочке присваиваний и std::vector<SmallString> с ростом.
Уровень 2 — STL и C++20
2.1. Частотный словарь
Цель: прочитать текстовый файл, посчитать слова, вывести топ-10.
Шаги:
std::ifstream+ построчное чтение.- Разбить строку на слова (по пробелам или
std::istringstream). - Нормализация:
tolower, убрать пунктуацию у краёв слова. std::unordered_map<std::string, int>для счётчиков.- Положить пары в
vector, отсортировать по частоте.
Материал: 31 для ranges-версии сортировки.
2.2. Конвейер ranges
Цель: из vector<int> — сумма квадратов чётных чисел одной цепочкой filter → transform → свёртка.
Пример направления (C++20):
auto sum = nums
| std::views::filter([](int n){ return n % 2 == 0; })
| std::views::transform([](int n){ return n * n; });
// далее std::ranges::fold_left или ручной цикл для суммы
Проверка: результат совпадает с обычным циклом на тех же данных.
2.3. optional и ошибки
Цель: parse_int(std::string_view) -> std::optional<int> без исключений.
Логика: пройти символы; при первом не-цифре (кроме опционального - в начале) вернуть std::nullopt.
CLI: аргументы argv[1..], для неудачных — строка invalid.
Уровень 3 — сборка и тесты
3.1. CMake-библиотека + exe
Цель: статическая mathlib (факториал, gcd) + demo.
Структура:
project/
├── CMakeLists.txt
├── include/mathlib.hpp
├── src/mathlib.cpp
└── src/main.cpp
CMake (скелет):
add_library(mathlib STATIC src/mathlib.cpp)
target_include_directories(mathlib PUBLIC include)
add_executable(demo src/main.cpp)
target_link_libraries(demo PRIVATE mathlib)
3.2. GTest
Цель: три теста на mathlib (gcd норма, gcd(0,x), факториал малых n), target calc_tests, ctest.
Материал: 1007 — скопируйте блок FetchContent + gtest_discover_tests.
Уровень 4 — UI (Qt)
4.1. Widgets
Цель: окно со списком задач: поле ввода, кнопка «добавить», QListWidget.
Подсказки:
QLineEdit+QPushButton+QListWidgetвQVBoxLayout;- в слоте кнопки:
list->addItem(lineEdit->text()); lineEdit->clear();.
Проверка: данные живут в сессии (сохранение на диск — по желанию).
Материал: 2731.
4.2. Qt Quick
Цель: счётчик по 2732 + кнопка «сброс», reset() в C++ с Q_INVOKABLE.
Проверка: Label с text: "..." + counter.value обновляется без setText из C++.
Уровень 5 — графика (по желанию)
5.1. Треугольник Vulkan
Цель: GLFW, Vulkan SDK, validation layers, один render pass, цветной треугольник.
Не требуется: текстуры, depth, индексные буферы.
5.2. Индексы и uniform
Цель: квад из двух треугольников, ортографическая матрица в uniform buffer, вращение по таймеру.
Уровень 6 — интеграция
6.1. Мини-сервис
Цель: консоль: конфиг (JSON/INI), HTTP GET на localhost (cpp-httplib header-only), лог в файл с RAII.
Как проверять себя
| Вопрос | Зачем |
|---|---|
Кто владеет каждым new / unique_ptr? | нет утечек |
| Что будет при исключении в середине функции? | RAII |
| Какой стандарт C++ в CMake? | ranges / optional |
| Сколько раз копируются данные в цепочке? | производительность |
После уровней 1–3 — 999. После 4–5 — 28 или /encyclopedia/9-spinoff/9-04-razrabotka-igr/intro.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). C++ как язык системного программирования - ключевые принципы, область применения и инженерные требования к коду. Экосистема приложений на C++ - области применения языка от системного ПО до высоконагруженных вычислений. C++ — это мощный язык программирования общего назначения, который обеспечивает прямой доступ к аппаратным ресурсам компьютера при сохранении высокой производительности. Гайд по установке и настройке с написанием первой программы и её запуском. Директива препроцессора include используется для подключения заголовочных файлов в исходный код. Она сообщает компилятору вставить содержимое указанного файла в текущее место перед началом компиляции. Конфигурация — это набор правил и переменных, которые управляют процессом превращения исходного текста в исполняемый продукт. Примеры простых и полезных консольных приложений с демонстрацией концепций языка. Минимальный кроссплатформенный проект C++17 с CMake — структура, сборка и разбор CMakeLists построчно. Модульные тесты с GTest и Catch2 в CMake-проекте — зачем отдельный target, примеры и запуск ctest. Набор советов, правил, принципов и обычаев в разработке на этом языке. Типизация, набор правил определения типа данных значений языка. Операторы и выражения в C++ - семантика операций, приоритеты и построение корректной вычислительной логики.C++ - язык системного программирования
Экосистема приложений на C++
Что требуется знать перед началом изучения языка программирования C++
Первая программа на C++
Начало работы с C++
Конфигурация и сборка в C++
Простые приложения на C++
CMake — первая программа
Google Test и Catch2 в C++
Рекомендации по разработке на C++
Типы данных в C++
Операторы и выражения в C++