学生成绩系统出错,问一下怎么改

问一下,为什么最后的查询学生成绩时,查询的成绩都是0.
该怎么改,感谢

#include <stdio.h> //头文件  
#include <string.h> //处理包含字符串的头文件 
//定义结构 
struct list                //struct 关键字   定义结构体 
{
    //字符类型 
    char name[10];        //姓名  ,最多容纳4个汉字 
    //定义整型变量 
    int chinese;        //语文成绩 
    int math;            //数学成绩 
    int english;        //英语成绩 
    int c;        //C语言成绩 
}; 

void input(struct list m[], int n);         //输入学生成绩的函数 
void average(struct list m[], int n);         //计算学科平均值的函数 
void find(struct list m[], int n);             //查询学生成绩的函数 

int main(void)
{
    struct  list m[30];   //数组   最多输入30个学生 
    int choices,x,y;       //定义 choicexy
    
    //用do-while 循环 来实现数字对应功能的选择作用 
    do{
        rerun:        
        printf("\n"); 
        printf("\t         统计学生成绩系统        \n");
        printf("\t                                 \n");
        printf("\t     输入学生成绩---------1      \n");
        printf("\t     查看学科成绩的平均值---2      \n");
        printf("\t     查询学生成绩---------3      \n");
        printf("\t     退出系统-------------0      \n");
        printf("\t                                 \n");
        printf("\t选择功能:");
        scanf("%d", &choices);
        switch(choices) //switch 常和 case 连用表示判断选择代码 
        {                //当choices表示的值与case 后的数字相同时,程序会执行与数字相对应的case语句 
            case 1:
                printf("成绩输入中\n\n");
                printf("\t请输入学生人数(1~30):");
                scanf("%d",&y);
                input(m,y);
                break;      //break直接终止循环 
            case 2:
                printf("学科平均成绩计算\n\n");
                average(m,y);
                break;
            case 3:
                printf("开始查看学生成绩\n\n");
                find(m, y);
                break; 
            case 0:
                printf("\t已经退出统计学生成绩系统");
                break;
            default :                                   //当输入的值与所有case所带的常量不一样时,则执行default下面的语句 
                printf("\t输入错误");
                goto rerun;                            //重新返回rerun循环执行语句 
        }
    }while(choices>0&&choices<5);
    
    return 0; 
}
void input(struct list m[], int n)                //定义输入函数 ,开始输入学生成绩 , 存入数组 
{
    int i;
    for(i=0;i<n;i++)  //使用for循环,可以录入多名学生的成绩 
    {
        printf("\t输入第%d名同学的姓名:", i+1);
        scanf("%s", m[i].name);     //输入名字 
        printf("\t输入第%d名同学的语文成绩:", i+1);
        scanf("%d", &m[i].chinese);    //语文成绩 
        printf("\t输入第%d名同学的数学成绩:", i+1);
        scanf("%d", &m[i].math);    //数学成绩 
        printf("\t输入第%d名同学的英语成绩:", i+1);
        scanf("%d", &m[i].english);   //英语成绩 
        printf("\t输入第%d名同学的C语言成绩:", i+1);
        scanf("%d", &m[i].c);  //C语言成绩 
    }
    printf("\t成绩已录入\n");
}
void average(struct list m[], int n)    //计算学科的平均分 
{
    printf("\t语文\t数学\t英语\tC语言\n");
    int i;
    float result=0.0;  //float  单精度浮点型小数类型 
    for(i=0;i<n;i++) 
    {
        result+=m[i].chinese;  //计算语文成绩的总和 
    }
    printf("\t%.2f", result/n);// %.2f是float后的小数只输出两位,计算语文学科平均分 
    result=0;
    for(i=0;i<n;i++)
    {
        result+=m[i].math;    //计算数学成绩的总和 
    }
    printf("\t%.2f", result/n);  //计算数学这一学科的平均分 
    result=0;
    for(i=0;i<n;i++)
    {
        result+=m[i].english;  //计算英语成绩的总和 
    }
    printf("\t%.2f", result/n);  //计算英语这一学科的平均分 
    result=0;
    for(i=0;i<n;i++)
    {
        result+=m[i].c;          //计算C语言成绩的总和 
    }
    printf("\t%.2f\n", result/n);   //计算C语言成绩的平均分 
}

void find(struct list m[], int n)            //查询学生成绩    
{ 
    int i,trigger;
    char in_name[10];
    
    do{
        printf("\t请输入要查询的学生姓名:");
        scanf("%s", in_name);
        int chack=0;
        for(i=0;i<n;i++)
        {
            if(strcmp(in_name,m[i].name)==0)
            {
                printf("\t%s的成绩为:\n\n",m[i].name);
                printf("\tC语言\t数学\t英语\t语文\n");
                printf("\t%.2f\t%.2f\t%.2f\t%.2f\n\n",m[i].c,m[i].math,m[i].english,m[i].chinese); 
                chack=1;
            }
                     
        }
        if(chack==0) printf("\t*查无此人*\n\n"); 
        printf("\t继续查询请输入1,否则输入0返回功能选择界面:");
        scanf("%d", &trigger);
    }while(trigger==1);
} 

该回答引用ChatGPT
您的代码实现有一个问题,就是在 average() 函数中没有对每个学科进行分别求平均分。在代码中只有一个 result 变量保存了学科成绩的总和,因此在输出各个学科的平均分时会出现问题。

在 average() 函数中,应该为每个学科分别定义一个变量来保存该学科的成绩总和,并将每个学科的成绩总和除以学生数,即可得到该学科的平均分。修改后的 average() 函数如下:


void average(struct list m[], int n) {
    int i;
    float sum_chinese = 0.0, sum_math = 0.0, sum_english = 0.0, sum_c = 0.0;
    for (i = 0; i < n; i++) {
        sum_chinese += m[i].chinese;
        sum_math += m[i].math;
        sum_english += m[i].english;
        sum_c += m[i].c;
    }
    printf("\t语文\t数学\t英语\tC语言\n");
    printf("\t%.2f\t%.2f\t%.2f\t%.2f\n", sum_chinese/n, sum_math/n, sum_english/n, sum_c/n);
}

此外,在查询学生成绩时,您的代码中没有对姓名进行比较,因此无法找到对应的学生成绩。您需要先输入要查询的学生姓名,然后在数组中查找该学生的信息。修改后的 find() 函数如下:


void find(struct list m[], int n) {
    char name[10];
    int i, found = 0;
    printf("请输入要查询的学生姓名:");
    scanf("%s", name);
    for (i = 0; i < n; i++) {
        if (strcmp(name, m[i].name) == 0) {
            printf("\t姓名\t语文\t数学\t英语\tC语言\n");
            printf("\t%s\t%d\t%d\t%d\t%d\n", m[i].name, m[i].chinese, m[i].math, m[i].english, m[i].c);
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("\t未找到该学生的信息\n");
    }
}

这段代码存在一个问题,即在选择查询学生成绩时,调用find()函数时没有将输入的学生人数n作为参数传递给函数,因此函数内部的循环将没有可用的数据。需要在调用find()函数时将n作为参数传递进去。具体而言,在主函数中case 3下的find(m, y)应该改为find(m, n)。