C++程序来查找输入数字的最小/最大值

C++ program to find min/max of inputted numbers

本文关键字:最大值 数字 程序 查找 输入 C++      更新时间:2023-10-16

我需要创建一个C++程序来查找用户输入的一组特定数字的最小值和最大值。但是,我无法正确获得最小值和最大值。我已经搜索了堆栈溢出,但我们还没有过去,我的教授要求我们使用 if 语句来生成程序,而不是任何预先存在的函数。

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() 
{
int counter = 0;
int digit;
int numdigits;
int min = 0;
int max = 0;
cout << "How many integers would you like to enter?" << endl;
cin >> numdigits;
if ( numdigits == 1 )
{
cout << "Please enter " << numdigits << " integer." << endl;
}
else if ( numdigits > 1 )
{
cout << "Please enter " << numdigits << " integers." << endl;
}
for ( counter = 0 ; counter < numdigits ; counter++ )
cin >> digit;
if ( digit > max )
max = digit;
if ( digit < min )
min = digit;;
cout << "min: " << min << endl;
cout << "max: " << max << endl;
return 0;
}

我以前使用过 VIM,但已经切换到 CLion。我是一名全新的CS学生,我全职工作,完全意识到我的代码不是那么好,请耐心等待。输出工作正常,但无论数字如何,我每次都得到"0"作为最小值。我很感激关于我的代码的任何其他建议!

代码中存在三个问题。

首先是你没有在 for 循环中包含大括号,所以如果 max/min 语句没有在 for 循环中计算。更正后的代码是:

for ( counter = 0 ; counter < numdigits ; counter++ )
{
cin >> digit;
if ( digit > max )
{
max = digit;
}
if ( digit < min )
{
min = digit;;
}
}

最好始终对循环和 if 语句使用大括号,除非您将语句放在一行上,因为这可以防止在向语句正文添加第二行并忘记添加大括号时出现错误。例如:

if ( a ) std::cout << "test";

是安全的,但:

if ( a )
std::cout << "test";

很容易意外修改为:

if ( a )
std::cout << "test";
std::cout << "test2";

代码中的第二个问题是最小值和最大值的初始化。由于 min 设置为 0,因此只有在您输入小于 0 的数字时才会减小。由于max也设置为0,因此如果您只输入负数,则不会产生正确答案。解决方案是将 min 初始化为大于可能输入的数字,并将 max 初始化为小于可能输入的数字。在 c++ 中执行此操作的正确方法是使用std::numeric_limits

#include <limits>
int min = std::numeric_limits<int>::max();
int max = std::numeric_limits<int>::min();

这会将最小值设置为2^31-1,将最大值设置为-2^31(假设您使用的是具有 32 位整数的平台(,这意味着您可以输入的任何可能输入都会为您提供正确答案。

最后一个问题是,您没有检查从std::cin读取是否成功。例如,如果您键入一个字母而不是一个数字作为输入,您的程序将继续并且不会要求另一个数字。用于请求numdigits的更正代码可能如下所示:

int numdigits = 0;
while ( numdigits == 0 )
{
cout << "How many integers would you like to enter?" << endl;
cin >> numdigits;
if ( !cin.good() )
{
cin.clear();
cin.ignore();
cout << "Please enter a number" << endl;
numdigits = 0;
}
}

阅读digit时,您需要进行相同的更正。

最大的问题是你的if语句不正确。正确的语法如下:

if(condition({code run if condition is true}

不:

如果(条件( 要运行的代码

代码不是太糟糕,但是您可能想要重命名变量。我的建议是切换到 do while 循环。这允许您循环访问代码,并在代码运行后检查条件。

使用此循环可以指定更多内容,并且在我看来更通用。循环是我看到大多数问题的地方,除非您在代码中的其他地方有一些未定义的变量。

尝试使用转义键,它们对结束行非常有效。""比 endl 容易得多,您可以放置多个转义键来跳过多行。