用户_29571846
发布于 2026-06-22 / 1 阅读
0
0

C++ 综合实战:控制台学生成绩管理系统完整项目

一、项目前言

本篇整合前面全部 C++ 知识点:变量、分支、循环、数组、函数、结构体、vector、map、文件读写、异常捕获、面向对象封装,实现完整可运行控制台管理工具,包含增删改查、文件持久化、数据校验功能。

项目功能清单

  1. 添加学生信息(姓名、年龄、分数)

  2. 根据姓名查询学生成绩

  3. 修改已有学生分数

  4. 删除指定学生记录

  5. 展示全部学生列表

  6. 数据保存到本地 student.txt,程序重启自动加载

  7. 分数异常校验、运行异常捕获容错

二、完整可运行源码

cpp

运行

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <fstream>
#include <exception>
using namespace std;
// 学生结构体
struct Student
{
    string name;
    int age;
    double score;
};
// 全局容器存储学生数据
vector<Student> stuList;
// 函数声明
void showMenu();
void addStudent();
void queryByName();
void modifyScore();
void delStudent();
void showAll();
void saveToFile();
void loadFromFile();
int main()
{
    // 程序启动加载本地文件数据
    loadFromFile();
    int op;
    while(true)
    {
        showMenu();
        cin >> op;
        try
        {
            switch(op)
            {
                case 1: addStudent(); break;
                case 2: queryByName(); break;
                case 3: modifyScore(); break;
                case 4: delStudent(); break;
                case 5: showAll(); break;
                case 0:
                    saveToFile();
                    cout << "数据已保存,程序退出" << endl;
                    return 0;
                default:
                    cout << "输入功能序号无效,请重新选择" << endl;
            }
        }
        catch(const exception &e)
        {
            cout << "操作异常:" << e.what() << endl;
        }
    }
    return 0;
}
// 打印功能菜单
void showMenu()
{
    cout << "\n===== 学生成绩管理系统 =====" << endl;
    cout << "1. 添加学生信息\n2. 姓名查询分数\n3. 修改学生分数\n4. 删除学生\n5. 展示全部学生\n0. 保存并退出" << endl;
    cout << "请输入操作序号:";
}
// 添加学生
void addStudent()
{
    Student s;
    cout << "输入姓名:";
    cin >> s.name;
    cout << "输入年龄:";
    cin >> s.age;
    cout << "输入分数:";
    cin >> s.score;
    // 数据校验
    if(s.age <= 0 || s.age > 100)
        throw runtime_error("年龄范围非法");
    if(s.score < 0 || s.score > 100)
        throw runtime_error("分数必须0~100");
    stuList.push_back(s);
    cout << "学生添加成功" << endl;
}
// 根据姓名查询
void queryByName()
{
    string name;
    cout << "输入查询姓名:";
    cin >> name;
    bool find = false;
    for(auto &stu : stuList)
    {
        if(stu.name == name)
        {
            cout << "姓名:" << stu.name << " 年龄:" << stu.age << " 分数:" << stu.score << endl;
            find = true;
            break;
        }
    }
    if(!find)
        cout << "未找到该学生" << endl;
}
// 修改分数
void modifyScore()
{
    string name;
    double newSc;
    cout << "输入要修改的学生姓名:";
    cin >> name;
    cout << "输入新分数:";
    cin >> newSc;
    if(newSc <0 || newSc >100)
        throw runtime_error("新分数超出合法区间");
    bool find = false;
    for(auto &stu : stuList)
    {
        if(stu.name == name)
        {
            stu.score = newSc;
            cout << "分数修改完成" << endl;
            find = true;
            break;
        }
    }
    if(!find)
        cout << "目标学生不存在" << endl;
}
// 删除学生
void delStudent()
{
    string name;
    cout << "输入待删除学生姓名:";
    cin >> name;
    for(auto it = stuList.begin(); it != stuList.end(); )
    {
        if(it->name == name)
        {
            stuList.erase(it);
            cout << "删除成功" << endl;
            return;
        }
        else
            it++;
    }
    cout << "无匹配学生,删除失败" << endl;
}
// 展示全部学生
void showAll()
{
    if(stuList.empty())
    {
        cout << "暂无学生数据" << endl;
        return;
    }
    cout << "\n===== 全部学生列表 =====" << endl;
    for(auto &s : stuList)
    {
        cout << "姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
    }
}
// 保存数据到txt
void saveToFile()
{
    ofstream out("student.txt");
    if(!out.is_open())
        throw runtime_error("文件打开失败,无法保存");
    for(auto &s : stuList)
    {
        out << s.name << " " << s.age << " " << s.score << endl;
    }
    out.close();
}
// 程序启动加载文件数据
void loadFromFile()
{
    ifstream in("student.txt");
    if(!in.is_open())
        return; // 文件不存在直接跳过加载
    Student s;
    while(in >> s.name >> s.age >> s.score)
    {
        stuList.push_back(s);
    }
    in.close();
}

三、项目知识点覆盖清单

  1. 基础语法:分支 switch、while 循环、函数封装、参数传递

  2. 复合数据:struct 结构体、vector 动态容器存储多条数据

  3. 文件操作:ofstream/ifstream 持久化读写 txt

  4. 异常机制:try-catch 捕获非法年龄、分数、文件错误

  5. STL 遍历:迭代器、范围 for 循环

  6. 数据校验:业务逻辑合法性拦截

四、运行使用流程

  1. 编译运行程序,自动读取 student.txt 历史数据

  2. 输入数字选择对应功能,完成增删改查

  3. 输入 0 退出,自动把全部数据写入本地文件永久保存

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

  1. 增加 map 做姓名索引,优化查询速度

  2. 新增按分数排序、统计平均分功能

  3. 增加密码登录校验模块

  4. 支持批量导入导出数据

六、系列完结说明

本篇是 C++ 零基础入门全套终篇,完整覆盖 C++ 基础语法、面向对象、标准 STL、文件 IO、异常处理,学完可独立编写控制台工具类程序。


评论