当前位置: 首页 > article >正文

C++课设:高效的日程管理系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《编程项目实战》

目录

    • 一、C++日程管理系统的时代价值
      • 1. 为什么选择C++开发日程管理系统?
      • 2. 现代日程管理的核心需求
    • 二、系统功能架构全景
      • 1. 核心功能模块设计
      • 2. 数据结构设计思路
    • 三、核心代码实现揭秘
      • 1. Task类的精妙设计
      • 2. ScheduleManager类的系统控制
      • 3. 完整系统源码
    • 四、关键技术难点突破
      • 1. 数据持久化的优雅实现
      • 2. 时间处理的系统级应用
      • 3. 内存管理与异常安全
    • 五、运行效果展示
      • 1.运行效果展示
      • 2. 功能测试案例
    • 六、总结与未来展望
      • 1. 项目成果总结
      • 2. 学习价值与启发

📅 在快节奏的数字化时代,一个高效的日程管理工具就像你的私人助理,帮你合理安排时间、提升工作效率。本文将带你用C++从零开始构建一个功能完备的日程管理系统,深度解析面向对象设计思想在实际项目中的精妙应用。

一、C++日程管理系统的时代价值

在刚刚结束的2024全球C++及系统软件技术大会上,C++之父Bjarne Stroustrup指出,C++在四十余载的技术变迁中不断拓展其应用边界,近年的编程语言排行榜上,C++一骑绝尘超越Java,并在今年六月领先C语言,居编程语言排行榜第二位。这充分说明了C++在现代软件开发中的重要地位。

1. 为什么选择C++开发日程管理系统?

性能优势:C++编译后直接生成机器码,运行效率极高,非常适合开发需要频繁文件读写和数据处理的系统。

跨平台特性:标准C++库具有良好的跨平台兼容性,一次编写,多平台运行。

面向对象特性:支持封装、继承、多态等现代编程思想,代码结构清晰、易于维护。

开发工具支持:**Dev-C++**作为经典的C++开发环境,轻量级且易于上手,特别适合学习和小型项目开发。

2. 现代日程管理的核心需求

根据最新的需求分析研究,一个实用的日程管理系统应该具备:

  • 任务全生命周期管理:从创建到完成的完整追踪
  • 智能时间提醒:避免重要事项遗忘
  • 多维度查询:按日期、优先级、状态等不同维度检索
  • 数据持久化:确保数据安全可靠保存
  • 用户友好界面:简洁直观的操作体验

二、系统功能架构全景

我们的日程管理系统采用经典的三层架构设计,每一层都有其独特的职责和价值:

在这里插入图片描述

1. 核心功能模块设计

基础功能模块

  • 任务管理:新增、编辑、删除、完成任务
  • 时间提醒:智能检测当日待办事项
  • 日期查询:精确定位特定日期的安排

高级功能模块

  • 🚀 优先级管理:四级优先级分类(低、中、高、紧急)
  • 🚀 多时间维度查看:支持按周、按月统计查看
  • 🚀 数据持久化:自动保存到本地文件

2. 数据结构设计思路

我们使用枚举类型定义优先级,类封装任务属性,向量容器管理任务集合,这种设计既保证了代码的可读性,又提供了良好的扩展性。

enum Priority {LOW = 1,     // 低优先级MEDIUM = 2,  // 中等优先级  HIGH = 3,    // 高优先级URGENT = 4   // 紧急优先级
};

三、核心代码实现揭秘

1. Task类的精妙设计

Task类是整个系统的核心数据结构,采用了典型的面向对象封装思想:

class Task {
private:string title;        // 任务标题string description;  // 详细描述string date;         // 日期 (YYYY-MM-DD)string time;         // 时间 (HH:MM)Priority priority;   // 优先级bool completed;      // 完成状态public:// 构造函数 - 支持完整参数初始化Task(string t, string desc, string d, string tm, Priority p) : title(t), description(desc), date(d), time(tm), priority(p), completed(false) {}// 默认构造函数 - 支持空对象创建Task() : title(""), description(""), date(""), time(""), priority(LOW), completed(false) {}// 获取优先级的可读字符串string getPriorityString() const {switch(priority) {case LOW: return "低";case MEDIUM: return "中";case HIGH: return "高";case URGENT: return "紧急";default: return "未知";}}
};

设计亮点

  • 私有成员变量:保护数据安全,防止外部直接修改
  • 公共接口方法:提供标准化的数据访问方式
  • 默认构造函数:支持容器存储和动态创建
  • 类型安全:使用枚举类型避免魔法数字

2. ScheduleManager类的系统控制

ScheduleManager类负责整个系统的业务逻辑控制,体现了单一职责原则

class ScheduleManager {
private:vector<Task> tasks;    // 任务集合string filename;       // 数据文件名public:ScheduleManager() : filename("schedule.txt") {loadFromFile();    // 构造时自动加载数据}~ScheduleManager() {saveToFile();      // 析构时自动保存数据}// 智能时间提醒功能void checkReminders() {time_t now = time(0);struct tm* timeinfo = localtime(&now);char currentDate[20];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);cout << "\n=== 时间提醒 ===" << endl;bool hasReminder = false;for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {cout << "\n【提醒】今天有任务: " << tasks[i].getTitle() << " (" << tasks[i].getTime() << ")" << endl;hasReminder = true;}}if(!hasReminder) {cout << "今天没有待办任务。" << endl;}}
};

技术特色

  • RAII设计模式:构造函数加载数据,析构函数保存数据
  • STL容器应用:使用vector动态管理任务集合
  • C标准库时间处理time()strftime()处理系统时间

3. 完整系统源码

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <ctime>
#include <iomanip>using namespace std;// 任务优先级枚举
enum Priority {LOW = 1,MEDIUM = 2,HIGH = 3,URGENT = 4
};// 任务类
class Task {
private:string title;string description;string date;        // 格式: YYYY-MM-DDstring time;        // 格式: HH:MMPriority priority;bool completed;public:// 构造函数Task(string t, string desc, string d, string tm, Priority p) : title(t), description(desc), date(d), time(tm), priority(p), completed(false) {}// 默认构造函数Task() : title(""), description(""), date(""), time(""), priority(LOW), completed(false) {}// Getter方法string getTitle() const { return title; }string getDescription() const { return description; }string getDate() const { return date; }string getTime() const { return time; }Priority getPriority() const { return priority; }bool isCompleted() const { return completed; }// Setter方法void setCompleted(bool status) { completed = status; }// 获取优先级字符串string getPriorityString() const {switch(priority) {case LOW: return "低";case MEDIUM: return "中";case HIGH: return "高";case URGENT: return "紧急";default: return "未知";}}// 获取完整的日期时间字符串string getDateTime() const {return date + " " + time;}// 转换为字符串用于文件保存string toString() const {stringstream ss;ss << title << "|" << description << "|" << date << "|" << time << "|" << priority << "|" << completed;return ss.str();}// 从字符串加载任务void fromString(const string& str) {stringstream ss(str);string item;vector<string> items;while(getline(ss, item, '|')) {items.push_back(item);}if(items.size() >= 6) {title = items[0];description = items[1];date = items[2];time = items[3];priority = (Priority)atoi(items[4].c_str());completed = (items[5] == "1");}}
};// 日程管理系统类
class ScheduleManager {
private:vector<Task> tasks;string filename;public:ScheduleManager() : filename("schedule.txt") {loadFromFile();}~ScheduleManager() {saveToFile();}// 添加新任务void addTask() {string title, description, date, time;int priorityChoice;cout << "\n=== 添加新任务 ===" << endl;cout << "任务标题: ";cin.ignore();getline(cin, title);cout << "任务描述: ";getline(cin, description);cout << "日期 (YYYY-MM-DD): ";getline(cin, date);cout << "时间 (HH:MM): ";getline(cin, time);cout << "优先级 (1-低, 2-中, 3-高, 4-紧急): ";cin >> priorityChoice;if(priorityChoice < 1 || priorityChoice > 4) {priorityChoice = 1;}Task newTask(title, description, date, time, (Priority)priorityChoice);tasks.push_back(newTask);cout << "任务添加成功!" << endl;saveToFile();}// 显示所有任务void displayAllTasks() {cout << "\n=== 所有任务 ===" << endl;if(tasks.empty()) {cout << "暂无任务。" << endl;return;}for(size_t i = 0; i < tasks.size(); i++) {displayTask(i);}}// 按日期查看任务void viewTasksByDate() {string searchDate;cout << "\n请输入日期 (YYYY-MM-DD): ";cin.ignore();getline(cin, searchDate);cout << "\n=== " << searchDate << " 的任务 ===" << endl;bool found = false;for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate() == searchDate) {displayTask(i);found = true;}}if(!found) {cout << "该日期没有安排任务。" << endl;}}// 按周查看任务void viewTasksByWeek() {string startDate;cout << "\n请输入周起始日期 (YYYY-MM-DD): ";cin.ignore();getline(cin, startDate);cout << "\n=== 从 " << startDate << " 开始的一周任务 ===" << endl;// 简单实现:显示从起始日期开始的7天内的任务for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate() >= startDate) {displayTask(i);}}}// 按月查看任务void viewTasksByMonth() {string yearMonth;cout << "\n请输入年月 (YYYY-MM): ";cin.ignore();getline(cin, yearMonth);cout << "\n=== " << yearMonth << " 月的任务 ===" << endl;bool found = false;for(size_t i = 0; i < tasks.size(); i++) {if(tasks[i].getDate().substr(0, 7) == yearMonth) {displayTask(i);found = true;}}if(!found) {cout << "该月份没有安排任务。" << endl;}}// 按优先级查看任务void viewTasksByPriority() {cout << "\n=== 按优先级排序的任务 ===" << endl;// 创建任务索引的副本用于排序vector<int> indices;for(size_t i = 0; i < tasks.size(); i++) {indices.push_back(i);}// 按优先级排序(优先级高的在前)for(size_t i = 0; i < indices.size(); i++) {for(size_t j = i + 1; j < indices.size(); j++) {if(tasks[indices[i]].getPriority() < tasks[indices[j]].getPriority()) {swap(indices[i], indices[j]);}}}for(size_t i = 0; i < indices.size(); i++) {displayTask(indices[i]);}}// 完成任务void completeTask() {displayAllTasks();if(tasks.empty()) return;cout << "\n请输入要完成的任务编号: ";int index;cin >> index;if(index >= 1 && index <= (int)tasks.size()) {tasks[index - 1].setCompleted(true);cout << "任务已标记为完成!" << endl;saveToFile();} else {cout << "无效的任务编号!" << endl;}}// 删除任务void deleteTask() {displayAllTasks();if(tasks.empty()) return;cout << "\n请输入要删除的任务编号: ";int index;cin >> index;if(index >= 1 && index <= (int)tasks.size()) {tasks.erase(tasks.begin() + index - 1);cout << "任务已删除!" << endl;saveToFile();} else {cout << "无效的任务编号!" << endl;}}// 时间提醒功能void checkReminders() {time_t now = time(0);struct tm* timeinfo = localtime(&now);char currentDate[20];char currentTime[10];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);strftime(currentTime, 10, "%H:%M", timeinfo);cout << "\n=== 时间提醒 ===" << endl;cout << "当前时间: " << currentDate << " " << currentTime << endl;bool hasReminder = false;for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {cout << "\n【提醒】今天有任务: " << tasks[i].getTitle() << " (" << tasks[i].getTime() << ")" << endl;hasReminder = true;}}if(!hasReminder) {cout << "今天没有待办任务。" << endl;}}private:// 显示单个任务void displayTask(int index) {const Task& task = tasks[index];cout << "\n[" << (index + 1) << "] " << task.getTitle() << endl;cout << "    描述: " << task.getDescription() << endl;cout << "    时间: " << task.getDateTime() << endl;cout << "    优先级: " << task.getPriorityString() << endl;cout << "    状态: " << (task.isCompleted() ? "已完成" : "未完成") << endl;cout << "    " << string(50, '-') << endl;}// 保存到文件void saveToFile() {ofstream file(filename.c_str());if(file.is_open()) {for(size_t i = 0; i < tasks.size(); i++) {file << tasks[i].toString() << endl;}file.close();}}// 从文件加载void loadFromFile() {ifstream file(filename.c_str());if(file.is_open()) {string line;while(getline(file, line)) {if(!line.empty()) {Task task;task.fromString(line);tasks.push_back(task);}}file.close();}}
};// 显示主菜单
void showMenu() {cout << "\n" << string(50, '=') << endl;cout << "         日程安排管理系统" << endl;cout << string(50, '=') << endl;cout << "1. 添加新任务" << endl;cout << "2. 查看所有任务" << endl;cout << "3. 按日期查看任务" << endl;cout << "4. 按周查看任务" << endl;cout << "5. 按月查看任务" << endl;cout << "6. 按优先级查看任务" << endl;cout << "7. 完成任务" << endl;cout << "8. 删除任务" << endl;cout << "9. 时间提醒" << endl;cout << "0. 退出程序" << endl;cout << string(50, '=') << endl;cout << "请选择功能 (0-9): ";
}int main() {ScheduleManager scheduler;int choice;cout << "欢迎使用日程安排管理系统!" << endl;while(true) {showMenu();cin >> choice;switch(choice) {case 1:scheduler.addTask();break;case 2:scheduler.displayAllTasks();break;case 3:scheduler.viewTasksByDate();break;case 4:scheduler.viewTasksByWeek();break;case 5:scheduler.viewTasksByMonth();break;case 6:scheduler.viewTasksByPriority();break;case 7:scheduler.completeTask();break;case 8:scheduler.deleteTask();break;case 9:scheduler.checkReminders();break;case 0:cout << "\n感谢使用日程安排管理系统!再见!" << endl;return 0;default:cout << "\n无效选择,请重新输入!" << endl;break;}cout << "\n按回车键继续...";cin.ignore();cin.get();}return 0;
}

四、关键技术难点突破

1. 数据持久化的优雅实现

挑战:如何确保程序关闭后数据不丢失?

解决方案:采用管道分隔符的文本存储格式

// 数据序列化 - 将对象转换为字符串
string toString() const {stringstream ss;ss << title << "|" << description << "|" << date << "|" << time << "|" << priority << "|" << completed;return ss.str();
}// 数据反序列化 - 从字符串恢复对象
void fromString(const string& str) {stringstream ss(str);string item;vector<string> items;while(getline(ss, item, '|')) {items.push_back(item);}if(items.size() >= 6) {title = items[0];description = items[1];date = items[2];time = items[3];priority = (Priority)atoi(items[4].c_str());completed = (items[5] == "1");}
}

技术亮点

  • 使用stringstream进行字符串流处理
  • getline()函数配合自定义分隔符解析数据
  • atoi()函数实现字符串到整数的类型转换

2. 时间处理的系统级应用

挑战:如何获取系统当前时间并格式化?

解决方案:使用C标准库的时间函数

void checkReminders() {time_t now = time(0);                          // 获取当前时间戳struct tm* timeinfo = localtime(&now);         // 转换为本地时间结构char currentDate[20];strftime(currentDate, 20, "%Y-%m-%d", timeinfo);  // 格式化日期// 比较日期字符串进行提醒判断for(size_t i = 0; i < tasks.size(); i++) {if(!tasks[i].isCompleted() && tasks[i].getDate() == string(currentDate)) {// 执行提醒逻辑}}
}

3. 内存管理与异常安全

设计原则:采用RAII(Resource Acquisition Is Initialization)模式

class ScheduleManager {
public:ScheduleManager() : filename("schedule.txt") {loadFromFile();    // 构造时加载数据}~ScheduleManager() {saveToFile();      // 析构时自动保存数据}
};

优势分析

  • 自动化管理:无需手动调用保存函数
  • 异常安全:即使程序异常退出,析构函数仍会执行
  • 简化接口:用户无需关心底层数据操作

五、运行效果展示

1.运行效果展示

欢迎使用日程安排管理系统!==================================================日程安排管理系统
==================================================
1. 添加新任务
2. 查看所有任务
3. 按日期查看任务
4. 按周查看任务
5. 按月查看任务
6. 按优先级查看任务
7. 完成任务
8. 删除任务
9. 时间提醒
0. 退出程序
==================================================
请选择功能 (0-9): 

在这里插入图片描述

2. 功能测试案例

测试案例1:添加任务

=== 添加新任务 ===
任务标题: 完成C++项目报告
任务描述: 编写项目文档和代码说明
日期 (YYYY-MM-DD): 2024-12-25
时间 (HH:MM): 14:30
优先级 (1-低, 2-中, 3-高, 4-紧急): 3
任务添加成功!

在这里插入图片描述

在这里插入图片描述

测试案例2:时间提醒

=== 时间提醒 ===
当前时间: 2025-06-05 13:13
今天没有待办任务。

在这里插入图片描述

六、总结与未来展望

1. 项目成果总结

通过本项目的开发,我们成功实现了:

技术层面

  • 掌握了C++面向对象编程的核心思想
  • 实践了STL容器的实际应用
  • 学会了文件I/O操作和数据持久化
  • 理解了RAII设计模式的优雅之处

功能层面

  • 构建了完整的任务生命周期管理系统
  • 实现了多维度查询智能排序功能
  • 提供了用户友好的控制台交互界面
  • 保证了数据安全的可靠存储

2. 学习价值与启发

本项目充分体现了C++作为一门成熟的语言,在多个领域(嵌入式系统、高性能计算、图形渲染、游戏开发等)依旧占据重要地位的特点。通过实际项目的开发实践,我们不仅掌握了技术技能,更重要的是培养了系统性思维工程化思维

在2025年技术发展浪潮汹涌澎湃的背景下,C++开发者需要既要深度洞悉前沿趋势,又要将个人兴趣、行业需求、技术潜能等要素纳入考量。本项目提供的不仅是一个完整的代码示例,更是一个学习现代C++开发的实践平台。

最后的话编程之路漫漫修远,愿每一位开发者都能在实践中不断成长,在探索中发现乐趣。如果这个项目对你有帮助,欢迎在评论区分享你的想法和改进建议!

💡 项目地址:完整源码已整理完毕,可直接复制使用
🔧 开发环境:Dev-C++ / Code::Blocks / Visual Studio
📚 学习建议:建议按模块逐步理解代码,重点关注面向对象设计思想的应用

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

http://www.lryc.cn/news/2402199.html

相关文章:

  • 功能测试、性能测试、安全测试详解
  • 提示词指南 --- 提示词的基本结构
  • UI学习—cell的复用和自定义cell
  • 20250605使用boot-repair来恢复WIN10和ubuntu22.04.6双系统的启动
  • 网络安全面试题目(无答案)
  • JavaScript性能优化实战
  • 接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测
  • 视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线
  • sql server如何创建表导入excel的数据
  • 仓库自动化搬运:自动叉车与AGV选型要点及核心技术解析
  • java UDP 模板
  • 【亲测有效】Mybatis-Plus更新字段为null
  • NLP学习路线图(二十五):注意力机制
  • 05 APP 自动化- Appium 单点触控 多点触控
  • MyBatis-Plus LambdaQuery 高级用法:JSON 路径查询与条件拼接的全场景解析
  • [AI绘画]sd学习记录(一)软件安装以及文生图界面初识、提示词写法
  • SpringBoot(八) --- SpringBoot原理
  • SpringBoot自动化部署全攻略:CI/CD高效实践与避坑指南
  • idea json生成实体类
  • C# 类和继承(抽象成员)
  • gitlab rss订阅失败
  • 鸿蒙仓颉语言开发实战教程:商城登录页
  • JavaScript 数组与流程控制:从基础操作到实战应用
  • STM32中自动生成Flash地址的方法
  • Matlab | MATLAB 中的插值详解
  • SkyWalking架构深度解析:分布式系统监控的利器
  • vue2中的render函数
  • 逆向工程开篇(连载中)
  • this.$set() 的用法详解(Vue响应式系统相关)
  • PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献