【问题标题】:Addition of Float Values is incorrect浮点值相加不正确
【发布时间】:2017-02-19 23:59:51
【问题描述】:

此任务的要求如下:

  • 从标准输入读取浮点值,每个值由换行符分隔,并以 EOF 终止。
  • 输入值的范围是 [-100,000 到 +100,000]。
  • 输入将包含至少一个浮点值。
  • 输入可能包含空行:这些应该被忽略。
  • 除了可能的空行之外,输入的其他方面都是格式正确的。

在EOF,输出:

  • 看到的最小值
  • 看到的最大值
  • 看到的所有值的算术平均值

全部精确到小数点后两位。 输出值必须由一个空格字符分隔,后跟一个换行符。

例子:

输入:

7
5.6
6

输出:

5.60 7.00 6.20

输入:

11

输出:

11.00 11.00 11.00

在我的代码中,当我输入 7、5.6 和 6 时,我的输出是 5.60 7.00 5.77。 我知道问题出在哪里,但不知道如何解决。我的总变量说它在 EOF 的值是 17.322826,这绝对是不正确的。

#include <stdio.h>

int main() {
    int i = 0;
    float big = 0;
    float small = 1000000;
    float total;    
    float div = 0;

    while (i == 0) {
        float a = 0;
        float flag = scanf("%f", &a);

        if (flag == EOF) {
            printf("%.2f %.2f %.2f %f %f\n", small, big, total / div, total, div);
            break;
        }

        if (a > big) {
            big = a;
        }
        if (a < small) {
            small = a;
        }
        div++;
        total = total + a;
    }
    return 0;
}

【问题讨论】:

  • 首先:阅读您使用的函数的文档! scanf 返回 int,而不是 float
  • 您好,您确定这是导致问题的原因吗?每次设置它时,我都会让它打印到终端“a”的值,并显示正确的值。我相信错误来自浮点值的添加。我每次运行的“总”变量,具有相同的输入,每次都有不同的输出。我将“flag”声明为 int 并且没有变化。
  • 我并没有说这是导致问题的原因,但这将是使用正确类型的开始,您必须阅读文档。 EOF 并不是报告问题的唯一值,这在文档中也很清楚。

标签: c floating-point


【解决方案1】:

您忘记将total 初始化为0

补充说明:

  • 用于无限循环的经典 C 语言习语是 for (;;) { ... }
  • flag 应定义为 int
  • 您应该在flag != 1 时停止循环,而不仅仅是flag == EOF。无效的输入会导致程序无限循环。您实际上可以完全删除此变量。
  • 初始化big0small1000000 不正确:如果所有值都是负数怎么办?如果它们都很大怎么办?

这是一个更正的版本:

#include <stdio.h>

int main(void) {
    float a, big, small, total;
    int div;

    if (scanf("%f", &a) != 1)
        return 1;

    big = small = total = a;
    div = 1;
    while (scanf("%f", &a) == 1) {
        if (big < a) {
            big = a;
        }
        if (small > a) {
            small = a;
        }
        div++;
        total += a;
    }
    printf("%.2f %.2f %.2f\n", small, big, total / div);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2019-12-16
    • 2015-01-25
    • 2016-05-02
    相关资源
    最近更新 更多