很抱歉这样的新手。
对于这个问题,我使用了C语言,以及库stdlio.h和stdlib.h。
所以有一个问题要求我:
文本文件' numbers.txt'保持整数:5,10,15,20,25。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a, num, sum = 0;
float avg;
for (a = 0; a < 6; a++) {
fscanf(n, "%d", &num);
sum = sum + num;
}
avg = sum / (a - 1);
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
问题的另一个变体是我需要使用while循环来读取文本文件中的整数。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a = 0, num, sum = 0;
float avg;
while (fscanf(n, "%d", &num) != EOF) {
fscanf(n, "%d", &num);
sum = sum + num;
a++;
}
avg = sum / a;
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
当我运行上述每个程序时,我希望输出:
Sum = 75
Average = 15.00
但是我得到了这个(对于第一个代码):
Sum = 100
Average 20.00
这个(对于第二个代码):
Sum = 55
Average = 18.00
我如何从这两个程序中获得正确的输出?
我再次为这个问题的基本内容道歉。尽管如此,任何帮助都将受到赞赏。
答案 0 :(得分:0)
在第一个中,您试图读取一对多的数字,但由于只有5个数字,最后一个数字被添加到您的总和两次,因此您最终添加了额外的25
得到100分。
在第二个代码中,在读完最后一个数字后,文件的末尾已到达,因此您的代码没有机会添加上次读取的数字,因此您错过了向您的总和添加25
。
您与第一个代码的距离越近,只需将for循环更改为仅迭代5次
答案 1 :(得分:0)
这是我的观察,
案例2 :问题在于以下两行代码
while (fscanf(n, "%d", &num) != EOF) { /* this is fine, scanf() stored read int into num */
fscanf(n, "%d", &num); /* this is not needed as overwrites previous num, just remove it */
/* some code */
}
也是这个
avg = sum / a;
无法获得预期结果,因为sum/a
会产生整数,但您将其分配给avg
float
。解决这个问题的一种方法是进行类似下面的类型转换
avg = (float)(sum / a);
示例代码:
int main(void) {
FILE *n;
n = fopen("numbers.txt", "r"); /* always do error handling to make more robust code */
if(n == 0) {
@TODO error handling */
}
int a = 0, num, sum = 0;
float avg;
while (fscanf(n,"%d", &num) != EOF) {
//fscanf(n, "%d", &num);// remove this
sum = sum + num;
a++;
}
avg = (float)(sum / a);// typecast it
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
return 0;
}
案例1:此处
for (a = 0; a < 6; a++)
旋转循环固定次数可能不是现在的问题,但是当你事先不知道有多少整数文件时它会产生问题。所以更好的旋转循环直到EOF
。例如
for (a = 0; ; a++) {
if(fscanf(n, "%d", &num) == 1) /* compare with return value */
sum = sum + num;
else
break;
}