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

时间:2018-07-07 06:28:58

标签: c++

我需要创建一个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”。我对我的代码还有其他建议!

2 个答案:

答案 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容易得多,您可以放置​​多个转义的键来跳过多行。