【问题标题】:While loop will not print the smallest number enteredWhile 循环不会打印输入的最小数字
【发布时间】:2020-05-04 02:16:00
【问题描述】:

我正在创建一个程序,该程序使用 while 循环从用户给出的输入中提供多条信息。其中一件是输入的最小数字。我不能让它打印除 0 以外的任何东西。知道为什么吗?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float num, sum = 0, sm, lg = 0, count = 0, avg = 0;

    printf("Please enter a series of numbers (-1 to terminate): ");
    scanf("%f", &num);

    while(num > -1){
        sum += num;
        if(lg < num)
        lg = num;
        if(sm > num)
        sm = num;
        scanf("%f", &num);
        count++;
        avg = sum / count;
    }

    printf("The sum of your numbers is: %.4f\n", sum);
    printf("You entered %.4f numbers\n", count);
    printf("The average of the numbers you entered is: %.4f\n", avg);
    printf("The smallest number you entered is: %.4f\n", sm);
    printf("The Largest number you entered is: %.4f", lg);
    return 0;
}

前条目 - 15 43 22.5 57.6 -1 输出- 总和:138.1000 输入了 4 个数字 平均:34.5250 最小:0.0000 最大:57.6000

【问题讨论】:

  • 请注意,如果输入的最大值为负数(换句话说,所有值都是负数),您的代码将无法正确处理最大数 - 但您会得到一个非零的最小值。您没有正确初始化最小的数字。最好使用第一个条目作为最小值和最大值的初始值——然后一切都会起作用。当您第一次在循环外调用 scanf() 时,这很简单。每次调用时不要忘记检查scanf() 是否成功。或者,由于您使用 float,因此使用 +∞ 和 -∞ 来初始化最小和最大的初始化器。
  • 计算每次迭代的平均值没有多大意义;等待输入完成。

标签: c


【解决方案1】:

在您的代码中,sm 有一个 undefined 值,因为您没有对其进行初始化。您可以将其初始化为一个非常大的数字(或者,甚至更好,INFINITY),以便可以正确比较它。 lg 也是如此:如果您希望它也适用于负值,您应该使用非常小的值 (-INFINITY) 对其进行初始化。您可以通过包含math.h 来使用INFINITY。

【讨论】:

  • 由于它们是浮点数,可能 +∞ 表示最小的,-∞ 表示最大的,是很好的初始化器。
  • 好评。我正在更新我的答案
【解决方案2】:

发布的代码无法编译!

首先,因为它缺少所需的头文件所需的#include 语句。具体来说:

#include <stdio.h>  

那么关于这个代码块:

if(sm > num)
    sm = num;

在第一次通过while() 循环时,变量sm 未初始化,因此访问其内容是未定义的行为。

另外,如果在debug 模式下使用Visual Studio,那么所有的堆栈都会被清零,所以不会有其他值被分配给它。这就是为什么算法总是返回 0

【讨论】:

    【解决方案3】:

    这是我认为可行的程序。它使用double 而不是float;如果您坚持,您可以更改类型和(输入)格式以满足您的需求。它对接受的行数没有特别限制。如果没有输入,它不会输出任何内容。绝对不需要使用数组进行计算。它使用 use +∞ 和 -∞ 分别初始化最小 (min) 和最大 (max) 值。即使唯一的输入是 +∞ 或 -∞(拼写为 +Inf 或 -Inf,或 +Infinity 或 -Infinity,也可以选择不带 + 符号,以及大写、小写或混合 -大小写)产生正确的值。

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        double min = +INFINITY;
        double max = -INFINITY;
        double sum = 0.0;
        size_t cnt = 0;
        double value;
    
        while (scanf("%lf", &value) == 1)
        {
            sum += value;
            cnt++;
            if (value > max)
                max = value;
            if (value < min)
                min = value;
        }
    
        if (cnt > 0)
        {
            printf("Count   = %zu\n", cnt);
            printf("Sum     = %g\n", sum);
            printf("Min     = %g\n", min);
            printf("Max     = %g\n", max);
            printf("Average = %g\n", sum / cnt);
        }
    
        return 0;
    }
    

    给定-1E6 和+1E6 之间的十个随机值:

     989375.672
    -826955.668
     224850.463
    -401605.702
     -45457.787
     259618.099
     821069.496
    -268408.724
    -512449.113
     -46404.246
    

    程序产生输出:

    Count   = 10
    Sum     = 193632
    Min     = -826956
    Max     = 989376
    Average = 19363.2
    

    我可能应该对输出格式进行更多控制,但%g 选项对于范围广泛的数字非常有用。给定输入数据,使用%11.3f 效果很好(它用于格式化我使用的随机数生成器的输出)。

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2021-11-24
      • 2016-06-13
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多