C++学生管理系统实战教程
一、项目需求
- 学生信息:学号、姓名、年龄、成绩
- 功能列表:
- 添加学生
- 删除学生(按学号)
- 修改学生信息
- 按学号查询
- 显示所有学生
- 按成绩排序
- 信息保存到文件
- 从文件加载数据
- 技术栈:
vector:存储学生主体数据map:学号快速索引string:字符串处理sort:自定义排序fstream:文件持久化- 类与对象封装
二、完整代码实现
#include <iostream> #include <vector> #include <map> #include <string> #include <algorithm> #include <fstream> #include <iomanip> using namespace std; // 学生结构体 struct Student { string id; // 学号 string name; // 姓名 int age; // 年龄 double score; // 成绩 }; // 学生管理类 class StudentManager { private: vector<Student> stuList; // 主存储 map<string, int> idIndex; // 学号 -> 下标索引 // 更新索引 void updateIndex() { idIndex.clear(); for (int i = 0; i < stuList.size(); ++i) { idIndex[stuList[i].id] = i; } } public: // 添加学生 void addStudent(const Student& stu) { if (idIndex.find(stu.id) != idIndex.end()) { cout << "【错误】该学号已存在!" << endl; return; } stuList.push_back(stu); updateIndex(); cout << "【成功】学生添加完成!" << endl; } // 删除学生 void deleteStudent(const string& id) { if (idIndex.find(id) == idIndex.end()) { cout << "【错误】该学号不存在!" << endl; return; } int idx = idIndex[id]; stuList.erase(stuList.begin() + idx); updateIndex(); cout << "【成功】学生删除完成!" << endl; } // 修改学生 void modifyStudent(const string& id) { if (idIndex.find(id) == idIndex.end()) { cout << "【错误】该学号不存在!" << endl; return; } int idx = idIndex[id]; Student& stu = stuList[idx]; cout << "请输入新姓名:"; cin >> stu.name; cout << "请输入新年龄:"; cin >> stu.age; cout << "请输入新成绩:"; cin >> stu.score; cout << "【成功】信息修改完成!" << endl; } // 按学号查询 void searchById(const string& id) { if (idIndex.find(id) == idIndex.end()) { cout << "【错误】该学号不存在!" << endl; return; } int idx = idIndex[id]; Student& stu = stuList[idx]; showOne(stu); } // 显示单个学生 void showOne(const Student& stu) { cout << left << setw(10) << stu.id << setw(10) << stu.name << setw(6) << stu.age << setw(8) << stu.score << endl; } // 显示所有学生 void showAll() { if (stuList.empty()) { cout << "【提示】暂无学生数据!" << endl; return; } cout << left << setw(10) << "学号" << setw(10) << "姓名" << setw(6) << "年龄" << setw(8) << "成绩" << endl; cout << "------------------------------------------------" << endl; for (auto& stu : stuList) { showOne(stu); } } // 按成绩降序排序 void sortByScore() { sort(stuList.begin(), stuList.end(), [](const Student& a, const Student& b) { return a.score > b.score; }); updateIndex(); cout << "【成功】已按成绩降序排序!" << endl; } // 保存到文件 void saveToFile(const string& filename) { ofstream ofs(filename); if (!ofs.is_open()) { cout << "【错误】文件打开失败!" << endl; return; } for (auto& stu : stuList) { ofs << stu.id << " " << stu.name << " " << stu.age << " " << stu.score << endl; } ofs.close(); cout << "【成功】数据已保存到文件!" << endl; } // 从文件加载 void loadFromFile(const string& filename) { ifstream ifs(filename); if (!ifs.is_open()) { cout << "【提示】文件不存在,跳过加载!" << endl; return; } stuList.clear(); idIndex.clear(); Student stu; while (ifs >> stu.id >> stu.name >> stu.age >> stu.score) { stuList.push_back(stu); } updateIndex(); ifs.close(); cout << "【成功】数据加载完成!" << endl; } }; // 菜单界面 void showMenu() { 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 << "8. 加载文件" << endl; cout << "0. 退出系统" << endl; cout << "============================" << endl; cout << "请输入操作:"; } int main() { StudentManager manager; int op; string filename = "student.txt"; // 启动加载文件 manager.loadFromFile(filename); while (true) { showMenu(); cin >> op; if (op == 0) { cout << "系统退出成功!" << endl; break; } if (op == 1) { Student stu; cout << "请输入学号:"; cin >> stu.id; cout << "请输入姓名:"; cin >> stu.name; cout << "请输入年龄:"; cin >> stu.age; cout << "请输入成绩:"; cin >> stu.score; manager.addStudent(stu); } else if (op == 2) { string id; cout << "请输入要删除的学号:"; cin >> id; manager.deleteStudent(id); } else if (op == 3) { string id; cout << "请输入要修改的学号:"; cin >> id; manager.modifyStudent(id); } else if (op == 4) { string id; cout << "请输入要查询的学号:"; cin >> id; manager.searchById(id); } else if (op == 5) { manager.showAll(); } else if (op == 6) { manager.sortByScore(); } else if (op == 7) { manager.saveToFile(filename); } else if (op == 8) { manager.loadFromFile(filename); } else { cout << "【错误】无效选项!" << endl; } } return 0; }三、项目核心知识点整合
- 容器搭配
vector:动态存储主体数据,适合遍历、排序map:学号映射下标,O (logn) 快速查找,替代暴力遍历
- C++11 特性
- Lambda 表达式自定义排序规则
- 范围 for 遍历
- 文件 IO
ifstream/ofstream实现数据持久化
- 格式化输出
setw、left实现对齐表格
- 面向对象
- 类封装所有功能,高内聚低耦合
四、系统运行效果
===== 学生信息管理系统 ===== 1. 添加学生 2. 删除学生 3. 修改学生 4. 学号查询 5. 显示所有 6. 成绩排序 7. 保存文件 8. 加载文件 0. 退出系统 ============================ 请输入操作:支持全程交互、数据自动保存、重启不丢失。
五、进阶优化方向(可自行拓展)
- 增加按姓名模糊查询
- 增加成绩区间筛选
- 改用
unordered_map提升查找速度 - 增加密码登录权限
- 支持 CSV 格式导出
- 增加异常捕获,防止非法输入崩溃
六、全阶段学习复盘
从零基础语法 → 面向对象 → STL 全容器 → 算法 → 高阶语法 → 综合项目,完整走完 C++ 入门到进阶全链路。这套代码完全符合企业级基础规范,是面试、课程设计、个人作品集的绝佳素材。
