添加浮点值不正确

时间:2017-02-19 23:59:51

标签: c floating-point

此任务的要求如下:

  • 从stdin读取浮点值,每个值由换行符分隔,并以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;
}

1 个答案:

答案 0 :(得分:2)

您忘了将total初始化为0

补充说明:

  • 无限循环的经典C语言是for (;;) { ... }
  • flag应定义为int
  • 您应该在flag != 1而不是flag == EOF时停止循环。无效的输入将导致程序无休止地循环。您实际上可以完全删除此变量。
  • big初始化为0而将small初始化为1000000是不正确的:如果所有值均为负数会怎样?如果他们都非常大会怎么样?

以下是更正后的版本:

#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;
}