Advertisement
Alaricy

урок 7 трекер задач лается на большие числа

Oct 23rd, 2022 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.08 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.  
  34.     // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  35.     void AddNewTask(const string& person)
  36.     {
  37.        if (Tasks_and_persons_.count(person)==0){
  38.            Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
  39.            Tasks_and_persons_[person][TaskStatus::TESTING];
  40.            Tasks_and_persons_[person][TaskStatus::DONE];    
  41.        }                
  42.         Tasks_and_persons_[person][TaskStatus::NEW]++;                
  43.     }
  44.  
  45.     // Обновить статусы по данному количеству задач конкретного разработчика,
  46.     // подробности см. ниже
  47. tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, uint64_t task_count){
  48.  
  49. ////// Проинициализировать словари, учитывающие изменяемость задач    
  50. TasksInfo upd;
  51.     upd[TaskStatus::NEW];      
  52.     upd[TaskStatus::IN_PROGRESS];
  53.     upd[TaskStatus::TESTING];
  54.     upd[TaskStatus::DONE];
  55.  
  56. ///////Принять текущее состояние задач
  57. TasksInfo untch=GetPersonTasksInfo(person);    
  58.  
  59.  
  60. tuple<TasksInfo&, TasksInfo&> upd_untch_tasks(upd,untch);    
  61.    
  62.     ///////Цикл, продвигающий задачи из статуса в статус:
  63.     int iteration=0;
  64.     int maxsum=(3*Tasks_and_persons_[person][TaskStatus::NEW]+
  65.            2*Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]+
  66.            Tasks_and_persons_[person][TaskStatus::TESTING]);
  67.     if (task_count<=maxsum) iteration=task_count;
  68.     else iteration=maxsum;
  69.    
  70.     //cout << "iteration:"s << iteration<<endl;
  71.     for (uint64_t i=0; i<iteration; ++i)
  72.         {
  73.             if (Tasks_and_persons_[person][TaskStatus::NEW]>0)
  74.             {
  75.                 --Tasks_and_persons_[person][TaskStatus::NEW];
  76.                 ++Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
  77.               //  ++upd[TaskStatus::IN_PROGRESS];
  78.                if (untch[TaskStatus::NEW]>0) --untch[TaskStatus::NEW];
  79.                 continue;
  80.             }
  81.             if ((Tasks_and_persons_[person][TaskStatus::NEW]==0)&&
  82.                 (Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]>0))
  83.             {
  84.                 --Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
  85.                 ++Tasks_and_persons_[person][TaskStatus::TESTING];
  86.                // ++upd[TaskStatus::TESTING];
  87.                 if (untch[TaskStatus::IN_PROGRESS]>0)--untch[TaskStatus::IN_PROGRESS];                
  88.                 continue;
  89.             }
  90.             if ((Tasks_and_persons_[person][TaskStatus::NEW]==0)&&
  91.                 (Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]==0)&&
  92.                (Tasks_and_persons_[person][TaskStatus::TESTING]>0))
  93.             {
  94.                 --Tasks_and_persons_[person][TaskStatus::TESTING];
  95.                 ++Tasks_and_persons_[person][TaskStatus::DONE];
  96.                 //++upd[TaskStatus::DONE];                
  97.                 if (untch[TaskStatus::TESTING]>0) --untch[TaskStatus::TESTING];
  98.                 continue;
  99.             }          
  100.         }
  101.     /////// конец цикла протаклкивающего задачи
  102.     upd[TaskStatus::NEW]=Tasks_and_persons_[person][TaskStatus::NEW]-untch[TaskStatus::NEW];
  103.     upd[TaskStatus::IN_PROGRESS]=Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]-untch[TaskStatus::IN_PROGRESS];
  104.     upd[TaskStatus::TESTING]=Tasks_and_persons_[person][TaskStatus::TESTING]-untch[TaskStatus::TESTING];
  105.     upd[TaskStatus::DONE]=Tasks_and_persons_[person][TaskStatus::DONE]-untch[TaskStatus::DONE];
  106.  
  107.     return upd_untch_tasks;
  108.     }
  109. };
  110.  
  111. // Принимаем словарь по значению, чтобы иметь возможность
  112. // обращаться к отсутствующим ключам с помощью [] и получать 0,
  113. // не меняя при этом исходный словарь
  114. void PrintTasksInfo(TasksInfo tasks_info) {
  115.     cout << tasks_info[TaskStatus::NEW] << " new tasks" <<
  116.         ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" <<
  117.         ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" <<
  118.         ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << endl;
  119. }
  120. int main() {
  121.     TeamTasks tasks;
  122.     tasks.AddNewTask("Ilia");
  123.     for (int i = 0; i < 3; ++i) {
  124.         tasks.AddNewTask("Ivan");
  125.     }
  126.     cout << "Ilia's tasks: ";
  127.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"));
  128.     cout << "Ivan's tasks: ";
  129.     PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"));
  130.  
  131.     TasksInfo updated_tasks, untouched_tasks;
  132.  
  133.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
  134.     cout << "Updated Ivan's tasks: ";
  135.     PrintTasksInfo(updated_tasks);
  136.     cout << "Untouched Ivan's tasks: ";
  137.     PrintTasksInfo(untouched_tasks);
  138.  
  139.     tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
  140.     cout << "Updated Ivan's tasks: ";
  141.     PrintTasksInfo(updated_tasks);
  142.     cout << "Untouched Ivan's tasks: ";
  143.     PrintTasksInfo(untouched_tasks);
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement