Skip to content

IronFairy13/Homeworks

Repository files navigation

Homeworks

Tasks for Otus C++ Professional cours

Homework_1

Что нужно сделать?

Написать программу, выводящую на консоль две строки:

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.

Homework_2

Фильтрация IP-адресов

Реализуем утилиту для эффективной сортировки и фильтрации лога 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).

Homework_3

Allocator

Реализуем собственный 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

вывод на экран всех значений, хранящихся в контейнере

Homework_4

Homework_5

Homework_6

Homework_7

Homework_8

Homework_9

Homework_10

Homework_11

Homework_12

Homework_13

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published