完成以下程序以找到阵列中最接近平均值的数字。例如,阵列{2,4,6,3,9,10}的平均值为5.666667,阵列中最接近平均值的数字为6.注意,最接近的数字可以大于或小于平均值。
#include <stdio.h>
#include <math.h>
int main()
{
int i;
double num[6],average, sum=0, closest;
printf("Enter 6 doubles\n"); //2,4,6,9,3,10
for (i=0; i<6; i++)
scanf("%lf",&num[i]);
//professor's code
for (i=0; i<6; i++)
sum += num[i]; //sum=34
average=sum/6; //5.6666667
closest = num[0]; //why are we even using this??? //initialize?
for (i=0; i<6; i++)
if(fabs(num[i]-average) < fabs(closest-average)) //|6-5.7|<|0-5.7|-> 0.7<5.7->true
closest = num[i]; // why is it giving 6??
//where is it being rounded to the closest number??
//professor's code ends
printf("Closest is %lf\n", closest);
return(0);
}
//Output:
//Closest is 6
您的标题和代码注释表明您认为程序(始终)返回最接近其输入平均值的整数。它不是。它返回最接近所有输入平均值的输入。如果所有输入都是整数,那么这当然是一个整数,但是你将它们作为浮点数输入,所以它们不必是整数。因此,输出也不必是一个。
例如,如果这些输入显示在您的程序中:
1 2 2 2 2 1.8
,它会接受它们并输出
最近的是180万
。此外,输出并不一定特别接近平均值。例如,尝试以下输入:
1 1 1 1 1 1000000
。你应该得到
最近的是1.000000
。这是一个完整的数字,但它错过了大约166666的平均值。
关于代码中嵌入的问题:
closest = num[0]; //why are we even using this??? //initialize?
紧跟在代码中的循环后面的循环查找比closest
更接近平均值的输入。如果没有为closest
赋值,那么这是没有意义的,如果closest
不包含等于其中一个输入的值,则可能导致错误的结果。当然,closest
以与num[0]
相同的值开头,如果循环开始在索引1而不是索引0处测试,则输出将是相同的。
//where is it being rounded to the closest number??
它没有四舍五入。此时,closest
已经包含一个等于其中一个输入的值。它不需要四舍五入,事实上,在许多情况下,舍入会产生不属于输入的结果。