当前位置: 首页 > news >正文

C++学生管理系统实战教程

一、项目需求

  1. 学生信息:学号、姓名、年龄、成绩
  2. 功能列表:
    • 添加学生
    • 删除学生(按学号)
    • 修改学生信息
    • 按学号查询
    • 显示所有学生
    • 按成绩排序
    • 信息保存到文件
    • 从文件加载数据
  3. 技术栈:
    • 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; }

三、项目核心知识点整合

  1. 容器搭配
    • vector:动态存储主体数据,适合遍历、排序
    • map:学号映射下标,O (logn) 快速查找,替代暴力遍历
  2. C++11 特性
    • Lambda 表达式自定义排序规则
    • 范围 for 遍历
  3. 文件 IO
    • ifstream/ofstream实现数据持久化
  4. 格式化输出
    • setwleft实现对齐表格
  5. 面向对象
    • 类封装所有功能,高内聚低耦合

四、系统运行效果

===== 学生信息管理系统 ===== 1. 添加学生 2. 删除学生 3. 修改学生 4. 学号查询 5. 显示所有 6. 成绩排序 7. 保存文件 8. 加载文件 0. 退出系统 ============================ 请输入操作:

支持全程交互、数据自动保存、重启不丢失。


五、进阶优化方向(可自行拓展)

  1. 增加按姓名模糊查询
  2. 增加成绩区间筛选
  3. 改用unordered_map提升查找速度
  4. 增加密码登录权限
  5. 支持 CSV 格式导出
  6. 增加异常捕获,防止非法输入崩溃

六、全阶段学习复盘

从零基础语法 → 面向对象 → STL 全容器 → 算法 → 高阶语法 → 综合项目,完整走完 C++ 入门到进阶全链路。这套代码完全符合企业级基础规范,是面试、课程设计、个人作品集的绝佳素材。

http://www.jsqmd.com/news/754932/

相关文章:

  • 3分钟学会:BotW存档管理器让你的Switch与WiiU游戏进度无缝同步
  • 为什么你的.NET 9低代码组件无法通过.NET Native AOT?微软内部验证的4步编译兼容性诊断法
  • EventCalendar高级定制技巧:打造独一无二的企业级日历应用
  • ARM架构SVE与SME向量计算技术解析
  • ToolFlow:基于LLM的智能工作流编排框架,让AI从代码生成升级为流程工程师
  • Sequelize 与 TypeORM 在 Node.js 异步数据库操作上的性能对比
  • StyLua语言服务器模式:实现实时代码格式化与编辑器深度集成
  • Qwen2-VL-72B-Instruct开发者进阶:自定义视觉处理与模型微调
  • Vue3+java基于springboot框架的考研学生在线学习与交流系统的设计与实现
  • SocratiCode:从哲学思辨到代码清晰度的编程方法论实践
  • 0为什么不能作除数
  • RoPE启发的KV缓存压缩技术解析
  • 如何发布你的Fabric-example-mod:从本地测试到Maven仓库的完整流程
  • pbpython交互式应用开发:构建企业级数据仪表板的完整流程
  • Controlnet QR Code Monster v2与元宇宙结合:虚拟世界中的二维码应用
  • rk3568 nvme硬盘分区,格式化,挂载测试
  • 从零构建开源机械爪:STM32舵机控制与机电一体化实战
  • 告别桌面版臃肿!在Mac M1的VMware Fusion上极简安装CentOS 8 Server版并配置开发环境
  • LinuxCheck基础配置检查详解:系统信息、CPU、内存、磁盘全面检测
  • CP2K官方教程和测试文件到底怎么用?手把手教你从‘tests’目录挖出高效输入模板
  • mkdocstrings 部署指南:从本地开发到生产环境的完整流程
  • Theo入门教程:从零开始创建你的第一个设计令牌文件
  • 基于Vue3+TypeScript构建ChatGPT式对话应用:架构设计与工程实践
  • 别把你的定价权,无偿赠予最不在乎你的人
  • BTT Pad 7改装树莓派CM4:从3D打印机控制到多功能平板
  • SageMath代码架构分析:理解大型数学软件的设计哲学
  • 强化学习自蒸馏技术:原理、实现与优化
  • CodeGeeX2-6B实战:10个技巧教你写出完美的Python代码
  • Android Demos模块化开发:OptionalDependencies与WearBuildConfig架构设计
  • Arm SME2指令集:多向量处理与矩阵运算优化