一、项目需求

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

更多推荐