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++ 入门到进阶全链路。这套代码完全符合企业级基础规范,是面试、课程设计、个人作品集的绝佳素材。
更多推荐



所有评论(0)