我尝试使用C语言编写程序,使用多维数组计算5个科目中10名学生的分数。以下是标准:
以下是我的代码
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]);
}
}
我现在的问题是:
如果你们能帮助我,我将不胜感激。提前致谢:D
答案 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++)