Menu
CoddyTech

完善工具

本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 22 课,共 56 课。

challenge icon

挑战

简单

通过实现将所有功能串联起来的主程序循环,完成你的任务列表工具。这最后一课会创建一个功能完整的任务管理应用,它会反复显示菜单并处理用户命令,直到用户选择退出。

将提供以下输入:

  • 一系列菜单选项(整数:1 表示添加任务,2 表示查看任务,3 表示移除任务,4 表示退出)
  • 对于添加任务(选项 1):表示任务描述的字符串
  • 对于移除任务(选项 3):表示要移除的任务编号的整数(索引从 1 开始)

你的程序应当:

  1. 使用与前几课相同的设置开始(创建一个名为 tasks 的空 std::vector<std::string>,并显示欢迎消息)
  2. 创建一个主循环,在用户选择退出之前持续运行
  3. 每次循环迭代时显示菜单并读取用户的选项
  4. 处理每个菜单选项:
    • 选项 1:读取任务描述,并使用 push_back() 添加任务
    • 选项 2:以编号形式显示所有任务;如果列表为空,则显示 "No tasks available."
    • 选项 3:读取任务编号,验证编号,并使用 .erase() 移除任务
    • 选项 4:退出程序循环
  5. 如果菜单选项无效,则显示错误消息并继续循环
  6. 用户退出时显示告别消息

使用以下确切的输出格式:

初始设置和菜单显示:

Welcome to Task List Tool!

Menu Options:
1. Add Task
2. View Tasks
3. Remove Task
4. Quit

Task list system initialized and ready!

每次菜单循环迭代时,显示:

Choose an option: 

添加任务(选项 1)时:

Task "[task description]" added successfully!
Total tasks: [number of tasks]

查看任务(选项 2),且列表中有任务时:

Your Tasks:
1. [first task]
2. [second task]
...
Total tasks: [number of tasks]

查看任务(选项 2),且列表为空时:

No tasks available.

移除任务(选项 3),且任务编号有效时:

Task "[removed task description]" removed successfully!
Remaining Tasks:
1. [first remaining task]
...
Total tasks: [updated number of tasks]

移除任务(选项 3),且任务编号无效时:

Error: Invalid task number. Please enter a number between 1 and [total tasks].

菜单选项无效时:

Invalid choice. Please try again.

用户退出时(选项 4):

Thank you for using Task List Tool!

使用一个 while 循环,在用户输入 4 之前持续运行。实现移除任务功能时,请记得先验证任务编号是否在 1 到 tasks.size() 之间,再使用 tasks.erase(tasks.begin() + index)。如果移除后列表变为空,请打印 "No tasks remaining.",而不是剩余任务列表。

亲手试试

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> tasks;
    
    std::cout << "Welcome to Task List Tool!" << std::endl;
    std::cout << std::endl;
    std::cout << "Menu Options:" << std::endl;
    std::cout << "1. Add Task" << std::endl;
    std::cout << "2. View Tasks" << std::endl;
    std::cout << "3. Quit" << std::endl;
    std::cout << std::endl;
    std::cout << "Task list system initialized and ready!" << std::endl;
    
    int n;
    std::cin >> n;
    std::cin.ignore();
    
    for (int i = 0; i < n; i++) {
        std::string task;
        std::getline(std::cin, task);
        tasks.push_back(task);
    }
    
    int taskNumber;
    std::cin >> taskNumber;
    
    if (taskNumber < 1 || taskNumber > tasks.size()) {
        std::cout << "Error: Invalid task number. Please enter a number between 1 and " << tasks.size() << "." << std::endl;
    } else {
        std::string removedTask = tasks[taskNumber - 1];
        tasks.erase(tasks.begin() + (taskNumber - 1));
        
        std::cout << "Task \"" << removedTask << "\" removed successfully!" << std::endl;
        
        if (tasks.empty()) {
            std::cout << "No tasks remaining." << std::endl;
        } else {
            std::cout << "Remaining Tasks:" << std::endl;
            for (int i = 0; i < tasks.size(); i++) {
                std::cout << (i + 1) << ". " << tasks[i] << std::endl;
            }
        }
        
        std::cout << "Total tasks: " << tasks.size() << std::endl;
    }
    
    return 0;
}

逻辑与流程中的所有课

自己练习: C++ 在线编译器