【问题标题】:Printing min and max using a EOF loop使用 EOF 循环打印最小值和最大值
【发布时间】:2016-10-06 13:39:06
【问题描述】:

我很难编写一个从标准输出读取实数并确定与之前读取的所有其他数字相比该数字是最大还是最小的 C 程序。程序应该读取另一个实数,直到 EOF 发生。以下是我对这个问题的尝试:

#include <stdio.h>
int main()
{
    double maximum = 0, minimum = 0, number;
    while (number != EOF) {
        printf("Enter a number: ");
        scanf("%lf", &number);
        printf("%d", EOF);
        if (number > maximum) {
            maximum = number;
        }
        else if (number < minimum) {
            minimum = number;
        }
    }
    printf("\n Max number is: %lf", maximum);
    printf("Min number is: %lf", minimum);
    return 0;
}


挑战是我不允许使用数组。

【问题讨论】:

  • 请注意。您无法从标准输出中读取。
  • 建议“从标准输出读取实数”-->“从标准输入读取实数”
  • 这怎么行?编译失败了吗?它会给出错误的答案吗?您是否尝试在调试器中查看它?

标签: c loops while-loop max min


【解决方案1】:

您的代码有几个问题:

  1. number 在第一次迭代之前未初始化。
  2. scanf 期望参数是一个指针,你传入
  3. 另外,我认为最小值不是 0(负数呢?),并且 最大值不应为 0。
  4. 如果所有数字都相同怎么办?你 没有得到正确的分钟

检查输入结束的方法有很多,我选择显式使用feof

试试这样的代码:

#include <float.h>
#include <stdio.h>
int main()
{
    double maximum = -DBL_MAX, minimum = DBL_MAX, number;
    while (!feof(stdin)) {
        printf("Enter a number: ");
        scanf("%lf", &number);
        if (number > maximum) {
            maximum = number;
        }
        if (number < minimum) {
            minimum = number;
        }
    }
    printf("\n Max number is: %lf", maximum);
    printf("Min number is: %lf", minimum);
    return 0;
}

不过,您需要改进错误管理。

【讨论】:

  • 对于 STDIN,我需要包含哪个库?
  • maximum = DBL_MIN --> maximum = -DBL_MAXDBL_MIN 是最小的幅度数 > 0。不是最不重要的double
  • 我生锈的 C,谢谢@chux。更改了代码以反映您的评论
  • 注意:使用scanf() 的返回值比使用feof() 更好。如果用户输入"x",此代码将进入无限循环。
猜你喜欢
  • 2021-07-09
  • 2015-02-20
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2019-05-26
  • 2020-03-28
  • 2021-11-27
  • 2020-09-06
相关资源
最近更新 更多