Gistrec icon

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

Gistrec | PRO | 12/08/18 08:16:09 PM UTC | 0 ⭐ | 2013 👁️ | Never ⏰ | []
C++ |

5.29 KB

|

None

|

0 👍

/

0 👎

#include <map>
#include <iostream>
#include <tuple>
 
// Перечислимый тип для статуса задачи
enum class TaskStatus {
    NEW,          // новая
    IN_PROGRESS,  // в разработке
    TESTING,      // на тестировании
    DONE          // завершена
};
 
// Объявляем тип-синоним для map<TaskStatus, int>,
// позволяющего хранить количество задач каждого статуса
using TasksInfo = std::map<TaskStatus, int>;
 
 
class TeamTasks {
    std::map<std::string, TasksInfo> db;
public:
    // Получить статистику по статусам задач конкретного разработчика
    const TasksInfo& GetPersonTasksInfo(const std::string& person) const {
        return db.at(person);
    }
 
    // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
    void AddNewTask(const std::string& person) {
        // Если у человека еще нет ни одной задачи
        if (db.count(person) == 0) {
            // Создаем единственную задачу
            db.insert({ person, {{TaskStatus::NEW, 1}, {TaskStatus::IN_PROGRESS, 0 }, {TaskStatus::TESTING, 0 }, {TaskStatus::DONE, 0}} });
        } else {
            // Добавляем одну новую задачу
            db.at(person).at(TaskStatus::NEW)++;
        }
    }
 
    // Обновить статусы по данному количеству задач конкретного разработчика,
    std::tuple<TasksInfo, TasksInfo> PerformPersonTasks(const std::string& person, int task_count) {
        TasksInfo updated;
        TasksInfo other;
 
        // Для всех задач от NEW до TESTING
        for (auto status = static_cast<int>(TaskStatus::NEW); status < static_cast<int>(TaskStatus::DONE); status++) {
            TaskStatus now = static_cast<TaskStatus>(status);      // Текущий статус
            TaskStatus next = static_cast<TaskStatus>(status + 1); // Следующий статус
 
            // Если нет задачь с текущим статусом, переходим к следующему статусу
            if (!db.count(person)) continue;
 
            // Пока нужно обновить статус и есть задачи с текущим статусом
            while (task_count && db.at(person).at(now)) {
                // Если еще нет обновленных задач с таким статусом
                if (!updated.count(next)) updated.insert({ next, 0 });
 
                db.at(person).at(now)--;  // Уменьшаем кол-во задач с текущим статусом
                //db.at(person).at(next)++; // Увеличиваем кол-во задач с следующим статусом
                updated.at(next)++;
                task_count--;
            }
        }
        for (auto taskInfo : db.at(person)) {
            if (taskInfo.first != TaskStatus::DONE) {
                other.insert({ taskInfo.first, taskInfo.second });
            }
        }
        // Добавляем обновившиеся задачи
        for (auto update : updated) {
            db.at(person).at(update.first) += update.second;
        }
        return std::make_tuple(updated, other);
    }
};
 
 
 
 
 
// Принимаем словарь по значению, чтобы иметь возможность
// обращаться к отсутствующим ключам с помощью [] и получать 0,
// не меняя при этом исходный словарь
void PrintTasksInfo(TasksInfo tasks_info) {
    std::cout << tasks_info[TaskStatus::NEW] << " new tasks" <<
        ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" <<
        ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" <<
        ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << std::endl;
}
 
int main() {
    TeamTasks tasks;
 
    for (int i = 0; i < 5; i++) tasks.AddNewTask("Alice");
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    tasks.PerformPersonTasks("Alice", 5);
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    tasks.PerformPersonTasks("Alice", 5);
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    tasks.PerformPersonTasks("Alice", 1);
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    for (int i = 0; i < 5; i++) tasks.AddNewTask("Alice");
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    tasks.PerformPersonTasks("Alice", 2);
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
    tasks.PerformPersonTasks("Alice", 4);
    PrintTasksInfo(tasks.GetPersonTasksInfo("Alice"));
 
    system("pause");
    return 0;
 
    tasks.AddNewTask("Ilia");
    for (int i = 0; i < 3; ++i) {
        tasks.AddNewTask("Ivan");
    }
    std::cout << "Ilia's tasks: ";
    PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"));
    std::cout << "Ivan's tasks: ";
    PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"));
 
    TasksInfo updated_tasks, untouched_tasks;
 
    tie(updated_tasks, untouched_tasks) =
        tasks.PerformPersonTasks("Ivan", 2);
    std::cout << "Updated Ivan's tasks: ";
    PrintTasksInfo(updated_tasks);
    std::cout << "Untouched Ivan's tasks: ";
    PrintTasksInfo(untouched_tasks);
 
    tie(updated_tasks, untouched_tasks) =
        tasks.PerformPersonTasks("Ivan", 2);
    std::cout << "Updated Ivan's tasks: ";
    PrintTasksInfo(updated_tasks);
    std::cout << "Untouched Ivan's tasks: ";
    PrintTasksInfo(untouched_tasks);
 
    system("pause");
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎