题目描述

设计一个学生成绩管理系统,需支持 “添加学生信息”“查询学生成绩”“修改学生分数”“统计班级总分与平均分” 四大核心功能,要求综合运用 C 语言控制语句、C++ 指针(含动态内存分配 / 智能指针)、结构体等知识

解题步骤拆解

  1. 定义结构体与全局变量:声明Student结构体,定义 “学生总数” 变量(如int studentCount = 0;)、动态数组指针(如Student* students = nullptr;)。
  2. 实现菜单循环:用do-while循环包裹菜单显示与功能选择,输入 0 时退出循环。
  3. 分功能编写函数
    • addStudent():处理添加逻辑,含学号重复检查、动态数组扩容;
    • queryByID()/queryByName():实现两种查询,遍历数组匹配条件;
    • modifyScore():按学号定位学生,用switch选择修改的课程,验证分数合法性;
    • calculateStats():遍历数组累加分数,计算并输出统计结果。
  4. 内存释放:退出系统前,若用new[]分配内存,需调用delete[] students;释放。

以上是我让豆包出的题目以及提示

最终代码如下:

#include  <iostream>
#include <string>
using namespace std;

void menu() {
    cout << "===========学生成绩管理系统===========" << endl;
    cout << "1.添加学生信息" << endl;
    cout << "2.按姓名查询成绩" << endl;
    cout << "3.按学号查询成绩" << endl;
        cout << "4.修改学生分数" << endl;
        cout << "5.统计班级总分与平均分" << endl;
        cout << "0.退出系统" << endl;
        cout << "请输入您的选择(0-5)" << endl;
}

int ALL_student_number=0;
int add = 0;
struct STUDENT { string name; int Number; int Chinese; int Math; int English; };
STUDENT* p = new STUDENT [50];                                //学生结构体数组 借助数组地址访问元素

void cin_messege() {
    STUDENT* result = p + add;
    cout << "请输入学生姓名" << endl;
    cin >> result->name;
    cout << "请输入学生学号" << endl;
    cin >> result->Number;
    cout << "请输入学生语文成绩" << endl;
    cin >> result->Chinese;
    cout << "请输入学生数学成绩" << endl;
    cin >> result->Math;
    cout << "请输入学生英语成绩" << endl;
    cin >> result->English;
    add++;
    ALL_student_number++;
    
}//添加学生信息

void cout_messege1() {
    string aim_student;
    string result_student;
    cout << "请输入您想查询的学生姓名" << endl;
    cin >> aim_student;
    for (int i = 0; i < ALL_student_number; i++) {
        if (aim_student == (p + i)->name) {
            cout << aim_student << "的语文成绩为" << (p + i)->Chinese << endl;
            cout << aim_student << "的数学成绩为" << (p + i)->Math<<endl;
            cout << aim_student << "的英语成绩为" << (p + i)->English<<endl;
            result_student = aim_student;
            break;
        }
        else { continue; }
        
    }

}

void cout_messege2() {
    int aim_student;
    int result_student;
    cout << "请输入您想查询的学生学号" << endl;
    cin >> aim_student;
    for (int i = 0; i < ALL_student_number; i++) {
        if (aim_student == (p + i)->Number) {
            cout << aim_student << "|语文成绩为" << (p + i)->Chinese << endl;
            cout  << "|数学成绩为" << (p + i)->Math << endl;
            cout << "|英语成绩为" << (p + i)->English << endl;
            result_student = aim_student;
        }
        else { continue; }
    }
    
}

void correct_score() {
    string aim_student;
    string result_student;
    cout << "请输入您想修改分数的学生姓名" << endl;
    cin >> aim_student;
    for (int i = 0; i < ALL_student_number; i++) {
        if (aim_student == (p + i)->name) {
            cout << "--------------------" << endl;
            cout << "您想修改哪一学科" << endl;
            cout << "1.语文" << endl;
            cout << "2.数学" << endl;
            cout << "3.英语" << endl;
            cout << "请输入对应数字" << endl;
            cout << "--------------------" << endl;
            int aim_func;
            cin >> aim_func;
            int correct;
            switch (aim_func) {
            case 1:
                cout << "--------------------" << endl;
                cout << "原分数为" << (p + i)->Chinese << "请输入您想修改的分数" << endl;
                cin >> correct;
                (p + i)->Chinese = correct;
                cout << "修改成功,当前学生语文分数为" << (p + i)->Chinese << endl;
                cout << "--------------------" << endl;
                break;

            case 2:
                cout << "--------------------" << endl;
                cout << "原分数为" << (p + i)->Math << "请输入您想修改的分数" << endl;
                cin >> correct;
                (p + i)->Math = correct;
                cout << "修改成功,当前学生数学分数为" << (p + i)->Math << endl;
                cout << "--------------------" << endl;
                break;

            case 3:
                cout << "--------------------" << endl;
                cout << "原分数为" << (p + i)->English << "请输入您想修改的分数" << endl;
                cin >> correct;
                (p + i)->English = correct;
                cout << "修改成功,当前学生英语分数为" << (p + i)->English << endl;
                cout << "--------------------" << endl;
                break;

            default:cout << "请输入正确数字" << endl;

            }
            result_student = aim_student;
            break;
        }
        else { continue; }
        if (result_student != aim_student) { cout << "不存在该学生" << endl; }
    }
}
    void sum_and_average(){
        int SUM=0;
        for (int i = 0; i < ALL_student_number; i++) {
            int add = (p + i)->Chinese + (p + i)->Math + (p + i)->English;
            SUM += add;
        }
        double average = (double)SUM / ALL_student_number;

        cout << "三科班级总分为" << SUM<<endl;
        cout << "三科班级平均分为" << average << endl;}

int main() {
    menu();
    int func;
    cin >> func;
    while (func != 0) {
        if (func == 1) { cin_messege(); }
        else if (func == 2) { cout_messege1(); }
        else if (func == 3) { cout_messege2(); }
        else if (func == 4) { correct_score(); }
        else if (func == 5) { sum_and_average(); }
        else { cout << "请输入正确的数字" << endl; }
        menu();
        cin >> func;
    }
    cout << "--------------------" << endl;
    cout << "即将退出" << endl;
    cout << "欢迎下次使用" << endl;
    cout << "--------------------" << endl;


    

    return 0;
}
在编写过程中出现以下疑问及其解决:

1.全局总体:先编写出实现各个功能的函数,再利用while循环,将各个功能穿插在菜单的循环中。

通过声明功能选择变量func,在每次循环的最后再次展现菜单中的功能选择,从而实现进行循环/退出系统

2.添加学生功能:如何让学生一个个添加并且保存至之后便于查询?

首先构建好记录学生信息的结构体,单个学生是一个结构体变量,利用结构体数组去记录每一个学生。

同时为了让学生信息依次赋值给结构体数组中的元素,应声明一个偏移量add对数组元素的地址进行实时追踪(指针指向数组第一个元素的地址,利用指针的运算)

声明一个总人数变量ALL_student_number进行学生人数的实时更新

3.查询学生成绩功能:如何一个个地找出与目标匹配的结果

利用for循环实现对数组的遍历,获取数组中每个元素的信息,通过比对姓名/学号从而确定是否是目标学生(此处可声明一个临时变量aim_student来存储目标学生信息,将其与每次遍历的元素信息进行比对)

利用break和continue语句,找到目标就可以跳出循环,未找到就结束本次循环进行下次循环

4.修改分数功能:用switch语句进行匹配实现,修改科目的选择

注意:每个case的末尾要加break语句,不然一旦有一个case匹配成功,后续case中的内容都会运行

豆包的评价

你的学生成绩管理系统实现了基本的功能,整体结构清晰,能够满足简单的学生信息管理需求,以下是具体的评价和一些改进建议:

优点:

  1. 功能基本完整:实现了添加学生信息、按姓名查询、按学号查询、修改成绩、统计班级总分和平均分以及退出系统等核心功能,覆盖了成绩管理的基本场景。
  2. 结构清晰:通过函数分别实现不同功能(如cin_messege添加信息、cout_messege1按姓名查询等),主函数通过菜单驱动,逻辑流程较清晰。
  3. 使用了结构体和动态数组:利用STUDENT结构体存储学生信息,通过指针动态数组存储多个学生数据,符合数据组织的基本思路。

可改进的地方:

  1. 中文显示问题:代码中菜单的中文部分可能存在乱码(如 “ѧ���ɼ�����ϵͳ”),建议检查编码格式(如改为 UTF-8),确保中文正常显示。

  2. 数组越界风险:定义的动态数组p = new STUDENT [50]限制了最多只能存储 50 个学生,当学生数量超过 50 时会出现越界。可考虑使用vector动态容器(需包含<vector>头文件)

  3. 变量命名规范:部分变量名(如messege应为messagecorrect_scoreaim_func可改为subjectChoice等)拼写不规范或语义不够清晰,建议使用更直观的命名。

  4. 输入合法性校验:未对输入的数据(如成绩是否为合理范围的整数、学号是否重复等)进行校验,可能导致错误数据录入。例如添加学生时,可检查成绩是否在 0-100 之间

  5. 内存释放:动态分配的数组p在程序结束前未释放,虽然程序退出后系统会回收,但最好在main函数结束前添加delete[] p;,养成良好的内存管理习惯。

  6. 功能扩展:可以考虑增加删除学生信息、按成绩排序、保存数据到文件(避免程序退出后数据丢失)等功能,提升系统的实用性。

总体来说,作为基础版本的成绩管理系统已经实现了核心功能,逻辑也较为清晰。如果能解决上述细节问题,代码的健壮性和可维护性会更好。继续加油!

接下来我将开始学习面向对象编程

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐