Advertisement
thouxanbanuno

asd

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