为什么我的C ++代码错误地计算整数的最大值和最小值?

时间:2019-05-22 23:01:44

标签: c++

我正在学习C ++编程语言,并且是一个初学者。我必须编写代码,以便用户输入一系列整数,每当他输入-99时,这都应该表示该序列的结尾,然后我的程序需要找到最小和最大的整数。我最初想出了这个解决方案

#include <iostream>
using namespace std;
int main()
{
    int k=0, number, maximum, minimum;
    do
    {
        cout<<"Enter an integer: ";
        cin>>number;
        if (number==-99)
        {
            break;
        }
        if (k==0)
        {
            maximum=number;
            minimum=number;
        }
        if (number>maximum)
        {
            maximum=number;
        }
        if (number<minimum)
        {
            minimum=number;
        }
        k++;
    }
    while(number!=-99);
    cout<<"The smallest entered integer is "
    <<minimum
    <<" and the largest entered integer is "
    <<maximum
    <<endl;
    return(0);
}

并将其发送给我的讲师,并询问是否有更清洁的方法来执行此操作,但他没有回答。接下来,我更改了程序以使用公式max(x,y)=(x + y + abs(yx))/ 2和min(x,y)=(x + y-abs(yx)查找最大值和最小值))/ 2而不是使用比较。

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int k=0, number, maximum, minimum;
    do
    {
        cout<<"Enter an integer: ";
        cin>>number;
        if (number==-99)
        {
            break;
        }
        if (k==0)
        {
            maximum=number;
            minimum=number;
        }
        maximum=(maximum+number+abs(number-maximum))/2;
        minimum=(minimum+number-abs(number-minimum))/2;
        k++;
    }
    while(number!=-99);
    cout<<"The smallest entered integer is "
    <<minimum
    <<" and the largest entered integer is "
    <<maximum
    <<endl;
    return(0);
}

但是这次我的讲师回答,他唯一说的是那是错的。我已经对我的两个代码进行了几次测试,它们向我显示了正确的结果,所以我不知道讲师说的错误是什么意思。有人可以让我知道为什么上面两个代码中的任何一个是错误的,为什么吗?

4 个答案:

答案 0 :(得分:1)

两个程序都可以正常工作。如果您希望它比它更清洁,可以执行以下操作:

  • 在使用number之前,请检查输入是否成功。您可以通过将输入操作置于while循环中来完成此操作。
  • 只需使用max中的min<cmath>函数。

这将是您的程序:

int main() {
  int number = -100, maximum = -99, minimum = 99;
  while (cin >> number && number != -99) {
    maximum = max(maximum, number);
    minimum = min(minimum, number);
  }
  if (number == -99) {
    cout << "The smallest entered integer is "     << minimum
         << " and the largest entered integer is " << maximum << endl;
  }
}

答案 1 :(得分:1)

有几种方法可以解决此问题。一种方法是在最初的示例中检查k的值,以验证是否实际输入了值以及最小和最大值是否已初始化。

一种可能会给您的讲师印象深刻的方法是将最小值和最大值初始化为可以产生正确结果的值。 std :: numeric_limits提供整数的最小值和最大值。使用此方法,您可以按照以下方式实现某些目标:

#include <iostream>
#include <limits>
#include <algorithm>

int main()
{
    int number;
    int maximum = std::numeric_limits<int>::min();
    int minimum = std::numeric_limits<int>::max();
    while ((std::cin >> number) && (number != -99))
    {
        maximum = std::max(maximum, number);
        minimum = std::min(minimum, number);
    }
    if (std::cin)
    {
        if ((maximum != std::numeric_limits<int>::min()) || (minimum != std::numeric_limits<int>::max()))
        {
            std::cout << "maximum = " << maximum << std::endl;
            std::cout << "minimum = " << minimum << std::endl;
        }
        else
        {
            std::cout << "No number entered" << std::endl;
        }
    }
    else
    {
        std::cout << "Errorr reading the number" << std::endl;
    }
}

答案 2 :(得分:0)

第二个代码段中使用的公式在数学上是正确的,但是如果在计算机编程中使用变量范围有限,则存在缺点。

第一个代码段适用于整个可表示的整数集(出于明显原因,<!DOCTYPE html> <html> <body> <h1>The XMLHttpRequest Object</h1> <button type="button" onclick="loadDoc()">Request data</button> <p id="print"></p> <script> function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var response = JSON.parse(this.responseText); document.getElementById("print").innerHTML = response.result; } }; xhttp.open("GET", "http://'ip-address':8080/simpleweb/jsonrpc", false); xhttp.send(); } </script> </body> </html> 除外)。

第二个代码段不适用于绝对值大于-99的输入,因为计算会溢出。

别觉得不好,这个错误一点也不明显,很多程序员都忽略了它。有关相关示例,请参见:

不幸的是,如果您在处理不受信任的输入的代码中存在此类错误,则范围检查可能会失败并导致安全漏洞。因此,不要仅仅因为“我从不期望输入那么大”而忽略它。

答案 3 :(得分:-1)

    #include <iostream>
    #include <cmath>
    using namespace std;
    int main()
    {
        int number, maximum=0, minimum=0;
        bool isDirty = false;
        do
        {
            cout<<"Enter an integer: ";
            cin>>number;
            if(number!=-99){
               if(isDirty==false) {
                 isDirty = true;
                 minimum = maximum =number;
               } else {
                  if (number < minimum) { 
                    minimum = number;
                   } 
                   if (number > maximum){ 
                     maximum = number;
                   }

                 } 
            }
        }
        while(number!=-99);

        cout<<"The smallest entered integer is "
        <<minimum
        <<" and the largest entered integer is "
        <<maximum
        <<endl;
        return(0);
    }