Данная домашка состоит из двух частей -- одна из них обязательна для всех, а вторая обязательна для групп K3240-41 и опциональна для K3242-43
Условия домашки для обеих групп одинаковые. Сложная версия отличается только требованиями к быстродействию. Иными словами, простая версия заключается только в том, чтобы реализовать необходимую логику, а для сложной версии надо уложиться еще и в ограничения по времени.
Все тесты разбиты на дву группы -- Easy и Hard.
Easy проверяет корректность работы вашей программы, на небольшом кол-ве данных и вам не надо париться о производительности вашего кода.
Hard проверяет эффективность вашей программы на большом количестве данных и запросов. Если вы выберете простую версию, то ваша программа просто не будет запускаться на тестах из секции Hard.
Если вы из группы K3242-43, то вы можете выбрать простую
версию домашки (по-умолчанию выбрана сложная версия). Для
этого надо отредактировать файл CMakeLists.txt
согласно комментарию в первой его строке. Но если выберете
и сделаете сложную версию, то вы получите 5 доп баллов.
Вам необходимо реализовать небольшую базу данных, которая хранит ваши контакты и простенькую историю звонков.
- Телефонный номер
number
-- произвольная строка длины не более 20 симоволов, при этом пустая строка тоже является корректным телефонным номемером (Обратите внимание, что длина телефонного номера маленькая это поможет вам при релизации Hard версии) - Имя контакта в вашей книжке
name
-- произвольная строка длины до 10'000 символов, то есть имена бывают ОЧЕНЬ длинными - Контакт в вашей книжке
user_t
-- структура контакта, состоящая из телефонного номераnumber
и имениname
- Запись истории звонков
call_t
-- структура, состоящая из телефонного номераnumber
, на который вы звонили и длительность звонка в секундахduration_s
-- число с плавающей точкой (double
) - Инфо контакта
user_info_t
-- структура, состощая из контактаuser
и суммарной длительности ваших звонков на этот контактtotal_call_duration_s
в секундах
- Пустой конструктор должен создавать вам пустую телефонную
книгу (без контактов и с пустой историей звонков).
Постарайтесь так оформить ваш класс, чтобы его
можно было сделать
= default;
- Конструктор копирования должен создавать независимую
копию вашей телефонной книги. Постарайтесь так оформить ваш класс, чтобы его можно было
сделать
= default;
- Деструктор -- ну тут должно быть все понятно. Постарайтесь
так оформить ваш класс, чтобы его можно было сделать
= default;
- Создание контакта
create_user
. Принимает номерnumber
и имяname
для добавления в вашу книжку нового контакта с указанным номером и указанным именем. Если контакт с таким номером уже есть в книжке, то метод должен вернутьfalse
и больше ничего не делать. В противном случае надо добавить новый контакт с указанными данными и вернутьtrue
. Таким образом телефонный номер является уникальным идентификатором контакта в вашей книжке, а вот имена могут повторяться - Добавления записи истории звонков
add_call
. Принимаетcall_t
, который надо добавить в вашу книжку. Если контакт с номером, указанным в переданномcall_t
не существует в вашей книжке, то метод должен вернутьfalse
и больше ничего не делать. В противном случае надо добавить запись в историю и вернутьtrue
- Запрос истории звонков
get_calls
. Все записи в истории должны быть упорядочены в том порядке, в котором они были добавлены с помощью методаadd_call
. Данный метод принимаетstart_pos
иcount
и должен вернуть подотрезок истории начиная с индексаstart_pos
и заканчивая индексомstart_pos + count - 1
(в 0-индексации). Обратите внимание, что этот орезок может не быть подотрезком истории! Иными словами,count
может быть0
или больше, чем размер истории.start_pos
может быть дальше конца истории. Это не является ошибками! Вам просто надо вернуть ту часть, которая фактически присутствует в истории, поэтому ваш результат может быть короче, чемcount
или вовсе пустой! - Запрос поиска пользователей по префиксу имени
search_users_by_name
. Представьте, что вы ищете в своей книжке контакт по имени и начинаете его вводить. Хорошее приложение начнет вам подсказывать контакты еще ДО полного ввода имени. Этот метод должен вернуть топcount
инфо контактов, для которых имя пользователя начинается наname_prefix
, в следующем порядке сортировки: сначала по лексикографическому возрастанию имени, при равенстве имен по убыванию суммарной длительности звонков на этот номер, при равенстве и этого, по лексикографическому возрастанию номера. Иными словами, вам надо отсортировать все контакты по правилам выше, выкинуть те, чьи имена НЕ начинаются наname_prefix
, из оставшихся вернуть топcount
, если столько есть, в противном случае вернуть все что есть (возможно ничего). Но такое решение, очевидно, не подойдет для версии Hard -- надо будет придумать что-то более эффективное, используя встроенные контейнеры. - Запрос поиска пользователей по префиксу номера
search_users_by_number
. Этот метод очень похож на предыдущий, только тут надо фильтровать по префиксу номера и правила сортировки несколько другие: сначала по убыванию суммарной длительности звонков на этот номер, при равенстве по лексикографическому возрастанию имени, при равенстве имен по лексикографическому возрастанию номера. Иными словами, вам надо отсортировать все контакты по правилам выше, выкинуть те, чьи телефонные номера НЕ начинаются наnumber_prefix
, из оставшихся вернуть топcount
, если столько есть, в противном случае вернуть все что есть (возможно ничего). Для Easy версии этот метод ничем особо не отличается от предыдущего, просто немного другие правила, а вот для Hard версии есть качественное отличие -- в предыдущем методе фильтрация и первичная сортировка были по одному и тому же параметру -- имени, что значительно упрощает решение. В данном же случае -- фильтрация идет по телефонному номеру, а первичный критерий сортировки -- суммарная длительность звонков. Совет: подумайте над идеями бора из третьей домашки, НО из-за того, что номера короткие, то бор реализовывать не надо -- можно обойтись встроенными контейнерами, пусть и не так эффективно, но в таймауты вы уложитесь! - Сброс вашей книжки
clear
. Этот метод должен опустошить вашу телефонную книжку -- удалить все контакты и всю историю звонков - Узнать количество контактов в вашей книжке
size
- Проверить что ваша книжка пуста
empty
Есть два файла phone-book.h
и phone-book.cpp
.
В phone-book.h
надо дополнить декларацию класса записной
книжки. Менять можно только приватный интерфес класса
phone_book_t
и список #include
В phone-book.cpp
вам надо реализовать публичный интерфейс
(и приватный, если вы добавили туда какие-то методы)
CMakeLists.txt
чтобы выбрать версию :)
Чтобы собрать и запустить тесты надо выполнить:
python3 scripts/run-tests.py
Для сложной версии тесты достаточно нагруженные и часть задания уложить каждый тест в определенный таймаут -- три четверти секунды на тест.
Чтобы запустить тесты с проверкой скорости надо выполнить:
python3 scripts/run-tests.py -c Release
Если вы хотите узнать сколько работает ваша программа, но ее рубят по таймауту, то вы можете запустить тесты с повышенным таймаутом (при этом таймаут в тестирующей системе не изменится). Для этого вам надо:
python3 scripts/run-tests.py -c Release --timeout 100000
Если у вас падает какой-то конкретный тест и вы хотите запускать только его,
то вы можете открыть файл в CLion main-easy.cpp
или
main-hard.cpp
(смотря для какой части домашки вы хотите
запустить тест). Найти этот тест в коде и нажать на зеленый треугольничек
слева от декларации теста. Единственный минус такого запуска в том, что
не будут проверены таймауты.
Чтобы запускать только один тест с проверкой таймаута вам надо:
python3 scripts/run-tests.py -c Release --filter Hard.AddCallsToOneUser
(тут Hard.AddCallsToOneUser
-- имя теста, который выхотите запустить)
Также можно добавить опицию --timeout 100000
чтобы запустить на одном тесте
с повышенным таймаутом