我对我的输出感到困惑,该输出给出了用户输入的最接近的平均数。(将小数舍入为整数)

问题描述 投票:0回答:1

完成以下程序以找到阵列中最接近平均值的数字。例如,阵列{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
c loops decimal
1个回答
2
投票

您的标题和代码注释表明您认为程序(始终)返回最接近其输入平均值的整数。它不是。它返回最接近所有输入平均值的输入。如果所有输入都是整数,那么这当然是一个整数,但是你将它们作为浮点数输入,所以它们不必是整数。因此,输出也不必是一个。

例如,如果这些输入显示在您的程序中:

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已经包含一个等于其中一个输入的值。它不需要四舍五入,事实上,在许多情况下,舍入会产生不属于输入的结果。

© www.soinside.com 2019 - 2024. All rights reserved.