我需要创建一个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”。我对我的代码还有其他建议!
答案 0 :(得分:0)
您的代码中存在三个问题。
首先,您没有在for循环中包含花括号,因此,如果未在for循环内评估max / min语句。正确的代码是:
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();
这会将min设置为2^31-1
,将max设置为-2^31
(假设您使用的是32位整数的平台),这意味着您可以输入的任何可能的输入都会为您提供正确的答案。 / p>
最后一个问题是您没有检查对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
时,您需要进行相同的更正。
答案 1 :(得分:-4)
最大的问题是您的if语句不正确。正确的语法如下:
if(condition){如果条件为真,则代码运行}
否:
如果(条件) 要运行的代码
代码不太糟糕,但是您可能想重命名变量。我的建议是切换到do while循环。这样,您就可以迭代代码并在代码运行后检查条件。
使用此循环可以指定更多内容,我认为使用起来更加灵活。循环是我看到的大多数问题的地方,除非您在代码的其他位置有一些未定义的变量。
尝试使用转义键,它们在结束行时非常有效。 “ \ n”比endl容易得多,您可以放置多个转义的键来跳过多行。