zimovid

Untitled

Jun 27th, 2023
640
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <tuple>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. // Перечислимый тип для статуса задачи
  10. enum class TaskStatus {
  11.     NEW,          // новая
  12.     IN_PROGRESS,  // в разработке
  13.     TESTING,      // на тестировании
  14.     DONE          // завершена
  15. };
  16.  
  17. // Объявляем тип-синоним для map<TaskStatus, int>,
  18. // позволяющего хранить количество задач каждого статуса
  19. using TasksInfo = map<TaskStatus, int>;
  20.  
  21. class TeamTasks {
  22. public:
  23.     // Получить статистику по статусам задач конкретного разработчика
  24.     const TasksInfo& GetPersonTasksInfo(const string& person) const {
  25.         return person_tasks_.at(person);
  26.     }
  27.  
  28.     // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  29.     void AddNewTask(const string& person) {
  30.         ++person_tasks_[person][TaskStatus::NEW];
  31.     }
  32.  
  33.     // Обновить статусы по данному количеству задач конкретного разработчика
  34.     tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count) {
  35.  
  36.         // Проверка существования искомого разработчика
  37.         if (person_tasks_.count(person) == 0) return {TasksInfo(), TasksInfo()};
  38.  
  39.         // Объявляем временный словарь для хранения обновленной информации
  40.         TasksInfo updated_tasks, untouched_tasks;
  41.  
  42.         // Сохраняем исходное состояние задач
  43.         TasksInfo& tasks = person_tasks_[person];
  44.         for (const auto& task : tasks) {
  45.             if (task.second > 0) {
  46.                 untouched_tasks[task.first] = task.second;
  47.             }
  48.         }
  49.  
  50.         // Обновляем статусы
  51.         for (TaskStatus status = TaskStatus::NEW; status != TaskStatus::DONE;) {
  52.             const int count = tasks[status];
  53.             if (count == 0) {
  54.                 status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
  55.                 continue;
  56.             }
  57.  
  58.             const int moved_count = min(count, task_count);
  59.             task_count -= moved_count;
  60.  
  61.             // Обновляем количество задач в статусах в словаре updated_tasks
  62.             updated_tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += moved_count;
  63.  
  64.             // Обновляем количество задач в статусе status
  65.             tasks[status] -= moved_count;
  66.  
  67.             // Перемещаем отработанные задачи в словарь updated_tasks
  68.             if (tasks[status] == 0) {
  69.                 tasks.erase(status);
  70.                 status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
  71.             } else {
  72.                 untouched_tasks[status] = tasks[status];
  73.                 status = static_cast<TaskStatus>(static_cast<int>(status) + 1);
  74.             }
  75.         }
  76.  
  77.         // Применяем изменения из временного словаря updated_tasks к основному словарю tasks
  78.         for (const auto& task : updated_tasks) {
  79.             tasks[task.first] += task.second;
  80.         }
  81.  
  82.         return {updated_tasks, untouched_tasks};
  83.     }
  84.  
  85. private:
  86.     map<string, TasksInfo> person_tasks_;
  87. };
  88.  
  89. // Принимаем словарь по значению, чтобы иметь возможность
  90. // обращаться к отсутствующим ключам с помощью [] и получать 0,
  91. // не меняя при этом исходный словарь
  92. void PrintTasksInfo(TasksInfo tasks_info) {
  93.     cout << tasks_info[TaskStatus::NEW] << " new tasks" <<
  94.         ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" <<
  95.         ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" <<
  96.         ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << endl;
  97. }
  98.  
  99. int main() {
  100.     TeamTasks tasks;
  101.     tasks.AddNewTask("Ilia");
  102.     for (int i = 0; i < 3; ++i) {
  103.         tasks.AddNewTask("Ivan");
  104.     }
  105.     cout << "Ilia's tasks: ";
  106.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"));
  107.     cout << "Ivan's tasks: ";
  108.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"));
  109.  
  110.     TasksInfo updated_tasks, untouched_tasks;
  111.  
  112.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
  113.     cout << "Updated Ivan's tasks: ";
  114.     PrintTasksInfo(updated_tasks);
  115.     cout << "Untouched Ivan's tasks: ";
  116.     PrintTasksInfo(untouched_tasks);
  117.  
  118.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
  119.     cout << "Updated Ivan's tasks: ";
  120.     PrintTasksInfo(updated_tasks);
  121.     cout << "Untouched Ivan's tasks: ";
  122.     PrintTasksInfo(untouched_tasks);
  123. }
Advertisement
Add Comment
Please, Sign In to add comment