C++ 从入门到精通C++ 从入门到精通
首页
基础教程
进阶教程
实战项目
编程指南
首页
基础教程
进阶教程
实战项目
编程指南
  • 🛠️ 实战项目

    • 🛠️ C++ 实战项目
    • 第23章 - 学生管理系统
    • 第24章 - 通讯录管理系统
    • 第25章 - 图书管理系统
    • 第26章 - 简易银行系统
    • 第27章 - 贪吃蛇游戏

第23章 - 学生管理系统

嗨,朋友!我是长安。

恭喜你来到实战项目阶段!这一章,我们要开发一个完整的学生管理系统。

这是一个非常经典的入门项目,包含了增删改查等常见功能,能够帮你巩固前面学到的所有知识。

🎯 项目需求

我们要开发一个学生信息管理系统,具有以下功能:

  1. 添加学生 - 输入学号、姓名、年龄、成绩
  2. 删除学生 - 根据学号删除学生信息
  3. 修改学生 - 根据学号修改学生信息
  4. 查询学生 - 根据学号或姓名查询
  5. 显示所有学生 - 列表显示所有学生
  6. 数据保存 - 将数据保存到文件
  7. 数据加载 - 从文件加载数据
  8. 退出系统 - 保存数据并退出

📋 项目设计

数据结构设计

我们使用结构体来表示学生信息:

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

🌟 功能扩展建议

你可以尝试添加以下功能来提升这个项目:

  1. 排序功能 - 按成绩或学号排序
  2. 统计功能 - 计算平均分、最高分、最低分
  3. 导出功能 - 导出为CSV格式
  4. 备份功能 - 自动备份数据
  5. 密码保护 - 添加管理员登录
  6. 批量导入 - 从文件批量导入学生
  7. 图形界面 - 使用图形库制作GUI

🎯 小结

通过这个项目,你学到了:

  • ✅ 结构体的实际应用
  • ✅ 数组管理数据
  • ✅ 函数模块化设计
  • ✅ 文件的读写操作
  • ✅ 菜单驱动的程序设计
  • ✅ 数据的增删改查

💪 进阶挑战

  1. 将数组版本改成 vector 版本
  2. 使用类(面向对象)重构代码
  3. 添加更多的查询条件(按年龄、成绩范围等)
  4. 实现数据加密存储
  5. 添加日志功能,记录所有操作

🚀 下一步

完成这个项目后,你可以继续学习下一个项目!

➡️ 第24章 - 通讯录管理系统

最近更新: 2025/12/26 17:25
Contributors: 王长安
Prev
🛠️ C++ 实战项目
Next
第24章 - 通讯录管理系统