简易任务管理器的二次开发与优化

一、引言

在日常学习和工作中,我们经常需要管理各种任务,为了更高效地组织和跟踪这些任务,开发一个简易的任务管理器是一个不错的选择。本文将详细介绍如何从一个基础的任务管理器程序开始,逐步进行二次开发和优化,最终实现一个功能较为完善且用户友好的任务管理工具。

二、基础版本:简易任务管理器

  1. 代码实现
cpp 复制代码
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 任务结构体
struct Task {
    string description;
    bool completed;
};

class TaskManager {
private:
    vector<Task> tasks;

public:
    // 添加任务
    void addTask(const string& task) {
        tasks.push_back({task, false});
    }

    // 删除任务
    void deleteTask(int index) {
        if (index >= 0 && index < tasks.size()) {
            tasks.erase(tasks.begin() + index);
        } else {
            cout << "无效的任务索引" << endl;
        }
    }

    // 查看任务
    void viewTasks() {
        if (tasks.empty()) {
            cout << "没有可用的任务。" << endl;
        } else {
            for (size_t i = 0; i < tasks.size(); ++i) {
                string status = tasks[i].completed ? "已完成" : "未完成";
                cout << i + 1 << ". " << tasks[i].description << " [" << status << "]" << endl;
            }
        }
    }

    // 标记任务为完成
    void markCompleted(int index) {
        if (index >= 0 && index < tasks.size()) {
            tasks[index].completed = true;
        } else {
            cout << "无效的任务索引" << endl;
        }
    }
};

int main() {
    TaskManager tm;
    tm.addTask("购买食品杂货");
    tm.addTask("完成作业");
    tm.viewTasks();
    tm.markCompleted(0);
    tm.viewTasks();
    tm.deleteTask(1);
    tm.viewTasks();
    return 0;
}
  1. 功能解释

    任务结构体 Task:定义了任务的基本属性,包括任务描述 description 和完成状态 completed。

    任务管理器类 TaskManager:

    addTask 方法:用于向任务列表中添加新任务。

    deleteTask 方法:根据传入的任务索引删除指定任务,如果索引无效则给出提示。

    viewTasks 方法:显示所有任务的信息,包括任务描述和完成状态。

    markCompleted 方法:将指定索引的任务标记为已完成,如果索引无效则给出提示。

    main 函数:演示了如何使用 TaskManager 类的基本功能,包括添加任务、查看任务、标记任务完成和删除任务。

    三、二次开发:增加任务优先级和分类

    拓展需求提出

    基础版本虽然能满足基本的任务管理需求,但在实际使用中,我们可能希望对任务进行更细致的分类和优先级设置,以便更好地安排工作。

  2. 代码实现

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 任务结构体
struct Task {
    string description;
    bool completed;
    string priority;
    string category;
};

class TaskManager {
private:
    vector<Task> tasks;

public:
    // 添加任务
    void addTask(const string& task, const string& priority = "中等", const string& category = "通用") {
        tasks.push_back({task, false, priority, category});
    }

    // 删除任务
    void deleteTask(int index) {
        if (index >= 0 && index < tasks.size()) {
            tasks.erase(tasks.begin() + index);
        } else {
            cout << "无效的任务索引" << endl;
        }
    }

    // 查看任务,可按类别和优先级过滤
    void viewTasks(const string& category = "", const string& priority = "") {
        bool found = false;
        for (size_t i = 0; i < tasks.size(); ++i) {
            if ((category.empty() || tasks[i].category == category) &&
                (priority.empty() || tasks[i].priority == priority)) {
                string status = tasks[i].completed ? "已完成" : "未完成";
                cout << i + 1 << ". " << tasks[i].description << " [优先级: " << tasks[i].priority
                     << ", 类别: " << tasks[i].category << ", " << status << "]" << endl;
                found = true;
            }
        }
        if (!found) {
            cout << "没有符合条件的任务。" << endl;
        }
    }

    // 标记任务为完成
    void markCompleted(int index) {
        if (index >= 0 && index < tasks.size()) {
            tasks[index].completed = true;
        } else {
            cout << "无效的任务索引" << endl;
        }
    }
};

void displayMenu() {
    cout << "\n任务管理器" << endl;
    cout << "1. 查看任务" << endl;
    cout << "2. 添加任务" << endl;
    cout << "3. 删除任务" << endl;
    cout << "4. 标记任务为已完成" << endl;
    cout << "5. 退出" << endl;
}

int main() {
    TaskManager tm;
    int choice;
    string task, priority, category;
    int index;

    while (true) {
        displayMenu();
        cout << "请选择一个选项: ";
        cin >> choice;
        cin.ignore(); // 忽略换行符

        switch (choice) {
            case 1:
                cout << "按类别过滤 (留空显示所有): ";
                getline(cin, category);
                cout << "按优先级过滤 (留空显示所有): ";
                getline(cin, priority);
                tm.viewTasks(category, priority);
                break;
            case 2:
                cout << "请输入任务描述: ";
                getline(cin, task);
                cout << "请输入优先级 (高/中等/低): ";
                getline(cin, priority);
                cout << "请输入类别: ";
                getline(cin, category);
                tm.addTask(task, priority, category);
                break;
            case 3:
                cout << "请输入要删除的任务索引: ";
                cin >> index;
                cin.ignore(); // 忽略换行符
                tm.deleteTask(index - 1);
                break;
            case 4:
                cout << "请输入要标记为已完成的任务索引: ";
                cin >> index;
                cin.ignore(); // 忽略换行符
                tm.markCompleted(index - 1);
                break;
            case 5:
                return 0;
            default:
                cout << "无效的选项,请重试。" << endl;
        }
    }

    return 0;
}

代码改进点分析

结构体扩展:在 Task 结构体中新增了 priority(优先级)和 category(类别)两个属性,使得任务信息更加丰富。

addTask 方法改进:支持传入优先级和类别参数,默认优先级为 "中等",默认类别为 "通用",方便用户自定义任务属性。

viewTasks 方法改进:增加了按类别和优先级过滤的功能。用户可以根据需要输入类别和优先级,程序会显示符合条件的任务。若不输入,则显示所有任务。

用户交互界面:新增了 displayMenu 函数,用于显示操作菜单。在 main 函数中,使用 while 循环和 switch 语句实现了一个简单的命令行交互界面,让用户可以方便地选择不同的操作。

总结与展望

开发成果总结

通过二次开发,我们成功地为任务管理器增加了任务优先级和分类功能,并优化了用户交互界面。这使得任务管理器更加灵活和实用,能够更好地满足用户的多样化需求。

未来优化方向

尽管当前的任务管理器已经具备了较为丰富的功能,但仍有一些可以改进的地方。例如,可以考虑添加任务的截止日期,方便用户对任务进行时间管理;实现任务的排序功能,按照优先级、截止日期等进行排序;开发图形用户界面(GUI),提升用户体验。这些改进将进一步提升任务管理器的实用性和易用性。

希望本文的内容能对大家理解程序的二次开发和优化过程有所帮助,也欢迎大家尝试对这个任务管理器进行更多的改进和拓展。