Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement