C++学习之路(四)C++ 实现简单的待办事项列表命令行应用 - 示例代码拆分讲解

ToDoApplication:一个简单的待办事项清单Android应用,供用户添加和删除条目 项目1-ToDoApplication ToDoApplication是一个Android应用程序,它允许构建待办事项列表和基本的待办事项管理功能,包括添加新项目,编辑和删除现有项目。 提交者:Sophia Hu 花费时间:总共花费2.5个小时 用户故事 完成以下必需的功能: 用户可以查看待办事项列表 用户可以成功地从待办事项列表中添加和删​​除项目 用户的项目列表在修改后仍然存在,并在应用重新启动后正确检索 实现了以下可选功能: 用户可以点击列表中的待办事项并打开待办事项的编辑屏幕,然后对待办事项列表中显示的文本进行任何更改 实现了以下附加功能: 列出您可以改善应用程序功能的所有其他事情! 视频演练 以下是实现的用户案例的演练: 使用创建的GIF。 笔记 在构建应用程序时遇到的主要挑战是逐渐熟悉Android Studio。 执照 Copyright [2018] [S 立即下载

本期示例介绍:

本期示例《待办事项列表应用》展示了一个简单的任务管理系统,用户可以通过命令行界面执行添加任务、删除任务和显示任务列表等操作。

在这里插入图片描述

功能描述:

  1. 添加任务功能:

    • 用户可以输入任务描述,将新的任务添加到任务列表中。
  2. 删除任务功能:

    • 用户可以输入任务索引号,删除相应索引的任务。
  3. 显示任务列表功能:

    • 显示当前所有任务的索引、完成状态和描述信息。

示例涉及的基础知识点:

  1. 结构体:

    • 示例中的 Task 结构体用于表示任务,包含描述和完成状态。
  2. 向量容器 (std::vector):

    • 用于存储任务列表。std::vector<Task> 保存了 Task 结构体的实例,实现了动态数组的功能,能够动态添加和删除任务。
  3. 命令行交互:

    • 使用 std::cin 和 std::cout 进行命令行输入输出交互,实现了用户和程序的交互。
  4. 函数和模块化设计:

    • 将不同功能的代码块封装成函数,如添加任务、删除任务、显示任务列表等,提高了代码的可读性和可维护性。
  5. 循环 (do-while 循环):

    • 用于提供菜单选项,允许用户多次执行操作,直到选择退出。
  6. 条件语句 (if-else):

    • 用于检查索引的有效性以及其他条件判断,确保操作的有效性。
  7. 字符串处理:

    • 使用 std::string 处理任务描述,使用 std::getline 获取用户输入的完整一行描述信息。

通过这个示例,初学者能够学习如何使用向量容器管理数据,如何进行基本的输入输出交互,以及如何通过结构化设计实现简单的功能模块化。同时也能加深对函数、循环和条件语句等基本概念的理解。

示例在Clion中运行步骤:

1. 新建项目

在这里插入图片描述

2. 粘贴代码
#include <iostream>
#include <vector>

struct Task {
    std::string description;
    bool completed;
};

// 添加任务函数
void addTask(std::vector<Task> &tasks, const std::string &description) {
    Task newTask{description, false};
    tasks.push_back(newTask);
    std::cout << "Task added: " << description << std::endl;
}

// 删除任务函数
void removeTask(std::vector<Task> &tasks, int index) {
    if (index >= 0 && index < tasks.size()) {
        std::cout << "Task removed: " << tasks[index].description << std::endl;
        tasks.erase(tasks.begin() + index);
    } else {
        std::cout << "Invalid task index!" << std::endl;
    }
}

// 显示任务函数
void displayTasks(const std::vector<Task> &tasks) {
    std::cout << "Tasks:" << std::endl;
    for (size_t i = 0; i < tasks.size(); ++i) {
        std::cout << i + 1 << ". ";
        if (tasks[i].completed) {
            std::cout << "[Completed] ";
        }
        std::cout << tasks[i].description << std::endl;
    }
}

int main() {
    std::vector<Task> tasks; // 创建任务列表向量

    char choice;
    do {
        std::cout << "\nTodo List Application\n";
        std::cout << "1. Add Task\n";
        std::cout << "2. Remove Task\n";
        std::cout << "3. Display Tasks\n";
        std::cout << "4. Quit\n";
        std::cout << "Enter your choice: ";
        std::cin >> choice;

        switch (choice) {
            case '1': {
                std::string description;
                std::cout << "Enter task description: ";
                std::cin.ignore(); // 忽略前一个输入的换行符
                std::getline(std::cin, description); // 读取整行输入作为任务描述
                addTask(tasks, description); // 调用添加任务函数
                break;
            }
            case '2': {
                int index;
                std::cout << "Enter task index to remove: ";
                std::cin >> index;
                removeTask(tasks, index - 1); // 调用删除任务函数
                break;
            }
            case '3':
                displayTasks(tasks); // 调用显示任务函数
                break;
            case '4':
                std::cout << "Exiting...\n";
                break;
            default:
                std::cout << "Invalid choice!\n";
                break;
        }
    } while (choice != '4'); // 循环直到用户选择退出

    return 0;
}

3. 编译运行
先编译一下,看有没有错误

在这里插入图片描述

没有错误的话,就开始运行

在这里插入图片描述


代码拆解,知识点总结

让我们来拆分讲解一下这个待办事项列表应用,我们可以逐步解释每个部分的作用和实现。

🟥 首先,看一下头文件

#include <iostream>
#include <vector>

这部分是包含了所需的标准库头文件:

  • <iostream>:用于输入输出操作。
  • <vector>:包含了向量容器的定义,用于存储任务列表。

🟥 任务结构体

struct Task {
    std::string description;
    bool completed;
};

这个结构体定义了一个任务,包含了任务的描述和完成状态。

🟥 添加任务函数

void addTask(std::vector<Task> &tasks, const std::string &description) {
    Task newTask{description, false};
    tasks.push_back(newTask);
    std::cout << "Task added: " << description << std::endl;
}

这个函数用于向任务列表中添加新任务,将新任务的描述和完成状态初始化后,添加到任务列表中,并输出添加成功的消息。

📢 Tips: tasks.push_back 是什么意思?
当使用 `std::vector` 时,`push_back()` 是用于向向量末尾添加新元素的成员函数。

- **`push_back()`:**
  - `push_back()` 是 `std::vector` 中用于在向量末尾添加新元素的函数。
  - 该函数接受一个参数,即要添加的新元素。
  - 它将新元素添加到向量的末尾,向量大小增加一个单位。
  - 对于基本数据类型或自定义类型,都可以使用 `push_back()` 将其添加到 `std::vector` 中。

在这个例子中,`push_back()` 将新任务(由参数 `description` 创建的 `Task` 结构体对象)添加到了 `tasks` 向量的末尾,实现了向任务列表中添加新任务的功能。

🟥 删除任务函数

void removeTask(std::vector<Task> &tasks, int index) {
    if (index >= 0 && index < tasks.size()) {
        std::cout << "Task removed: " << tasks[index].description << std::endl;
        tasks.erase(tasks.begin() + index);
    } else {
        std::cout << "Invalid task index!" << std::endl;
    }
}

这个函数用于从任务列表中删除指定索引的任务,首先检查索引的有效性,然后删除对应索引的任务,并输出删除成功或失败的消息。

📢 Tips: tasks.erase、tasks.begin 是什么意思?
当使用 `std::vector` 时,`erase()` 和 `begin()` 是两个常用的函数和迭代器。

- **`tasks.erase()`:**
  - `erase()` 是 `std::vector` 中用于删除元素的成员函数。它能够删除指定位置的元素,或是一定范围内的元素。
  - `tasks.erase(iterator)`:这个函数版本接受一个迭代器作为参数,用于删除指定位置的元素。例如,`tasks.erase(tasks.begin() + index)` 将删除位于 `index` 索引位置的元素。
  - 如果要删除一定范围内的元素,可以使用两个迭代器来指定范围,比如 `tasks.erase(tasks.begin() + startIndex, tasks.begin() + endIndex)`,它会删除从 `startIndex` 到 `endIndex - 1` 索引位置的元素。

- **`tasks.begin()`:**
  - `begin()` 是 `std::vector` 的成员函数,返回指向容器第一个元素的迭代器。
  - `tasks.begin()` 返回一个迭代器,指向 `tasks` 容器的第一个元素。
  - 迭代器是用于在容器中定位和遍历元素的对象。在 `std::vector` 中,迭代器允许你访问和操作容器中的元素,如删除、修改或遍历等。

在上述示例中,`tasks.erase(tasks.begin() + index)` 这行代码中的 `tasks.begin() + index` 返回了一个指向 `tasks` 容器中第 `index` 位置的迭代器。然后 `erase()` 函数使用这个迭代器来删除对应位置的元素,实现了删除任务的功能。

🟥 显示任务函数

void displayTasks(const std::vector<Task> &tasks) {
    std::cout << "Tasks:" << std::endl;
    for (size_t i = 0; i < tasks.size(); ++i) {
        std::cout << i + 1 << ". ";
        if (tasks[i].completed) {
            std::cout << "[Completed] ";
        }
        std::cout << tasks[i].description << std::endl;
    }
}

这个函数用于显示当前的任务列表,遍历所有任务并输出任务的索引、完成状态和描述信息。

🟥 主函数

int main() {
    std::vector<Task> tasks; // 创建任务列表向量

    // ...(菜单选项交互)
    
    return 0;
}

在主函数中,我们创建了一个空的任务列表向量,并提供了菜单选项的交互,允许用户添加任务、删除任务或显示任务列表。根据用户的选择,调用相应的函数执行对应的操作,直到用户选择退出。

本次的拆分讲解帮助我们理解了每个函数的作用,以及如何通过结构化的方式实现待办事项列表应用的基本功能。


本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 🎆。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇。

Origin作图——等高线图 最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。 阅读详情

相关推荐

FreeSWITCH彩铃与回铃音区别详解:从183/180信令到mod_da2检测模块

本文深入解析FreeSWITCH中彩铃与回铃音的技术差异,从183/180信令机制到mod_da2智能检测模块的实现原理。通过对比SIP协议中的早期媒体传输、回铃音补偿技术及实战案例,帮助开发者掌握VoIP系统中的关键音频处理技术,提升呼叫系统稳定性和用户体验。

tree8的博客 349

示例代码:安卓版每日待办事项

接下来,您需要创建一个待办事项的数据模型。您可以创建一个TodoItem类,其中包含待办事项的名称、类型和完成状态。现在,您可以在您的应用程序中使用TodoDatabaseHelper类来添加、获取、更新和删除待办事项。但是,我可以提供一些基本的代码示例,帮助您开始编写您的应用程序。接下来,您需要创建一个SQLite数据库帮助程序类,用于创建和管理待办事项数据库。您可以在您的活动中使用RecyclerView和CheckBox来显示待办事项列表。这是一个非常基本的示例,您可以根据您的需求进行修改和扩展。

苔原之家 844

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5748

构建一个待办事项列表(To-Do List)应用程序

这个待办事项列表应用程序展示了如何使用JavaScript来操作DOM、处理用户输入和事件,以及实现基本的应用程序逻辑。虽然这个例子相对简单,但它涵盖了很多在构建更复杂的Web应用程序时会用到的基本概念和技术。通过学习和实践这些技术,你可以逐渐掌握如何使用JavaScript来创建功能丰富、交互性强的Web应用程序。

geng1025的博客 1714

使用 FastAPI 构建高性能异步接口服务(含完整项目示例)

python复制编辑python复制编辑= 1: raise HTTPException(status_code=404, detail="用户不存在")特性FastAPI 支持情况类型注解✅自动文档✅异步支持✅ORM 集成✅(推荐 SQLModel)性能✅ 极高FastAPI 是你构建现代化、高性能 Python Web 应用的首选框架!

2501_92823525的博客 1302

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1255

第7天:Python的web自动化学习(七)项目实战——制作一个简单的待办事项管理器

待办事项管理器是一种常见的应用程序,它可以帮助用户记录和管理待完成的任务。我们的项目旨在创建一个简单易用、具有基本功能的待办事项管理器。通过本文的介绍,我们了解了如何使用Python创建一个简单的待办事项管理器。该项目涉及到了Python的基础知识和一些常用的库,如Tkinter和SQLite3。通过这个项目的实现,希望读者对Python的应用有一个更深入的理解,并能够根据自己的需求进行扩展和优化。

weixin_49097920的博客 569

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 566

【vue3面试题】编写一个简单的待办事项列表

要编辑已有任务,可以先双击任务文本,将该任务设置为“编辑”状态,此时任务文本会转换为一个文本框,让用户可以输入新的任务文本。在列表项中,我们使用了复选框来标记任务的完成状态,它的绑定值为todo.completed。在上述代码中,我们使用computed函数来创建一个计算属性completedCount,用于计算已完成的任务数量。上面的代码创建了一个简单的待办事项列表,包括一个表单来添加新任务,一个列表来显示当前所有任务,以及一个计数器来显示已完成的任务数量。函数来缓存计算结果,避免了不必要的计算。

小创果技术交流博客 1517

Megatron-LM深度解析:万亿参数大模型的3D并行训练之道

训练框架,采用创新的"层内模型并行"设计,通过将Transformer层的计算拆分到多个GPU上并行执行,显著提升训练效率。该系统支持3D并行策略(数据并行、张量并行、流水线并行)和序列并行等新技术,成功应用于训练5300亿参数的MT-NLG模型。相比DeepSpeed、TPU GSPMD等框架,Megatron-LM在NVIDIA GPU上展现出卓越性能,并与TensorRT等工具深度集成,形成从训练到部署的完整解决方案。该项目持续演进,已成为大模型训练的重要基准。

数据与算法架构提升之路专栏 2091

YOLO26原创自研: 魔改Bottleneck,具备多尺度和特征通道融合的结构

魔改Bottleneck,具备多尺度和特征通道融合的结构,该模型在检测准确性方面都取得了良好的效果,尤其在缺陷检测方向。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 317

C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解

本期文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。创建文件 (用户可以输入文件名和内容,创建新的文件。读取文件 (readFile()用户可以输入文件名,读取并显示文件的内容。追加文件内容 (用户可以输入文件名和内容,将新内容追加到已存在的文件末尾。删除文件 (用户可以输入文件名,删除指定的文件。当我们拆分讲解这个文件管理系统示例时,可以按照功能模块来逐步解释每个部分的作用和实现。

天河书阁 - VicRestart 903

公开 学生课堂行为数据集 SCB-Dataset: A Dataset for Detecting Student and Teacher Classroom Behavior

公开 学生课堂行为数据集 SCB-Dataset Student Classroom Behavior dataset

CSPhD-winston的博客 1万+

C++学习之路(六)C++ 实现简单的工具箱系统命令行应用 - 示例代码拆分讲解

这个示例提供了一个基础框架,能够让用户扩展和添加新的工具到工具箱中,并在运行时选择和执行这些工具。它展示了如何使用面向对象的思想创建可扩展的程序结构,并利用 C++ 的特性和标准库来实现这一点。

天河书阁 - VicRestart 1226

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++学习之路(十二)C++ 用Qt5实现一个工具箱(增加一个XML文本格式化功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《进制转换器功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 XML文本格式化 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 674

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++学习(三)构建代码库(范围,命名空间,转发声明,代码拆分)

在 C++ 中,命名空间是一个命名范围或容器,用于组织和包含代码元素的集合,例如变量、函数、类和其他命名空间。在 C++ 中,代码拆分通常是通过使用单独的编译、头文件和源文件来实现的。命名空间是 C++ 中的一种工具,它通过为您创建的不同标识符(如函数、类和变量)提供命名范围来组织您的代码。一致的代码格式和缩进在构建代码库方面起着至关重要的作用,使您和其他开发人员更容易阅读和理解代码库。构建代码库是软件开发的重要组成部分,它涉及组织和模块化您的代码,以使其更易于维护、更高效和更易于理解。

solomonzw的博客 1028

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

11.1 C++ STL 应用字典与列表

C++ STL 标准模板库提供了丰富的容器和算法,这些模板可以灵活组合使用,以满足不同场景下的需求。本章内容将对前面学习的知识进行总结,并重点讲解如何灵活使用STL中的vector和map容器,以及如何结合不同的算法进行组合。 通过灵活组合使用这些容器和算法,能够满足不同场景下的需求,实现高效的数据处理和操作。STL的设计思想是将数据结构和算法进行分离,使得开发者能够更加专注于解决问题,提高了代码的可读性和可维护性。因此,掌握STL的使用技巧对于C++程序员来说是非常重要的。

微软技术分享 1万+

C++学习之路(十三)C++ 用Qt5实现一个工具箱(增加一个Base64加解密功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《XML文本格式化功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 Base64加解密 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1268

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。

天河书阁 - VicRestart 2596

C++ 学习笔记【基础篇】

C++ 学习笔记【基础篇】

qq_54900679的博客 2057

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能,就是增加托盘图标并且增加显示和退出菜单(越来越像回事了吧 😁 )。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1379

C++:实现演示命令行参数的检索(附带源码)

C++:实现演示命令行参数的检索(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1325

C++学习之路(十八)C++ 用Qt5实现一个工具箱(点击按钮以新窗口打开功能面板)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《增加托盘图标并且增加显示和退出菜单》功能。今天我们把按钮打开功能的方式改一改,让点击按钮以新窗口打开功能面板。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1300

C++学习之路(十四)C++ 用Qt5实现一个工具箱(增加一个Base64图片编码预览功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《Base64加解密功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 Base64图片预览 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 991

C++学习之路(十六)C++ 用Qt5实现一个工具箱(为屏幕颜色提取功能增加一个点击复制的功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《颜色代码转换和屏幕颜色提取功能》功能。今天我们把屏幕颜色提取的功能再扩展一下,让它可以点击复制吧。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。

天河书阁 - VicRestart 1102

【GESP2409六级】小杨和整数拆分 算法学习

【GESP2409六级】小杨和整数拆分 算法学习

青少年趣味编程 1251
上一篇: 什么是 Jest ? Vue2 如何使用 Jest 进行单元测试?Vue2 使用 Jest 开发单元测试实例
下一篇: C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天河书阁 VicRestart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值