Gistrec

Трекер задач [задача]

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