【问题标题】:Min and Max Loop最小和最大循环
【发布时间】:2017-01-19 05:29:19
【问题描述】:

我正在为一项任务编写代码,该程序希望我编写一个程序,询问用户他们想要输入的整数数量,然后它接受每个输入,同时测试该值是最大值还是最小值。除了 1 之外,我的程序对于输入的每个整数都运行良好。当我输入 int 1 时,仅记录最大值,即使输入的数字在技术上也是最小值,这是由于 if 语句导致循环在找到后重复如果数字是最大值或最小值,则输出,在这种情况下,数字将始终为最大值,因此测试永远不会再次运行。我怎样才能解决这个问题?

#include <iostream>

using namespace std;

int main()
{
    int input;
    int tmp;
    int counter = 1;
    int max_num=0;
    int min_num;

    //prompt user for integer amount
    cout << "How many integers would you like to enter? " << endl;
    cin >> input;
    cout<< "Please enter " << input << " integers." << endl;

    tmp = input;


//loop for requested amount with a test for each input
    while (counter <= tmp){
        cin >> input;
//if smaller than previous number it is the minimum
        if (input < min_num){
            min_num = input;
            counter++;
        }

// if larger than previous number it becomes max number
        else if (input > max_num){
            max_num = input;
            counter++;
        }


//continue loop if number isn't bigger than max or smaller than min
        else {
           counter++;
        }



    }

//display the max and min
    cout << "min: "<< min_num << endl;
    cout << "max: " << max_num<< endl;;



    return 0;
}

【问题讨论】:

  • 我可以通过将 if 语句嵌套在 min 语句下的 max number 来解决这个问题。但似乎应该有更好的解决方案?
  • 一个提示:当语句必须在每个循环中执行而不考虑条件时,不要将它放在条件中。我说的是counter++。您应该将该语句放在循环的末尾。它将减少代码重复并使您的代码更具可读性和更小。
  • @JosephL.甚至更好:将语句放在循环的开头:for( int counter = 1; i &lt;= tmp; ++ counter) {...}.`
  • 谢谢你们,在我的 linux 服务器上测试这个程序时,我遇到了同样的问题,即使它似乎在我的 windows 机器上修复了?

标签: c++ loops minmax


【解决方案1】:
int max_num = -1;
int min_num = -1
while (counter <= tmp){
        cin >> input;
//if smaller than previous number it is the minimum
        if (input < min_num || min_num == -1){
            min_num = input;
            //counter++; => This operation is carried out in every case. Why not just do it once?
        }

// if larger than previous number it becomes max number
// Else statement not needed here, What if user inputs only one number. It will be both max and min
        if (input > max_num){
            max_num = input;
            //counter++;
        }

//continue loop if number isn't bigger than max or smaller than min
           counter++;
    }

【讨论】:

    【解决方案2】:

    在语句if (input &lt; min_num) 中,min_num 的值未定义,因为您没有为min_num 分配任何值。你想#include &lt;climits&gt; 并将min_num 初始化为INT_MAX

    【讨论】:

    • 或者更C++的方式,包含&lt;limits&gt;并初始化为std::numeric_limits&lt;int&gt;::max()
    【解决方案3】:

    问题的出现是由于 int min_num 的默认值为 0,因为 min_num 是全局变量。在while循环之前添加这行代码,它应该可以正常工作。

    if(input >= 1)
        cin >> min_num;
    tmp = input-1;
    if((input==1)&&(min_num > max_num)){
        max_num = min_num;
        min_num = 0;
    }
    

    如果只添加一个整数,则结果相反。所以我们需要一个错误检查。顺便说一下代码不好。

    【讨论】:

      【解决方案4】:

      试试这个代码

      #include <iostream>
      #include <limits>
      using namespace std;
      
      int main() {
          int n, input, max_num, min_num;
          max_num = numeric_limits<int>::min();
          min_num = numeric_limits<int>::max();
          cin >> n;
          while (n--) {
              cin >> input;
              max_num = max(max_num, input);
              min_num = min(min_num, input);
          }
          cout << "min: " << min_num << "\nmax: " << max_num << endl;
          return 0;
      }
      

      输入

      2
      34
      65
      

      输出

      min: 34
      max: 65
      

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2020-03-19
        • 2016-10-06
        • 2018-09-21
        • 1970-01-01
        • 2016-06-07
        相关资源
        最近更新 更多