/master-programming-task

Tasks for master programming course

Primary LanguageC++

О проекте

Основная цель проекта - тестирование умений программирования на языке C++ у студентов.

Список заданий

  1. Ознакомление с принципами работы с проектом
  2. Потоковые манипуляторы ввода/вывода
  3. Прокси-объект
  4. Итератор
  5. Использование std::variant
  6. Парсер JSON на основе boost::spirit::x3
  7. Ассоциативный массив для хранения типа, в котором значения задаются в рантайме
  8. Написание тестов для диапазона со страйдом

Зависимости

Для успешной сборки необходимы следующие компоненты:

  1. C++-компилятор, поддерживающий минимальный стандарт C++-20
  2. cmake версии 3.15+
  3. cmake-совместимая система сборки, например, gnumake или ninja
  4. boost версии 1.79+
  5. catch2 версии 3.0+

Как собирать?

cmake

Необходимо из корня репозитория выполнить следующие команды (более подробно см. cmake):

$ cmake -B build -GNinja .
$ cmake --build build
$ cmake --build build test

Если работа осуществляется над конкретным заданием, нужно удалить первую строку return() из файла CMakeLists.txt. Запуск теста конкретного задания (в логе тестов задание выглядит как <myproject>):

$ cmake --build build
$ ctest --test-dir build -R <myproject> -V

Флаг -V показывает детальный отчёт запуска тестов.

Другой вариант запуска тестов - вызов исполнимого файла напрямую из директории задания в дереве сборки:

build/ $ ./<labN>/tests_<myproject>

Вместо команды cmake --build build можно вызывать команду генератора сборки (для примера выше команда ninja).

nix-shell

Использование nix-shell возможно вне операционной системе NixOS. Для этого подойдёт любая линукс-подобная система (даже MacOS или WSL для Windows10).

Установить nix окружение можно с помощью команды sh <(curl -L https://nixos.org/nix/install) --no-daemon, попутно ответив на несколько вопросов. Далее перейдите в корень проекта, который необходимо собрать, и вызовите команду nix-shell. После загрузки пакетов в окружение проекта просто следуйте инструкции по сборке проекта с помощью cmake.

vcpkg

Подходит для работы в Visual Studio Community edition.

  • Склонировать проект и установить https://github.com/Microsoft/vcpkg.
  • Интегрировать пакетный менеджер командой vcpkg integrate install.
  • Установить пакеты catch2 и boost командой vcpkg install <packet>:x64-windows.
  • При сборки проекта с помощью cmake указать тулчейн vcpkg (см. документацию по vcpkg).

Как работать с заданиями

Каждое задание - это подпроект с файлами и папками:

  • файл CMakeLists.txt;
  • директория include, которая представляет из себя "код" задания;
  • директория tests содержит код для проверки задания;
  • файл README.rst содержит полезную информацию о задании.

Студенты должны работать с файлами только из директории include. Исключением является последнее задание, где студентами необходимо править файлы в директории tests. Основной критерий сдачи задания - это прохождение всех тестов в подпроекте задания.

Вопросы для саморазвития

  1. Как объявить и определить функцию внутри другой функции?

  2. Как скопировать лямбда-функцию?

  3. Как вызвать неконстантный метод класса члена класса, находясь в константном методе?

    struct cba
    {
        std::ostream& o;
    }
    
    struct abc
    {
        void mark() const
        {
            obj.o << 123;
        }
    
        ?cba? obj;
    }
    
  4. Как инициализировать переменные класса в разных конструкторах одинаково?

  5. Как инициализировать переменную класса через отдельную функцию в списке инициализации конструктора?

Темы для собственных pet-проектов:

  • INI-парсер с EBNF в комментариях;
  • реализация мультиразмерного итератора с возможностью выбора направления итерации (по осям x, y или z и и.д.);
  • реализация примера работы с google-protobuf;
  • реализация битового итератора;
  • реализация дуальных чисел.