news 2026/5/10 22:19:11

【20天学C++】Day 20: 综合项目与进阶

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【20天学C++】Day 20: 综合项目与进阶

【20天学C++】Day 20: 综合项目与进阶

📅 学习时间:5-6小时
🎯 学习目标:综合运用所学知识,了解进阶方向
💡 难度:★★★★☆


1. 综合项目:简易学生管理系统

1.1 项目结构

StudentManager/ Student.h // 学生类 StudentManager.h // 管理器类 StudentManager.cpp // 管理器实现 main.cpp // 主程序 students.txt // 数据文件

1.2 Student.h

#ifndefSTUDENT_H#defineSTUDENT_H#include<string>#include<iostream>classStudent{private:intid;std::string name;intage;doublescore;public:Student():id(0),name(""),age(0),score(0){}Student(intid,conststd::string&name,intage,doublescore):id(id),name(name),age(age),score(score){}// GettersintgetId()const{returnid;}std::stringgetName()const{returnname;}intgetAge()const{returnage;}doublegetScore()const{returnscore;}// SettersvoidsetId(intid){this->id=id;}voidsetName(conststd::string&name){this->name=name;}voidsetAge(intage){this->age=age;}voidsetScore(doublescore){this->score=score;}// 显示信息voiddisplay()const{std::cout<<"学号: "<<id<<", 姓名: "<<name<<", 年龄: "<<age<<", 成绩: "<<score<<std::endl;}// 序列化friendstd::ostream&operator<<(std::ostream&os,constStudent&s){os<<s.id<<" "<<s.name<<" "<<s.age<<" "<<s.score;returnos;}friendstd::istream&operator>>(std::istream&is,Student&s){is>>s.id>>s.name>>s.age>>s.score;returnis;}};#endif

1.3 StudentManager.h

#ifndefSTUDENT_MANAGER_H#defineSTUDENT_MANAGER_H#include"Student.h"#include<vector>#include<memory>#include<optional>#include<fstream>#include<algorithm>classStudentManager{private:std::vector<std::unique_ptr<Student>>students;std::string filename;public:explicitStudentManager(conststd::string&file="students.txt");~StudentManager();// 添加学生voidaddStudent(intid,conststd::string&name,intage,doublescore);// 删除学生boolremoveStudent(intid);// 查找学生std::optional<Student*>findById(intid);std::vector<Student*>findByName(conststd::string&name);// 修改学生boolupdateStudent(intid,conststd::string&name,intage,doublescore);// 显示所有voiddisplayAll()const;// 排序voidsortByScore(boolascending=false);voidsortByName();// 统计doublegetAverageScore()const;Student*getTopStudent()const;intgetCount()const;// 文件操作voidsaveToFile();voidloadFromFile();};#endif

1.4 StudentManager.cpp

#include"StudentManager.h"#include<iostream>StudentManager::StudentManager(conststd::string&file):filename(file){loadFromFile();}StudentManager::~StudentManager(){saveToFile();}voidStudentManager::addStudent(intid,conststd::string&name,intage,doublescore){// 检查ID是否重复if(findById(id).has_value()){std::cout<<"学号已存在!"<<std::endl;return;}students.push_back(std::make_unique<Student>(id,name,age,score));std::cout<<"添加成功!"<<std::endl;}boolStudentManager::removeStudent(intid){autoit=std::remove_if(students.begin(),students.end(),[id](constauto&s){returns->getId()==id;});if(it!=students.end()){students.erase(it,students.end());std::cout<<"删除成功!"<<std::endl;returntrue;}std::cout<<"未找到该学生!"<<std::endl;returnfalse;}std::optional<Student*>StudentManager::findById(intid){for(auto&s:students){if(s->getId()==id){returns.get();}}returnstd::nullopt;}std::vector<Student*>StudentManager::findByName(conststd::string&name){std::vector<Student*>result;for(auto&s:students){if(s->getName().find(name)!=std::string::npos){result.push_back(s.get());}}returnresult;}boolStudentManager::updateStudent(intid,conststd::string&name,intage,doublescore){autostudent=findById(id);if(student.has_value()){(*student)->setName(name);(*student)->setAge(age);(*student)->setScore(score);std::cout<<"修改成功!"<<std::endl;returntrue;}std::cout<<"未找到该学生!"<<std::endl;returnfalse;}voidStudentManager::displayAll()const{if(students.empty()){std::cout<<"暂无学生信息"<<std::endl;return;}std::cout<<"\n========== 学生列表 =========="<<std::endl;for(constauto&s:students){s->display();}std::cout<<"==============================\n"<<std::endl;}voidStudentManager::sortByScore(boolascending){std::sort(students.begin(),students.end(),[ascending](constauto&a,constauto&b){returnascending?a->getScore()<b->getScore():a->getScore()>b->getScore();});}voidStudentManager::sortByName(){std::sort(students.begin(),students.end(),[](constauto&a,constauto&b){returna->getName()<b->getName();});}doubleStudentManager::getAverageScore()const{if(students.empty())return0;doublesum=0;for(constauto&s:students){sum+=s->getScore();}returnsum/students.size();}Student*StudentManager::getTopStudent()const{if(students.empty())returnnullptr;autoit=std::max_element(students.begin(),students.end(),[](constauto&a,constauto&b){returna->getScore()<b->getScore();});returnit->get();}intStudentManager::getCount()const{returnstudents.size();}voidStudentManager::saveToFile(){std::ofstreamfile(filename);if(!file){std::cerr<<"无法保存文件!"<<std::endl;return;}for(constauto&s:students){file<<*s<<"\n";}}voidStudentManager::loadFromFile(){std::ifstreamfile(filename);if(!file)return;Student s;while(file>>s){students.push_back(std::make_unique<Student>(s));}}

1.5 main.cpp

#include"StudentManager.h"#include<iostream>#include<limits>usingnamespacestd;voidshowMenu(){cout<<"\n======= 学生管理系统 ======="<<endl;cout<<"1. 添加学生"<<endl;cout<<"2. 删除学生"<<endl;cout<<"3. 查找学生"<<endl;cout<<"4. 修改学生"<<endl;cout<<"5. 显示所有"<<endl;cout<<"6. 按成绩排序"<<endl;cout<<"7. 统计信息"<<endl;cout<<"0. 退出系统"<<endl;cout<<"============================"<<endl;cout<<"请选择: ";}voidclearInput(){cin.clear();cin.ignore(numeric_limits<streamsize>::max(),'\n');}intmain(){StudentManager manager;intchoice;while(true){showMenu();cin>>choice;if(cin.fail()){clearInput();cout<<"无效输入!"<<endl;continue;}switch(choice){case1:{intid,age;string name;doublescore;cout<<"输入学号: ";cin>>id;cout<<"输入姓名: ";cin>>name;cout<<"输入年龄: ";cin>>age;cout<<"输入成绩: ";cin>>score;manager.addStudent(id,name,age,score);break;}case2:{intid;cout<<"输入要删除的学号: ";cin>>id;manager.removeStudent(id);break;}case3:{intid;cout<<"输入要查找的学号: ";cin>>id;autostudent=manager.findById(id);if(student.has_value()){(*student)->display();}else{cout<<"未找到!"<<endl;}break;}case4:{intid,age;string name;doublescore;cout<<"输入学号: ";cin>>id;cout<<"输入新姓名: ";cin>>name;cout<<"输入新年龄: ";cin>>age;cout<<"输入新成绩: ";cin>>score;manager.updateStudent(id,name,age,score);break;}case5:manager.displayAll();break;case6:manager.sortByScore();manager.displayAll();break;case7:cout<<"学生总数: "<<manager.getCount()<<endl;cout<<"平均分: "<<manager.getAverageScore()<<endl;if(autotop=manager.getTopStudent()){cout<<"最高分: ";top->display();}break;case0:cout<<"再见!"<<endl;return0;default:cout<<"无效选择!"<<endl;}}return0;}

2. 知识点回顾

本项目综合运用了:

[基础语法] - 类与对象 - 封装(private/public) - 构造函数与析构函数 [面向对象] - 运算符重载(<<, >>) - 成员函数 [现代C++] - 智能指针(unique_ptr) - 范围for循环 - Lambda表达式 - auto类型推导 - std::optional [STL] - vector容器 - algorithm算法(sort, remove_if, max_element) [文件操作] - fstream读写文件

3. 进阶学习方向

3.1 深入学习方向

1. 设计模式 - 单例、工厂、观察者、策略等 - 推荐书籍:《Head First设计模式》 2. 模板元编程 - SFINAE, 类型萃取 - 编译期计算 3. 性能优化 - 内存布局 - 缓存友好 - 无锁编程 4. 系统编程 - 网络编程(socket, asio) - 系统调用

3.2 实战项目建议

1. 初级项目 - 简易计算器 - 通讯录管理 - 文件管理器 2. 中级项目 - 简易数据库 - HTTP服务器 - 聊天程序 3. 高级项目 - 游戏引擎组件 - 编译器/解释器 - 高性能网络框架

3.3 推荐资源

书籍: - 《C++ Primer》- 入门经典 - 《Effective C++》- 进阶必读 - 《深度探索C++对象模型》- 底层原理 - 《C++并发编程实战》- 多线程 在线资源: - cppreference.com - 标准库参考 - learncpp.com - 教程 - godbolt.org - 编译器探索

4. 20天学习总结

Week 1: 基础入门 Day 1-3: 环境、语法、函数 Week 2: 面向对象 Day 4-8: 类、构造函数、运算符重载 Week 3: 继承与多态 Day 9-11: 继承、虚函数、模板 Week 4: STL与现代C++ Day 12-14: 容器、算法、迭代器 Day 15-16: 异常、智能指针 Day 17-19: C++11/14/17、多线程 Week 5: 实战 Day 20: 综合项目

5. 下一步行动

1. 复习20天的内容,确保理解 2. 完成每天的练习题 3. 动手实现综合项目 4. 选择一个感兴趣的方向深入 5. 持续练习,多写代码!

🎉 恭喜你完成20天C++学习!

编程是一项需要不断练习的技能。学完这20天只是开始,真正的成长来自于持续的实践和项目经验。

祝你在C++的道路上越走越远!


全系列完结🎊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 11:12:03

GB/T4996-2025相较于GB/T4996-2014版的核心区别如下

1. 名称与范围标准名称简化为《平托盘 试验方法》&#xff0c;删除 “联运通用”。适用范围扩展&#xff0c;不再限定公路、铁路、水路联运&#xff0c;覆盖所有平托盘设计、生产、检验及使用。2. 术语与定义更改 “平托盘”“额定载荷” 等 10 个术语定义&#xff0c;新增 “叉…

作者头像 李华
网站建设 2026/5/1 10:33:39

硕士博士论文AI率要求是多少?2026年标准及降AI攻略

硕士博士论文AI率要求是多少&#xff1f;2026年标准及降AI攻略 最近很多研究生问我&#xff1a;硕士/博士论文的AI率要求是多少&#xff1f; 各学校标准不完全一样&#xff0c;但大致范围是明确的。这篇文章帮你搞清楚2026年的标准&#xff0c;以及怎么达标。 2026年AI率标准…

作者头像 李华
网站建设 2026/5/10 17:01:13

Mutil-Agent的终极秘密武器:上下文工程(Context Engineering)

随着大语言模型&#xff08;LLM&#xff09;和代理框架的发展&#xff0c;人们越来越意识到「上下文」对代理行为的重要性。代理不仅需要用户的指令&#xff0c;还需要外部知识、工具反馈等信息才能完成复杂任务。所谓“上下文工程”就是在有限的上下文窗口内&#xff0c;为代理…

作者头像 李华
网站建设 2026/5/9 22:16:15

你的项目适合哪种架构?大模型4大应用模式深度解析与选择指南

过去一年&#xff0c;大模型彻底改变了我们对“智能”的认知。它不仅能生成文本、写代码、画图谱、出策略&#xff0c;甚至能承担起助理、客服、分析师等角色。但真正让大模型“落地”的关键&#xff0c;并不只是模型本身的强大&#xff0c;而在于它如何被用起来。 本篇文章&a…

作者头像 李华