#include <stdio.h>
int main (void) {
int count, value;
double avg, sum;
count = 0;
sum = 0;
printf("please input how many integers you have \n");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
printf("please input your values \n");
scanf("%d", &value);
sum = sum + value;
}
avg = sum / count;
printf("your average is " "%f", avg);
}
示例:计数输入为4
。输入值为7.6, 1, 2, 3
。
我理解for for循环scanf
首先看7.6
,但忽略小数点,因为它不是有效的输入形式,并将其传递给每个后续scanf
in尽管他们从未真正接受过输入。这导致唯一输入的值为7,但是程序应该继续将7除以4以检索&#34;预期&#34;平均,但事实并非如此。我最终得到了7.000000,我无法弄清楚为什么会这样。
忽略我提示用户输入整数值的事实,即使输入了浮点值,因为它是我的家庭作业的一部分。任何提示或参考我应该学习的东西都很棒
答案 0 :(得分:2)
据我所知,for循环中scanf首先看7.6,但忽略小数点[..]
没有。由于您输入的输入(7.6
)与格式说明符%d
不匹配,因此匹配失败。因此,scanf()
失败了。这就是为什么你应该总是检查所有标准函数的返回码。请参阅7.21.6.2 The fscanf function。
如果您希望能够读取浮点值,那么您应该阅读(更改您的代码)以读取浮点数(或双精度数)。
例如,阅读double
:
double value;
if (scanf("%lfd", &value) != 1) {
/* handle failure */
}
一般建议:如果可能的话,不要使用scanf()
。请阅读Why does everyone say not to use scanf? What should I use instead?以获取进一步说明。
答案 1 :(得分:1)
您的推理似乎是正确的,除了假设scanf
会在后续迭代中将value
设置为零。相反,在读取第一次迭代的时间段并将7分配给value
之后,在后续迭代scanf
上将看到句点,得出结论输入与格式不匹配,而不是触摸{完全{1}},在每次迭代时保持为7。 (它应该在第一次迭代时返回1,在后续迭代时返回0,以指示匹配和分配的项目数)
因此,循环将在每次迭代时添加7,然后除以迭代次数,得到7的结果。