#include #include #include // Перечислимый тип для статуса задачи enum class TaskStatus { NEW, // новая IN_PROGRESS, // в разработке TESTING, // на тестировании DONE // завершена }; // Объявляем тип-синоним для map, // позволяющего хранить количество задач каждого статуса using TasksInfo = std::map; class TeamTasks { std::map db; public: // Получить статистику по статусам задач конкретного разработчика const TasksInfo& GetPersonTasksInfo(const std::string& person) const { return db.at(person); } // Добавить новую задачу (в статусе NEW) для конкретного разработчитка void AddNewTask(const std::string& person) { // Если у человека еще нет ни одной задачи if (db.count(person) == 0) { // Создаем единственную задачу db.insert({ person, {{TaskStatus::NEW, 1}, {TaskStatus::IN_PROGRESS, 0 }, {TaskStatus::TESTING, 0 }, {TaskStatus::DONE, 0}} }); } else { // Добавляем одну новую задачу db.at(person).at(TaskStatus::NEW)++; } } // Обновить статусы по данному количеству задач конкретного разработчика, std::tuple PerformPersonTasks(const std::string& person, int task_count) { TasksInfo updated; TasksInfo other; // Для всех задач от NEW до TESTING for (auto status = static_cast(TaskStatus::NEW); status < static_cast(TaskStatus::DONE); status++) { TaskStatus now = static_cast(status); // Текущий статус TaskStatus next = static_cast(status + 1); // Следующий статус // Если нет задачь с текущим статусом, переходим к следующему статусу if (!db.count(person)) continue; // Пока нужно обновить статус и есть задачи с текущим статусом while (task_count && db.at(person).at(now)) { // Если еще нет обновленных задач с таким статусом if (!updated.count(next)) updated.insert({ next, 0 }); db.at(person).at(now)--; // Уменьшаем кол-во задач с текущим статусом //db.at(person).at(next)++; // Увеличиваем кол-во задач с следующим статусом updated.at(next)++; task_count--; } } for (auto taskInfo : db.at(person)) { if (taskInfo.first != TaskStatus::DONE) { other.insert({ taskInfo.first, taskInfo.second }); } } // Добавляем обновившиеся задачи for (auto update : updated) { db.at(person).at(update.first) += update.second; } return std::make_tuple(updated, other); } }; // Принимаем словарь по значению, чтобы иметь возможность // обращаться к отсутствующим ключам с помощью [] и получать 0, // не меняя при этом исходный словарь void PrintTasksInfo(TasksInfo tasks_info) { std::cout << tasks_info[TaskStatus::NEW] << " new tasks" << ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" << ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" << ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << std::endl; } int main() { TeamTasks tasks; for (int i = 0; i < 5; i++) tasks.AddNewTask("Alice"); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); tasks.PerformPersonTasks("Alice", 5); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); tasks.PerformPersonTasks("Alice", 5); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); tasks.PerformPersonTasks("Alice", 1); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); for (int i = 0; i < 5; i++) tasks.AddNewTask("Alice"); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); tasks.PerformPersonTasks("Alice", 2); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); tasks.PerformPersonTasks("Alice", 4); PrintTasksInfo(tasks.GetPersonTasksInfo("Alice")); system("pause"); return 0; tasks.AddNewTask("Ilia"); for (int i = 0; i < 3; ++i) { tasks.AddNewTask("Ivan"); } std::cout << "Ilia's tasks: "; PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia")); std::cout << "Ivan's tasks: "; PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan")); TasksInfo updated_tasks, untouched_tasks; tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2); std::cout << "Updated Ivan's tasks: "; PrintTasksInfo(updated_tasks); std::cout << "Untouched Ivan's tasks: "; PrintTasksInfo(untouched_tasks); tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2); std::cout << "Updated Ivan's tasks: "; PrintTasksInfo(updated_tasks); std::cout << "Untouched Ivan's tasks: "; PrintTasksInfo(untouched_tasks); system("pause"); return 0; }