为什么我的C 代码无法计算整数的最大和最小值
Why is my C++ code wrong to calculate the maximum and minimum of integers?
我正在学习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>
中的max
和min
功能。
这将是您的程序:
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);
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用递归的数组的最小值.这是怎么回事
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 如何使此递归函数从给定的起始位置返回最小的整数?
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- txt 文件中浮点数的最大和最小值
- 余数运算符的等效操作,用于处理低于允许的最小值
- 需要使用模板查找数组的第二个最小和最小值
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 将最小值整数转换为无符号长整型
- 为什么我的C 代码无法计算整数的最大和最小值
- 如何显示从文件中读取的整数的最小值和最大值
- 从2个无符号整数中获取最小值
- 使用reinterpret_cast强制转换导致:OverflowError:带符号整数小于最小值
- 有符号整数类型的最小值和最大值之间关系的C++标准保证是什么
- 哪个函数决定两个整数的最大值或最小值?