如何在while循环中找到最大值和最小值 - c

Posted

技术标签:

【中文标题】如何在while循环中找到最大值和最小值 - c【英文标题】:How to find max&min in while loop - c 【发布时间】:2019-03-12 09:55:09 【问题描述】:

我知道这对你来说是很容易的问题,但对我作为初学者来说却很难。去做事情。我必须创建一个程序,该程序将需要尽可能多的数字,然后从中写入最大值和最小值。数字可以有小数,所以这就是为什么要加倍。就我在循环开始之前遇到的麻烦而言,一切都很好。我总是在最小值和最大值的输出上得到 0。有谁知道为什么? 代码:

 main() 
  int a = 0, b = 0, min = 1000, max = 0;
  printf("How many numbers do you want to enter\n");
  scanf("%d", & a);
  b = a;
  double n[b];
  printf("Write those numbers\n");
  for (b = 0; a > b; b++) 
    scanf("%lf", & n[b]);
  
  b = 0;
  while (1) 
    if (n[b] < n[b + 1])
      max = n[b + 1];
    if (min > n[b])
      n[b] = min;
    b++;
    if (b == a)
      break;
  
  printf("Minimum: %lf\nMaximum: %lf", min, max);

【问题讨论】:

为什么是minmax int 而不是double min = 1000, max = 0 是你真正的极限吗?也许你应该使用double min = DOUBLE_MAX, max = DOUBLE_MIN ... 甚至max = -DOUBLE_MAX 如果您使用 gcc 或 clang 进行编译,您会收到一条警告,告诉您为什么您的 printf 语句打印为零。 根本没有注意到,我是不是很笨哈哈...现在可以了,谢谢!祝你有美好的一天! 【参考方案1】:

有多个问题:

    您将min 定义为1000,如果输入的所有数字都大于该值怎么办? minmax 也应该是双打 当b == a 使用n[b + 1] 时,您将追求数组边界

解决这个问题的最佳方法是在一个循环中计算最小值/最大值,如下所示:

main() 
    int i, len;
    double tmp, min = NAN, max = NAN; // its better to initialize values to NAN to cover case when len is 0
    printf("How many numbers do you want to enter\n");
    scanf("%d", & len);
    for (i = 0; i < len; ++i) 
        scanf("%lf", & tmp);
        if ((i == 0) || (tmp < min)) min = tmp;
        if ((i == 0) || (tmp > max)) max = tmp;
    
    printf("Minimum: %lf\nMaximum: %lf\n", min, max);

【讨论】:

需要初始化minmax 如果最小值和最大值已经初始化,则不需要i==0 测试。 他正在初始化它们:在循环中i == 0 @FiddlingBits 不,因为我在循环中使用 (i==0) @PaulOgilvie 不,因为 len 可以是 0【参考方案2】:

使用double 的转换说明符打印int 不是一个好主意,但会调用臭名昭著的未定义行为。

编译器可能已经注意到了这一点。如果没有,则提高其警告级别。对于 GCC,请使用 -Wall -Wextra -pedantic

因此,要解决此问题,请将 minmax 设为 double

  int a = 0, b = 0;
  double min = 1000., max = 0.; /* Such initialisations limit your input. */

或将它们保留为int(降低准确性),并按原样打印,即int

  printf("Minimum: %d\nMaximum: %d\n", min, max);

【讨论】:

【参考方案3】:

我知道我迟到了,但我认为这是执行此计划的最佳方式

#include <stdio.h>

int main() 
    int a = 0;
    int counter = 0;
    double min;
    double max;
    int counter = 1;
    printf("How many numbers do you want to enter\n");
    scanf("%d", & a);
    double val;
    printf("Write those numbers\n");
    scanf("%lf", & val);
    min = val;
    max = val;
    while(counter < a)
      
        scanf("%lf", & val);
        if(val < min)
        
            min = val;
        
        if(val > max)
        
            max = val;
        
        counter++;
    
    printf("Minimum: %lf\nMaximum: %lf\n", min, max);
    return 0;

这将通过首先将最小值和最大值设置为第一个值来连续读取值。我是 c++ 程序员而不是 ac 程序员,但这似乎是一个更好的主意。

【讨论】:

以上是关于如何在while循环中找到最大值和最小值 - c的主要内容,如果未能解决你的问题,请参考以下文章

我想在 for 循环中找到最小值/最大值 [关闭]

Stroustrup C++ 书籍。如何跟踪while循环中哪个整数输入最小和最大?

在while循环中从用户输入中获取最小值

C++ while循环嵌套if语句

在python中找到二维矩阵(二维)中不同列表的最小值、最大值和平均值

如何只进行“n”比较,从文本文件中查找最小值和最大值?