C 给学生评分

C 给学生评分,c,multidimensional-array,C,Multidimensional Array,我试图用C语言编写一个程序,用多维数组计算5门学科10名学生的分数。以下是标准: 该程序显示每个学生的总分和平均分 该程序显示每个科目的总分和平均分 该计划包括平均分数在50分或以下的学生人数 下面是我的代码 int main(){ int a,b,marks[10][5]; int total[10]={0}; float avgStu[10]; float avgSub[10]; //Enter students' marks for(a=1

我试图用C语言编写一个程序,用多维数组计算5门学科10名学生的分数。以下是标准:

该程序显示每个学生的总分和平均分 该程序显示每个科目的总分和平均分 该计划包括平均分数在50分或以下的学生人数 下面是我的代码

int main(){
    int a,b,marks[10][5];
    int total[10]={0};
    float avgStu[10];
    float avgSub[10];

    //Enter students' marks
    for(a=1;a<=10;a++){
        printf("Marks student %d = ",a);
        for(b=1;b<=5;b++){
            scanf("%d",&marks[a][b]);
        }
    }

    //Total marks
    for(a=1;a<=10;a++){
        for(b=1;b<=5;b++){
            total[a] += marks[a][b];
        }
    }

    //Average marks students
    for(a=1;a<=10;a++){
        for(b=1;b<=5;b++){
            avgStu[a] = (float)total[a]/10.0;
        }
    }

    for(a=1;a<=10;a++){
        printf("\nStudent no %d\n",a);
        printf("Total marks: %d\n",total[a]);
        printf("Average marks: %.2f\n",avgStu[a]);
    }
}
我现在的问题是:

每当它到达最后一个学生10时,分数就会变得混乱。它不会从输入中读取标记。 我似乎找不到第二个和第三个标准的解决方案。 如果你们能帮助我,我将不胜感激。提前感谢:D

for(a=1;a<=10;a++)
因此,您的第一步是修复所有这些问题。当允许的索引为0..9时写入x[10]是未定义的行为。这几乎可以肯定的是,只要你的评论到达最后一个学生的评论,就会发生什么

在整理你的第一点和第二点时,你已经为学生们做了繁重的工作,你只需要将这些科目也应用到其中

因此,作为第一步,去掉平均数组,它们不是真正需要的,并将单个总数组更改为学生和科目各一个:

int totalStudents[10] = {0};
int totalSubjects[5] = {0};
然后,正如你已经为学生做的那样,对科目做同样的事情,我将完全重写这里的循环,给它更好的变量名:

// Calculate total marks for students and subjects.

for (int studentIdx = 0; studentIdx < 10; studentIdx++) {
    for (int subjectIdx = 0; subjectIdx < 5; subjectIdx++) {
        totalStudents[studentIdx] += marks[studentIdx][subjectIdx];
        totalSubjects[subjectIdx] += marks[studentIdx][subjectIdx];
    }
}
现在您已经有了这两个类的总数,只需给出总数和平均数,而不需要临时数组:

for (int studentIdx = 0; studentIdx < 10; studentIdx++) {
    printf ("Student no : %d\n",   studentIdx);
    printf ("   Total   : %d\n",   totalStudents[studentIdx]);
    printf ("   Average : %.2f\n", totalStudents[studentIdx] / 10.0);
}

for (int subjectIdx = 0; subjectIdx < 5; subjectIdx++) {
    printf ("Subject no : %d\n",   subjectIdx);
    printf ("   Total   : %d\n",   totalSubjects[subjectIdx]);
    printf ("   Average : %.2f\n", totalSubjects[subjectIdx] / 5.0);
}
对于最后一点3,你想列出平均成绩为50分或50分以下的学生,只需逐一进行评估:

printf ("The following students got an average <= 50:\n");
int countLe50 = 0;
for (int studentIdx = 0; studentIdx < 10; studentIdx++) {
    if (total[studentIdx] <= 500) {
        printf ("   Student no : %d\n",   studentIdx);
        countLe50++;
    }
}
printf ("   Count is %d\n", countLe50);

请记住,一个更健壮的程序在规范或实现中都不会有硬编码的学生和科目计数值——这取决于实际输入的值的数量。然而,考虑到这几乎肯定是某种描述的教育性工作,这可能没关系。

您有一个超出范围的数组,因此是未定义的行为

int total[10]={0};
float avgStu[10];
float avgSub[10];

这些都是10的数组。在fora=1;aarray索引从0开始,而不是从1开始…而且,当访问arr[10]时,当arr为int-arr[10]时,您调用的是未定义的行为,因为有效的索引是0…9,在这之后,您的程序可以做任何事情。所以您的意思是,我必须从0开始a和b变量?好的,这是一件事。你能帮我了解第二条和第三条标准吗?
int total[10]={0};
float avgStu[10];
float avgSub[10];