第23章 - 学生管理系统
嗨,朋友!我是长安。
恭喜你来到实战项目阶段!这一章,我们要开发一个完整的学生管理系统。
这是一个非常经典的入门项目,包含了增删改查等常见功能,能够帮你巩固前面学到的所有知识。
🎯 项目需求
我们要开发一个学生信息管理系统,具有以下功能:
- 添加学生 - 输入学号、姓名、年龄、成绩
- 删除学生 - 根据学号删除学生信息
- 修改学生 - 根据学号修改学生信息
- 查询学生 - 根据学号或姓名查询
- 显示所有学生 - 列表显示所有学生
- 数据保存 - 将数据保存到文件
- 数据加载 - 从文件加载数据
- 退出系统 - 保存数据并退出
📋 项目设计
数据结构设计
我们使用结构体来表示学生信息:
struct Student {
int id; // 学号
string name; // 姓名
int age; // 年龄
double score; // 成绩
};
功能模块划分
主程序
├── 显示菜单
├── 添加学生
├── 删除学生
├── 修改学生
├── 查询学生
├── 显示所有学生
├── 保存数据
├── 加载数据
└── 退出系统
💻 完整代码实现
版本1:基础版(使用数组)
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
// 学生结构体
struct Student {
int id; // 学号
string name; // 姓名
int age; // 年龄
double score; // 成绩
};
// 全局变量
const int MAX_STUDENTS = 100;
Student students[MAX_STUDENTS];
int studentCount = 0;
// 函数声明
void showMenu();
void addStudent();
void deleteStudent();
void modifyStudent();
void queryStudent();
void showAllStudents();
void saveToFile();
void loadFromFile();
int main() {
loadFromFile(); // 启动时加载数据
int choice;
do {
showMenu();
cout << "请选择操作(0-8):";
cin >> choice;
switch (choice) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
modifyStudent();
break;
case 4:
queryStudent();
break;
case 5:
showAllStudents();
break;
case 6:
saveToFile();
break;
case 0:
saveToFile();
cout << "感谢使用,再见!" << endl;
break;
default:
cout << "无效选择,请重新输入!" << endl;
}
if (choice != 0) {
cout << "\n按回车键继续...";
cin.ignore();
cin.get();
}
} while (choice != 0);
return 0;
}
// 显示菜单
void showMenu() {
system("cls"); // Windows用cls,Mac/Linux用clear
cout << "========================================" << endl;
cout << " 学生信息管理系统" << endl;
cout << "========================================" << endl;
cout << " 1. 添加学生" << endl;
cout << " 2. 删除学生" << endl;
cout << " 3. 修改学生" << endl;
cout << " 4. 查询学生" << endl;
cout << " 5. 显示所有学生" << endl;
cout << " 6. 保存数据" << endl;
cout << " 0. 退出系统" << endl;
cout << "========================================" << endl;
cout << "当前学生人数:" << studentCount << endl;
cout << "========================================" << endl;
}
// 添加学生
void addStudent() {
if (studentCount >= MAX_STUDENTS) {
cout << "学生人数已达上限!" << endl;
return;
}
Student newStudent;
cout << "\n===== 添加学生 =====" << endl;
cout << "请输入学号:";
cin >> newStudent.id;
// 检查学号是否重复
for (int i = 0; i < studentCount; i++) {
if (students[i].id == newStudent.id) {
cout << "学号已存在!" << endl;
return;
}
}
cin.ignore();
cout << "请输入姓名:";
getline(cin, newStudent.name);
cout << "请输入年龄:";
cin >> newStudent.age;
cout << "请输入成绩:";
cin >> newStudent.score;
students[studentCount] = newStudent;
studentCount++;
cout << "添加成功!" << endl;
}
// 删除学生
void deleteStudent() {
int id;
cout << "\n===== 删除学生 =====" << endl;
cout << "请输入要删除的学号:";
cin >> id;
int index = -1;
for (int i = 0; i < studentCount; i++) {
if (students[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
cout << "未找到该学生!" << endl;
return;
}
// 显示要删除的学生信息
cout << "找到学生:" << students[index].name << endl;
cout << "确定删除吗?(Y/N):";
char confirm;
cin >> confirm;
if (confirm == 'Y' || confirm == 'y') {
// 删除:将后面的学生前移
for (int i = index; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
cout << "删除成功!" << endl;
} else {
cout << "已取消删除" << endl;
}
}
// 修改学生
void modifyStudent() {
int id;
cout << "\n===== 修改学生 =====" << endl;
cout << "请输入要修改的学号:";
cin >> id;
int index = -1;
for (int i = 0; i < studentCount; i++) {
if (students[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
cout << "未找到该学生!" << endl;
return;
}
cout << "当前信息:" << endl;
cout << "学号:" << students[index].id << endl;
cout << "姓名:" << students[index].name << endl;
cout << "年龄:" << students[index].age << endl;
cout << "成绩:" << students[index].score << endl;
cout << "\n请输入新信息:" << endl;
cin.ignore();
cout << "姓名:";
getline(cin, students[index].name);
cout << "年龄:";
cin >> students[index].age;
cout << "成绩:";
cin >> students[index].score;
cout << "修改成功!" << endl;
}
// 查询学生
void queryStudent() {
cout << "\n===== 查询学生 =====" << endl;
cout << "1. 按学号查询" << endl;
cout << "2. 按姓名查询" << endl;
cout << "请选择:";
int choice;
cin >> choice;
if (choice == 1) {
int id;
cout << "请输入学号:";
cin >> id;
for (int i = 0; i < studentCount; i++) {
if (students[i].id == id) {
cout << "\n找到学生:" << endl;
cout << "学号:" << students[i].id << endl;
cout << "姓名:" << students[i].name << endl;
cout << "年龄:" << students[i].age << endl;
cout << "成绩:" << students[i].score << endl;
return;
}
}
cout << "未找到该学生!" << endl;
} else if (choice == 2) {
string name;
cin.ignore();
cout << "请输入姓名:";
getline(cin, name);
bool found = false;
for (int i = 0; i < studentCount; i++) {
if (students[i].name == name) {
if (!found) {
cout << "\n查询结果:" << endl;
found = true;
}
cout << "-------------------------" << endl;
cout << "学号:" << students[i].id << endl;
cout << "姓名:" << students[i].name << endl;
cout << "年龄:" << students[i].age << endl;
cout << "成绩:" << students[i].score << endl;
}
}
if (!found) {
cout << "未找到该学生!" << endl;
}
}
}
// 显示所有学生
void showAllStudents() {
cout << "\n===== 学生列表 =====" << endl;
if (studentCount == 0) {
cout << "暂无学生信息!" << endl;
return;
}
cout << "学号\t姓名\t\t年龄\t成绩" << endl;
cout << "----------------------------------------" << endl;
for (int i = 0; i < studentCount; i++) {
cout << students[i].id << "\t"
<< students[i].name << "\t\t"
<< students[i].age << "\t"
<< students[i].score << endl;
}
}
// 保存到文件
void saveToFile() {
ofstream outFile("students.txt");
if (!outFile) {
cout << "文件打开失败!" << endl;
return;
}
outFile << studentCount << endl;
for (int i = 0; i < studentCount; i++) {
outFile << students[i].id << endl
<< students[i].name << endl
<< students[i].age << endl
<< students[i].score << endl;
}
outFile.close();
cout << "数据保存成功!" << endl;
}
// 从文件加载
void loadFromFile() {
ifstream inFile("students.txt");
if (!inFile) {
cout << "未找到数据文件,将创建新文件。" << endl;
return;
}
inFile >> studentCount;
inFile.ignore();
for (int i = 0; i < studentCount; i++) {
inFile >> students[i].id;
inFile.ignore();
getline(inFile, students[i].name);
inFile >> students[i].age;
inFile >> students[i].score;
inFile.ignore();
}
inFile.close();
cout << "数据加载成功!共 " << studentCount << " 条记录。" << endl;
}
🚀 运行效果
========================================
学生信息管理系统
========================================
1. 添加学生
2. 删除学生
3. 修改学生
4. 查询学生
5. 显示所有学生
6. 保存数据
0. 退出系统
========================================
当前学生人数:3
========================================
请选择操作(0-8):5
===== 学生列表 =====
学号 姓名 年龄 成绩
----------------------------------------
1001 张三 20 95.5
1002 李四 21 88.0
1003 王五 19 92.0
🌟 功能扩展建议
你可以尝试添加以下功能来提升这个项目:
- 排序功能 - 按成绩或学号排序
- 统计功能 - 计算平均分、最高分、最低分
- 导出功能 - 导出为CSV格式
- 备份功能 - 自动备份数据
- 密码保护 - 添加管理员登录
- 批量导入 - 从文件批量导入学生
- 图形界面 - 使用图形库制作GUI
🎯 小结
通过这个项目,你学到了:
- ✅ 结构体的实际应用
- ✅ 数组管理数据
- ✅ 函数模块化设计
- ✅ 文件的读写操作
- ✅ 菜单驱动的程序设计
- ✅ 数据的增删改查
💪 进阶挑战
- 将数组版本改成
vector版本 - 使用类(面向对象)重构代码
- 添加更多的查询条件(按年龄、成绩范围等)
- 实现数据加密存储
- 添加日志功能,记录所有操作
🚀 下一步
完成这个项目后,你可以继续学习下一个项目!
