#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
0 B
|👍
/👎