Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <tuple>
- #include <vector>
- using namespace std;
- // Перечислимый тип для статуса задачи
- enum class TaskStatus {
- NEW, // новая
- IN_PROGRESS, // в разработке
- TESTING, // на тестировании
- DONE // завершена
- };
- // Объявляем тип-синоним для map<TaskStatus, int>,
- // позволяющего хранить количество задач каждого статуса
- using TasksInfo = map<TaskStatus, int>;
- class TeamTasks {
- public:
- // Получить статистику по статусам задач конкретного разработчика
- const TasksInfo& GetPersonTasksInfo(const string& person) const {
- return person_tasks_.at(person);
- }
- // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
- void AddNewTask(const string& person) {
- ++person_tasks_[person][TaskStatus::NEW];
- }
- // Обновить статусы по данному количеству задач конкретного разработчика
- tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count) {
- // Проверка существования искомого разработчика
- if (person_tasks_.count(person) == 0) return {TasksInfo(), TasksInfo()};
- // Объявляем временный словарь для хранения обновленной информации
- TasksInfo updated_tasks, untouched_tasks;
- // Сохраняем исходное состояние задач
- TasksInfo& tasks = person_tasks_[person];
- for (const auto& task : tasks) {
- if (task.second > 0) {
- untouched_tasks[task.first] = task.second;
- }
- }
- // Обновляем статусы
- for (TaskStatus status = TaskStatus::NEW; status != TaskStatus::DONE;) {
- const int count = tasks[status];
- if (count == 0) {
- status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
- continue;
- }
- const int moved_count = min(count, task_count);
- task_count -= moved_count;
- // Обновляем количество задач в статусах в словаре updated_tasks
- updated_tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += moved_count;
- // Обновляем количество задач в статусе status
- tasks[status] -= moved_count;
- // Перемещаем отработанные задачи в словарь updated_tasks
- if (tasks[status] == 0) {
- tasks.erase(status);
- status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
- } else {
- untouched_tasks[status] = tasks[status];
- status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
- }
- }
- // Применяем изменения из временного словаря updated_tasks к основному словарю tasks
- for (const auto& task : updated_tasks) {
- tasks[task.first] += task.second;
- }
- return {updated_tasks, untouched_tasks};
- }
- private:
- map<string, TasksInfo> person_tasks_;
- };
- // Принимаем словарь по значению, чтобы иметь возможность
- // обращаться к отсутствующим ключам с помощью [] и получать 0,
- // не меняя при этом исходный словарь
- void PrintTasksInfo(TasksInfo tasks_info) {
- 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" << endl;
- }
- int main() {
- TeamTasks tasks;
- tasks.AddNewTask("Ilia");
- for (int i = 0; i < 3; ++i) {
- tasks.AddNewTask("Ivan");
- }
- cout << "Ilia's tasks: ";
- PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"));
- cout << "Ivan's tasks: ";
- PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"));
- TasksInfo updated_tasks, untouched_tasks;
- tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
- cout << "Updated Ivan's tasks: ";
- PrintTasksInfo(updated_tasks);
- cout << "Untouched Ivan's tasks: ";
- PrintTasksInfo(untouched_tasks);
- tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
- cout << "Updated Ivan's tasks: ";
- PrintTasksInfo(updated_tasks);
- cout << "Untouched Ivan's tasks: ";
- PrintTasksInfo(untouched_tasks);
- }
Advertisement
Add Comment
Please, Sign In to add comment