Advertisement
Alaricy

функция в помощ

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