【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;}};#endif1.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();};#endif1.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++的道路上越走越远!
全系列完结🎊