为什么我的C 代码无法计算整数的最大和最小值

Why is my C++ code wrong to calculate the maximum and minimum of integers?

本文关键字:最小值 整数 计算 我的 代码 为什么      更新时间:2023-10-16

我正在学习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);
}

并将其发送给我的讲师,并询问是否有一种更干净的方式,但他没有回答。接下来,我更改了此程序以使用公式最大值(x,y(=(x y abs(y-x((/2和min(x,y(=(x y-abs(y-x((y-x((/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);
}

但是这次我的讲师回答了,他唯一说的是这是错误的。我几次测试了我的两个代码,它们向我展示了正确的结果,所以我不知道我的讲师说这是错误的。有人可以让我知道为什么上面的两个代码是错误的,为什么?

您的两个程序都可以正常工作。如果您希望它比以下几点更干净:

  • 在使用number之前,检查输入是否成功。您可以通过将输入操作放在while循环中来做到这一点。
  • 只需使用<cmath>中的maxmin功能。

这将是您的程序:

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;
  }
}

有几种纠正问题的方法。一种是在初始示例中检查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;
    }
}

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

第一个代码段在整个可代表的整数集中工作(-99出于明显的原因除外(。

第二个代码段对于绝对值大于INT_MIN / -2的输入不起作用,因为计算会溢出。

不要感到难过,这个错误一点也不明显,很多程序员都忽略了它。有关相关示例,请参见:

  • 额外的,额外的 - 阅读全部:几乎所有的二进制搜索和合并都破坏了

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

    #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);
    }