news 2026/6/22 9:33:44

【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/6/19 10:31:07

【30天精通汇编】Day 1: 计算机基础与二进制

【30天精通汇编】Day 1: 计算机基础与二进制&#x1f4c5; 学习时间&#xff1a;3-4小时 &#x1f3af; 学习目标&#xff1a;理解计算机底层原理&#xff0c;掌握二进制运算 &#x1f4a1; 难度&#xff1a;★☆☆☆☆ &#x1f4cb; 前置要求&#xff1a;零基础可学&#x1f…

作者头像 李华
网站建设 2026/6/22 8:15:51

探秘《Hands on Large Language Models》:开启大模型学习之旅(附教程)

今天要给大家介绍一本在大语言模型领域超有分量的新书 ——《Hands on Large Language Models》。目前已经正式发布&#xff0c;干货满满&#xff0c;绝对能让你抢先一步深入大语言模型的奇妙世界。 当大语言模型遇上 “实战指南” 这几年&#xff0c;大语言模型那可是火得一塌…

作者头像 李华
网站建设 2026/6/22 8:15:15

降AI工具安全吗?论文会被收录吗?2026年隐私保护指南

降AI工具安全吗&#xff1f;论文会被收录吗&#xff1f;2026年隐私保护指南 用降AI工具处理论文&#xff0c;安全吗&#xff1f;会不会被收录到数据库&#xff1f; 这是很多同学担心的问题。毕竟论文是自己的心血&#xff0c;万一被泄露或收录就麻烦了。 这篇文章帮你搞清楚…

作者头像 李华
网站建设 2026/6/22 8:17:50

下载与快速上手 NVM:Node.js 版本管理工具

一、准备工作&#xff1a;卸载旧版 Node.js 重要提示&#xff1a;在安装 NVM 前&#xff0c;请先彻底删除已安装的 Node.js&#xff0c;避免路径冲突&#xff1a;检查安装路径where node常见路径&#xff1a;C:\Program Files\nodejs\ C:\Users\用户名\AppData\Local\nodejs\卸…

作者头像 李华
网站建设 2026/6/22 0:41:57

2026年最新降AI攻略总结:一站搞定论文AIGC检测

2026年最新降AI攻略总结&#xff1a;一站搞定论文AIGC检测 这篇文章是2026年降AI攻略的终极总结。 如果你只想看结论&#xff0c;直接拉到最后。如果想了解细节&#xff0c;继续往下看。 2026年AIGC检测现状 检测平台&#xff1a;知网、维普、万方 红线标准&#xff1a; 本…

作者头像 李华
网站建设 2026/6/15 19:08:04

DeepSeek+豆包+Kimi降AI指令有用吗?2026年实测告诉你真相

DeepSeek豆包Kimi降AI指令有用吗&#xff1f;2026年实测告诉你真相 网上流传着很多"降AI指令"&#xff0c;说用DeepSeek、豆包、Kimi就能把AI率降下来。 我认真测试了一下&#xff0c;结论是&#xff1a;有一定效果&#xff0c;但很有限。 想把AI率从60%降到10%以…

作者头像 李华