【问题标题】:Print biggest and smallest numbers ,until -1 is given [duplicate]打印最大和最小的数字,直到给出-1 [重复]
【发布时间】:2018-12-29 06:49:36
【问题描述】:

它可以工作,但如果您不输入任何小于 0 的数字,它不会打印较小的值并打印 0。

int max = 0;
int min = 0;
int a;

printf("Enter a number:\n");
scanf("%d", &a);

while (a != -1){
        if (a < min){
            min = a;
        }

        if (a > max){
            max = a;
        }
        scanf("%d", &a);
}
printf("Your largest number is %d. Your smallest number is %d.", max, min);

【问题讨论】:

  • 只有小于零的数字才小于零,所以如果将min初始化为0,但输入的值都是正数,则无法正确记录最小值。 (如果所有的值都小于-1,你也不会正确初始化max!)在你读取第一个值之后使用min = max = a;会更好。或者,将min 初始化为INT_MAX,从&lt;limits.h&gt;max 初始化为INT_MIN

标签: c if-statement while-loop int


【解决方案1】:

这是因为您的初始 min 为零,所以 no 正值将小于该值。

你最好改变你的循环结构,以便无论如何都加载初始值,例如:

int a, min = 0, max = 0, first = 1; // Force first number to be used.
printf ("Enter a number:\n");
scanf ("%d", &a);
while (a != -1) {
    if (first || a < min) min = a;
    if (first || a > max) max = a;
    first = 0;                      // Reset after first number.
    scanf ("%d", &a);
}
printf ("Largest is %d, smallest is %d.\n", max, min);

您或许应该检查scanf 的返回值,以便捕获非整数输入。这是一种拥有更健壮代码的方法,但对于教育项目,它可能没问题(至少只要您了解其中的含义)。

这可以像替换一样简单:

scanf ("%d", &a)

类似:

if (scanf ("%d", &a) != 1) {
    puts ("Invalid input.");
    exit(1);
}

【讨论】:

  • 删除first 并初始化min = INT_MAXmax = INT_MIN(当然是来自&lt;limits.h&gt;)?或者只是在循环外的scanf() 之后设置min = max = a;(再次删除first)?
猜你喜欢
  • 2020-03-10
  • 2019-10-17
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多