首先,这是家庭作业。我一直试图摆脱错误,并通常将代码拧得更远,最终回到原始代码。如果你能给我一些方向(我能理解的话),我真的很感激。我不认为我们的教练实际上希望我们得到它,但我仍然要尝试。我现在正在发帖,但是会暂时离开电脑,所以我不能马上发表评论,谢谢。
#include <stdio.h>
#define MAX 10
main () {
int i;
int num_students;
float total;
long id[MAX]; // Student ID
short midterm[MAX]; // Midterm Grade
short final[MAX]; // Final Grade
float average[MAX]; // Average Grade
float avg_average; // Average of the averages
float diff; // Student's average minus class average
// The average grade is 60% final and 40% midterm
// Compute the course grades, the average course grade,
// and for each student, print out their id, midterm and final grades,
// the average grade, and their difference
i = 0;
// The syntax of this while loop is correct
while (scanf("%i %i %i",&id[i], &midterm[i], &final[i]) != EOF) {
average[i] = midterm[i]*.4 + final[i]*.6;
i++;
}
num_students = i;
for (i = 0; i < num_students; i++) {
total = total + average[i];
}
avg_average = total/num_students;
printf("ID\tMidterm\tFinal\tAvg\tAvgAvg\tDiff\n");
printf("---\t--------\t------\t----\t-------\t-----\n");
for (i = 0; i < num_students; i++) {
diff = avg_average - average[i];
printf("%d\t", id[i]);
printf("%i\t", midterm[i]);
printf("%i\t", final[i]);
printf("%f2.2\t", average[i]);
printf("%f2.2\t",avg_average);
printf("%f2.2\t",diff);
printf("\n");
}
这是我传递的数据文件:
0 94 93 1 88 84 2 99 79 3 78 64 4 66 83 5 78 90 6 90 87 7 23 18 8 55 76 9 48 26 10 87 67 11 97 89 12 100 89 13 88 78 14 67 78 15 87 76 16 77 65 17 83 87 18 89 87
我只是没有在任何类别中获得正确的输出。
答案 0 :(得分:3)
这是另一个问题。
scanf返回标准输入或EOF成功转换的次数。 但是当您输入空行或输入无效时会发生什么?
e.g。进入以下
"50 80 60" - this line OK
"garbage 3 7" - scanf returns 2. 1st conversion fails. id[i] could contain anything.
您要做的是修改您的程序以检查scanf返回3或EOF而不仅仅是EOF。 如果它没有返回其中任何一个,那么你需要打印出错误再次请求输入。
因为它是家庭作业,所以我会让你解决这个问题。
答案 1 :(得分:2)
其中一个问题是你正在截断并进行整数除法:
average[i]
是一个浮点数,但是你间接地将它分配给total
,这是一个int,导致截断。这也意味着你以后要进行整数除法。
将total
更改为浮动。
你也没有初始化它,所以:
float total = 0;
答案 2 :(得分:0)
好吧,最大的问题是#define max不等于10,这搞砸了大部分答案。
答案 3 :(得分:0)
我尝试修复您的计划:
}
个
编译错误 不发布无法编译的代码! int
添加到主变量并将变更更改为int
运行时错误(SIGSEGV) - 可能程序试图读取太多行您仍然需要查看输出是否正确,如果不是,则修复任何逻辑错误。