news 2026/5/5 21:38:28

【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/4 16:56:23

【30天精通汇编】Day 2: CPU架构与寄存器

【30天精通汇编】Day 2: CPU架构与寄存器&#x1f4c5; 学习时间&#xff1a;4-5小时 &#x1f3af; 学习目标&#xff1a;理解CPU工作原理&#xff0c;掌握x86寄存器 &#x1f4a1; 难度&#xff1a;★★☆☆☆&#x1f4dd; Day 1 练习题答案 练习1&#xff1a; - 10110(二进…

作者头像 李华
网站建设 2026/5/4 23:51:40

维修SEW变频器MC07A110-503-4-01 08282781

SEW变频器 MC07A110-503-4-01 08282781 详细技术解析与应用指南 1. 产品概述与定位 SEW-EURODRIVE是全球领先的驱动技术供应商&#xff0c;其产品广泛应用于自动化、物料输送、工业生产和各种机械设备中。型号 MC07A110-503-4-01 属于SEW MOVIMOT 系列变频器&#xff0c;这是…

作者头像 李华
网站建设 2026/5/5 14:18:05

SEW变频器MC07A450-503-4-01 08283494

SEW变频器 MC07A450-503-4-01 (序列号 08283494) 详细技术解析与应用指南一、 设备概述与型号解读品牌与系列&#xff1a; SEW-EURODRIVE 是国际知名的驱动技术解决方案供应商。该变频器属于 SEW 的 MOVIMOT 系列&#xff0c;该系列以其紧凑型设计、强大的功能和灵活性著称&…

作者头像 李华
网站建设 2026/4/28 2:55:05

13. 数组

1.数组简介 2.数组的访问与遍历 3.多维数组 4.数组的注意事项1.数组简介 1).数组简介数组是C中一种"存储相同数据类型元素的连续内存集合", 可以把它想象成一排编号的储物柜: 每个储物柜(数组元素)类型相同, 有唯一的编号(下标), 且位置连续a.数组的大小在定义时必须…

作者头像 李华
网站建设 2026/5/5 0:55:14

SCI制图——火山图简介(一)

一、什么是火山图&#xff1f;——转录组与蛋白组数据分析的标配图表SCI领域的论文&#xff0c;尤其是涉及转录组测序或蛋白质组学的研究&#xff0c;您一定见过这样一张图&#xff1a;成千上万个散点分布在一个平面上&#xff0c;它们像喷发的岩浆一样向两侧上方扩散&#xff…

作者头像 李华