Перейти к основному содержимому

Практические задания по 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 всё равно появляются.

Материал: 30, 19, 192.


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.

Шаги:

  1. std::ifstream + построчное чтение.
  2. Разбить строку на слова (по пробелам или std::istringstream).
  3. Нормализация: tolower, убрать пунктуацию у краёв слова.
  4. std::unordered_map<std::string, int> для счётчиков.
  5. Положить пары в vector, отсортировать по частоте.

Материал: 31 для ranges-версии сортировки.


2.2. Конвейер ranges

Цель: из vector<int> — сумма квадратов чётных чисел одной цепочкой filtertransform → свёртка.

Пример направления (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)

Материал: 1006, 1004.


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, индексные буферы.

Материал: 29, 22.


5.2. Индексы и uniform

Цель: квад из двух треугольников, ортографическая матрица в uniform buffer, вращение по таймеру.


Уровень 6 — интеграция

6.1. Мини-сервис

Цель: консоль: конфиг (JSON/INI), HTTP GET на localhost (cpp-httplib header-only), лог в файл с RAII.

Связь: 25, 1005.


Как проверять себя

ВопросЗачем
Кто владеет каждым new / unique_ptr?нет утечек
Что будет при исключении в середине функции?RAII
Какой стандарт C++ в CMake?ranges / optional
Сколько раз копируются данные в цепочке?производительность

После уровней 1–3 — 999. После 4–5 — 28 или /encyclopedia/9-spinoff/9-04-razrabotka-igr/intro.


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).