Tasks for Otus C++ Professional cours
- Homework_1
- Homework_2
- Homework_3
- Homework_4
- Homework_5
- Homework_6
- Homework_7
- Homework_8
- Homework_9
- Homework_10
- Homework_11
- Homework_12
- Homework_13
Написать программу, выводящую на консоль две строки:
build N
Hello, World!Где вместо N должен выводится текущий номер сборки. Запустить на этапе сборки тесты, проверяющие валидность номера версии. Выложить исходные тексты в репозиторий на github.
Настроить Github Actions workflow для автоматической сборки проекта на каждый коммит. Так же настроить автоматический выпуск релиза либо на каждый коммит, либо по созданию тэга.В связи с недавними обновлениями политики безопасности для работы с репозиторием из консоли потребуется создать access token.
Варианты организации исходников по самостоятельным работам:
- отдельный репозиторий под каждую работу
- отдельная ветка в одном и том же репозитории под каждую работу
- отдельная директория в одной и той же ветке одного и того же репозитория
- версия пакета увеличивается от сборки к сборке
- актуальная версия выводится в приветственном сообщении
- пакет
helloworld, содержащий исполняемый файлhelloworld, опубликован в качестве релиза в репозитории
****Задание считается выполненным успешно, если после установки скаченного из релиза пакета:
apt update && apt install -y helloworld-0.0.X-Linux.deb
(вместо X – номер билда), запуска бинарного файла:
helloworld_cli
появилось сообщение:
Version: X
Hello, World!
(вместо X – опять же, номер билда).-
Дополнительное упражнение
Добавить unit-тест, который будет полностью повторяет предложенный в материалах вебинара тест test_version.cpp, но сделать его с использованием GoogleTest framework. GoogleTest при этом либо подключить к репозиторию в качестве submodule и собрать вместе с тестом, либо установить на этапе подготовке к сборке через Github Actions.
Реализуем утилиту для эффективной сортировки и фильтрации лога IP-адресов. Продолжаем пользоваться сборочной фермой для публикации пакета.
Программа из стандартного ввода читает данные. Данные хранятся построчно. Каждая строка состоит из трех полей, разделенных одним символом табуляции, и завершается символом конца строки.
Формат строки:
text1 \t text2 \t text3
Поля text2 и text3 игнорируются. Поле text1 имеет следующую структуру (ip4 address):
n1.n2.n3.n4 где n1..4 – целое число от 0 до 255.
Требуется загрузить список ip-адресов в память и отсортировать их в обратном лексикографическом порядке. Пример лексикографической сортировки (по первому числу, затем по второму и так далее):
1.1.1.1 1.2.1.1 1.10.1.1
Соответственно, обратная:
1.10.1.1 1.2.1.1 1.1.1.1
💡 Обратите внимание – сортировка выполняется в байтовом (численном) представлении IP-адреса, а не в строковом. Поэтому адрес, например, 1.2.1.1 меньше адреса 1.10.1.1 (ведь 2 < 10).
Далее выводим в стандартный вывод следующее:
Полный список адресов после сортировки. Одна строка - один адрес.
Сразу следом список адресов, первый байт которых равен 1. Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
Сразу продолжается список адресов, первый байт которых равен 46, а второй 70. Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
Сразу продолжается список адресов, любой байт которых равен 46. Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
Требования к реализации В приложенном к заданию исходном файле необходимо заменить, где это возможно, конструкции на аналогичные из стандарта С14/C17. Реализовать недостающий функционал. Не обязательно следовать приложенному шаблону. Можно выполнить задание, оформив код любым корректным способом.
Лишний раз проверьте лексикографическая сортировка понятна как для строки, так и для контейнера
выбрана соответствующая задаче структура данных
Самопроверка Макет исходного кода, а также тестовый файл с данными ip_filter.tsv прилагается к материалам занятия. Проверить себя можно следующим образом (Linux):
cat ip_filter.tsv | ip_filter | md5sum
24e7a7b2270daee89c64d3ca5fb3da1a -
💡 Внимание! Из-за различного толкования символа ’ на Linux и Windows, вышеприведенный хэш актуален только для Linux-систем. В случае, если Ваша рабочая система Windows, придумайте способ, как проверить реализацию, имея эталонный результат только для Linux. Пакет ip_filter, содержащий исполняемый файл ip_filter, должен быть опубликован в качестве релиза в репозитории.
Дополнительное упражнение
Добавить unit-тесты для реализации на понравившемся тестовом framework-е (рекомендуем GoogleTest).
Реализуем собственный STL-совместимый аллокатор, используем его в стандартных контейнерах. Пишем свой контейнер, поддерживающий параметризацию аллокатором по аналогии с STL.
Реализовать свой аллокатор памяти, который позволит выполнять операцию резервирования памяти. Далее использовать этот аллокатор с контейнером std::map.
Аллокатор должен параметризоваться количеством выделяемых за раз элементов. Освобождение конкретного элемента не предполагается - аллокатор должен освобождать всю память самостоятельно.
Аллокатор работает с фиксированным количеством элементов. Попытку выделить большее число элементов считать ошибкой.
Опционально реализовать расширяемость аллокатора. При попытке выделить число элементов, которое превышает текущее зарезервированное количество, аллокатор расширяет зарезервированную память.
Опционально реализовать поэлементное освобождение.
Цель такого аллокатора – снизить количество операций выделения памяти.
Реализовать свой контейнер, который по аналогии с контейнерами stl параметризуется аллокатором. Контейнер должен иметь две возможности - добавить новый элемент и обойти контейнер в одном направлении.
Опционально реализовать совместимость с контейнерами stl – итераторы, вспомогательные методы size, empty и т.д.
Цель реализации своего контейнера – попробовать использовать std::allocator, а также свой аллокатор.
Прикладной код должен содержать следующие вызовы:
создание экземпляра std::map<int, int>
заполнение 10 элементами, где ключ - это число от 0 до 9, а значение - факториал ключа
создание экземпляра std::map<int, int> с новым аллокатором, ограниченным 10 элементами
заполнение 10 элементами, где ключ - это число от 0 до 9, а значение - факториал ключа
вывод на экран всех значений (ключ и значение разделены пробелом) хранящихся в контейнере
создание экземпляра своего контейнера для хранения значений типа int
заполнение 10 элементами от 0 до 9
создание экземпляра своего контейнера для хранения значений типа int с новым аллокатором, ограниченным 10 элементами
заполнение 10 элементами от 0 до 9
вывод на экран всех значений, хранящихся в контейнере