评分学生的分数

时间:2018-04-13 04:50:52

标签: c multidimensional-array

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

  1. 该程序显示每个学生的总分和平均分数
  2. 该程序显示每个主题的总分和平均分数
  3. 该计划包括平均分数为50或以下的学生人数
  4. 以下是我的代码

    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]);
        }
    }
    

    我现在的问题是:

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

2 个答案:

答案 0 :(得分:0)

for(a=1;a<=10;a++)

C数组基于,而不是基于一个。这意味着您的for循环应该更像:

for (a = 0; a < 10; a++)

所以你的第一个步骤就是修复所有这些。当允许的索引为x[10]时写入0..9是未定义的行为。这几乎肯定是基于你的&#34;每当它到达最后一个学生时发生的事情。评价。

在整理你的第一和第二点时,你已经完成学生的繁重工作,你只需要申请这些科目。

因此,作为第一步,摆脱平均值&#34;数组,他们并不是真正需要的,而是改变你的单身&#34;总计&#34;为学生科目分别编入一个阵列:

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或更少的学生,只需逐个浏览,评估每个:

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);

请注意,更多健壮的程序不会为学生和主题计数提供硬编码值(在规范实施中) - 这取决于实际输入的值。然而,鉴于这几乎肯定是一些描述的教育工作,它可能还可以。

答案 1 :(得分:0)

你的数组超出范围,因此是未定义的行为。

TestVSTS

这些都是10的数组。而且,在int total[10]={0}; float avgStu[10]; float avgSub[10]; 循环中,由于for(a=1;a<=10;a++),最后一次迭代会尝试打印total[10]avgStu[10]。 在C中,所有数组都是从0开始的,这意味着数组中的第一个元素将是第0个索引,而不是第1个。

要解决此问题,您必须先将循环更改为a<=10

并且还将for(a = 0; a < 10; a++)更改为for(b=1;b<=5;b++)