Это репозиторий курса по C++, который читается в Школе разработчика компании Прософт-Системы.
Инструкции по настройке окружения представлены в SETUP.md.
psds_cpp_2025/
├── 01_week/ # Папка рабочей недели
│ ├── tasks/ # Задачи для решения
│ ├── examples/ # Примеры кода лекции
│ ├── 01_<name>.md # Конспект лекции в формате Markdown
│ ├── 01_<name>.pdf # Конспект лекции в формате PDF
│ └── CMakeLists.txt # Файл сборки CMake для текущей недели
...
├── cmake/ # Файлы конфигурации CMake
├── .gitignore # Игнорирование файлов в Git
├── CMakeLists.txt # Главный файл сборки CMake
└── main.cpp # Для экспериментов
Каждую неделю в репозитории появляются задачи. Задача помещается в отдельную папку
внутри папки ##_week/tasks/.
Как правило, папка с задачей содержит минимальный набор файлов:
README.md- файл с описанием задачи и требованиям к выполнению.CMakeLists.txt- файл для сборки непосредственно данной задачи.<task_name>.cpp- файл требующий реализации данного задания.test.cpp- файл тестов для задачи.
Разрешено изменять только файлы реализации *.cpp. В задачах, где можно создавать
несколько файлов с расширениями .h и .cpp самостоятельно, будет отмечена такая
возможность в условиях.
Также в удаленный репозиторий следует отправлять только изменения файла реализации. Остальные изменения будут игнорироваться.
При отправке задачи она тестируется, при этом в случае успеха задача засчитывается.
Файл тестов test.cpp может включать не все тесты. Тесты на сервере могут быть
расширены.
При сборке задачи будут установлены флаги компиляции:
g++ ./task.cpp -O3 -std=c++20 -fsanitize=address,undefined -Wall -Werror -Wextra- следовательно, целесообразно проверять своё решение с данными флагами.
Каждая задача имеет заданную ценность в баллах. За правильное выполнение задачи в срок до дедлайна начисляется 100 %. За выполнение после дедлайна до окончания курса начисляется 30 % баллов. Дедлайн, если не оговорено иное, устанавливается в пятницу 23:59 по МСК следующей недели после старта задачи.
Задача выполнена правильно, если решение проходит все тесты при отправке в удаленный репозиторий. Также, следует убедиться, что вам начислены баллы в таблице результатов.
При обнаружении списывания, баллы обнуляются у всех участников списывания.
Для выживания в Школе разработчика необходимо к окончанию последнего дедлайна набрать 60 % от максимального балла.
Ниже приведена инструкция для сборки из терминала. Современные IDE также работают
с CMake и при установке плагинов могут автоматически собрать проект и все тесты
будут доступны. Для простоты можете использовать бесплатную IDE VS Code. Но поскольку
у всех IDE разные, то при возникновении проблем: думайте сами, решайте сами.
Но, конечно, не возбраняется спросить преподавателей или сокурсников в чате.
Сборка осуществляется с помощью CMake. Для этого в корне репозитория присутствует
файл CMakeLists.txt содержащий соответствующие инструкции и,
включающий вложенные файлы CMakeLists.txt в подпапках проекта.
По умолчанию опция сборки примеров (*/examples/<name>.cpp) отключена, что
позволяет не загромождать рабочее пространство IDE и сосредоточится на задачах.
Сборка проекта представляет собой сборку тестов для задач. Все задачи включены
в один проект. Для сборки проекта в папке build/ из корня репозитория
осуществляются следующие команды:
- Настроить проект в папке
build/и подготовить файлы для сборки:
cmake -B build- в логах команды следует убедиться, что всё прошло хорошо и используется нужная версия компилятора
- Собрать проект используя файлы из папки
build/:
cmake --build build- ввиду отсутствия реализации решений, при сборке проекта целиком, могут возникать ошибки. Поэтому часто будет удобно собрать только одну решенную задачу. При этом при сборке необходимо указать конкретный исполняемый файл.
Для сборки отдельной задачи и запуска тестов необходимо выполнить следующую команду:
cmake --build build --target test_<task_name>
./build/tasks/test_<task_name><task_name>- имя задачи, которую требуется собрать.
При необходимости можно экспериментировать с флагами компиляции. Чтобы запустить тест вручную, можно выполнить следующую команду из корня репозитория:
g++ ./01_week/tasks/addition/test.cpp -lgtest -lgtest_main && ./a.out- при этом библиотека GoogleTest уже должна быть собрана.
- аналогичную команду можно применить, если используется
clang++
В тестирующей системе запуск производится со следующими флагами:
g++ ./01_week/tasks/addition/test.cpp -O3 -std=c++20 \
-fsanitize=address,undefined -Wall -Werror -Wextra \
-lgtest -lgtest_main \
&& ./a.outПримеры рекомендуется запускать из терминала, так будет удобнее.
Находясь в корневой папке репозитория для запуска примера из терминала необходимо выполнить одну из комманд:
g++ ./01_week/examples/hello_cpp.cpp -std=c++20 -Wall -Wextra && ./a.out clang++ ./01_week/examples/hello_cpp.cpp -std=c++20 -Wall -Wextra && ./a.outПри необходимости можно убрать, добавить или поменять флаги компилятора.
Порядок примеров в соответствии с ходом лекции можно найти в рабочей папке
соответствующей недели 01_week/ в файле CMakeLists.txt.
Цели обозначенные командой add_examle(...) упорядочены последовательно.
Обратите внимание, что на сервере осуществляется тестирование с включенными санитайзерами, которые проверяют наличие неопределенного поведения и некорректной работы с памятью в программе. Осуществить такую сборку можно следующими командами:
cmake -B build-asan -DCMAKE_BUILD_TYPE=Asan
cmake --build build-asan --target test_<task_name>
./build-asan/tasks/test_<task_name>После того как локально все тесты проходят и проверен стиль код проекта, можно отправить задачу в удаленный репозиторий для сдачи.
Для этого необходимо выполнить следующие команды git из корня репозитория:
git add ./01_week/tasks/addition/addition.cpp
git commit -m "add (solution): add <task_name> task"
git push origin main- сообщение коммита должно быть адекватным, для удобства рекомендуется
использовать префиксы
add,fix,ref.
После чего необходимо пронаблюдать за пайплайном и убедиться, что задача решена верно и зачтена. А также убедится, что баллы поставлены в таблицу результатов.