【问题标题】:How can I average these user inputs?如何平均这些用户输入?
【发布时间】:2017-07-13 05:48:35
【问题描述】:

程序按预期进行,提示用户输入年龄,直到用户输入“-1”。一旦用户输入这个,程序就会告诉你最大的、最小的和平均的。除了我不确定如何平均输入之外,我一切正常,感谢任何帮助!

更新:感谢所有提供帮助的人,我已经更新了代码。唯一剩下的就是我没有得到正确的平均值。我已经包含了更新的代码。

#include<stdio.h>
int main()
{
    int n, large, small;
    int sumOfAges = 0;
    double averageAge = 0.0;
    int Num = 0;
    printf("Enter an age: \n");
    scanf("%d", &n);
    large = n;
    small = n;



    while(n != -1)
    {
        printf("Enter an age: \n");
        scanf("%d",&n);
        if (n>large)
        large = n;
        if(n < small && n != -1)
        small = n;
        sumOfAges += n;
        Num++;
    }

     averageAge = (sumOfAges/Num);

    printf("\n The largest age is %d", large);
    printf("\n The smallest age is %d", small);
    printf("\n The average age is %lf", averageAge);
    return 0;
}

【问题讨论】:

  • 你知道平均值是怎么计算的吗?
  • 你已经有了循环。您只需要多出 2 个变量,一个用于求和(添加 n),第二个用于计算多少个数字(添加 +1)。然后显示计算结果(不要忘记转换为float或double,避免四舍五入)。
  • 我没有讽刺,只是想指导你而不是给出答案。那么你需要计算平均值吗?总和和元素的数量。你知道如何计算这些吗?
  • @chqrlie "Pointers" 在帮助中,而不是 C 意义上的指针:D
  • 请注意,您会将 -1 视为循环体中的有效值(并且它可能是最小值,除非用户首先输入 -2 或其他负值。如很多时候,难点在于验证用户的输入。你还应该测试scanf()的结果——如果用户输入age 10,你的程序会运行很长时间(因为a不是数字,所以它留给下一个输入操作读取,它发现它不是一个数字,所以......)。你需要做一些适度的修改以避免这些问题。

标签: c loops while-loop


【解决方案1】:

要计算平均值,您应该累积所有年龄并将它们除以输入的年龄数。

程序可以如下所示

#include <stdio.h>

int main(void) 
{
    int largest, smallest;
    int n, total;

    n = 0;
    total = 0;

    while ( 1 )
    {
        int age;

        printf( "Enter an age (-1 - exit) : " );

        if ( scanf( "%d", &age ) != 1 || age == -1 ) break;

        if ( n++ == 0 )
        {
                largest = smallest = age;
        }
        else if ( largest < age )
        {
                largest = age;
        }
        else if ( age < smallest )
        {
                smallest = age;
        }

        total += age;
    }

    if ( n != 0 )
    {
        printf( "\nThe largest age is %d", largest );
        printf( "\nThe smallest age is %d", smallest );
        printf( "\nThe average age is %d\n", total / n );
    }

    return 0;
}

它的输出可能看起来像

Enter an age (-1 - exit) : 10
Enter an age (-1 - exit) : 20 
Enter an age (-1 - exit) : 15 
Enter an age (-1 - exit) : 16 
Enter an age (-1 - exit) : 25
Enter an age (-1 - exit) : 21
Enter an age (-1 - exit) : -1

The largest age is 25
The smallest age is 10
The average age is 17

在这种情况下,我认为将平均年龄输出为双精度值不是一个好主意。但是,如果您愿意,可以将变量 total 声明为 double 类型。:)

【讨论】:

    【解决方案2】:

    要在这种情况下找到平均值,您需要确定 N 的值,即您希望在 while 循环中找到平均值(作为浮点值)的年龄值的数量,以及将每个新年龄(作为整数值)添加到总年龄值中,同时存储 N 和年龄总和以及 smallestlargest

    //...your vars
    int sumOfAges = 0;
    double averageAge = 0.0;
    int N = 0;
    
    while(age != -1)
    {
      printf("Enter an age: \n");
      scanf("%d",&age);
        if (age != -1){
            if (age>max)
               max = age;
            if(age < min)
               min = age;
    
            sumOfAges += age;
            N++;
        }
    }
    

    然后,计算平均值为averageAge = ((double)sumOfAges/N);

    【讨论】:

    • 不要使用Nn 作为变量名。使用有意义的名称。
    • 'N' 常用于统计,因此有意义。为什么在其应用中否认该领域的历史?
    • 仅在 case 不同的标识符往往比文本不同的标识符更难理解/区分。使用agen 将有助于将nN 分开。
    • 到目前为止,这已经奏效了。除了结果没有给出预期的平均值。我将使用新代码更新原始帖子。非常感谢您的帮助
    • @chux,抱歉
    【解决方案3】:

    在您的 while 语句中,您应该跟踪输入的数量以及输入的总值

     int numberOfInputs = 0;
     int totalValue = 0;
    
     while(n != -1)
     {
         numberOfInputs++;
         totalValue += n;
         // Your other While-loop code here
     }
    

    totalValue 除以 numberOfInputs 得到的平均值。

    float Average = (float)totalValue/numberOfInputs;
    

    请注意,我将其转换为浮点数,因此计算是在浮点数中完成的,而不是整数,算术。

    【讨论】:

    • 你的意思是'total/numberOfInput?'
    • 我不是反对者,但你有一个无限循环......而且你的平均公式不正确(乍一看并不明显;-)
    • 1) 不要在答案正文中询问投票。这是无关的。 2)是的,必须解释否决票,否则没用。 3)我可以想到这个DV(不是我的)的几个原因:a)给出一个微不足道的答案而不是教给OP一些东西。 b) 使用(可能)未初始化的变量。 c) 如前所述 - 无限循环
    • @EugeneSh,抱歉不得不在正文中提问,我没有代表发表评论。现在我知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多