【问题标题】:Finding the minumum value out of user inputs in C++从 C++ 中的用户输入中找出最小值
【发布时间】:2019-10-05 18:32:10
【问题描述】:

我的问题是从用户定义的输入数量中找到最小值。到目前为止,一切都很好,除了那个。每次我尝试重新排列一些代码或尝试一种新方法时,我都会在屏幕上不断得到相同的输出:

Sum of numbers entered is:      145.4
Average of numbers entered is:  24.2333
The Highest number entered was: 45
The Lowest number entered was:  6.95283e-310

我每次都会得到这个,不管输入了什么,或者我尝试了什么不同的建议:

The Lowest number entered was:  6.95283e-310

我知道数组的使用和实现。但是,我正在做的任务甚至还没有涵盖数组。那是后面的一些章节。请不要推荐数组...

我看过这里:

Finding Maximum and Minimum values in c++ by user input 没用

http://www.cplusplus.com/forum/beginner/38799/ 没用

更改 max/min 的值也不起作用

#include <iostream>
using namespace std;

int main() 
{

    double number, numberitems, sum = 0, average, max, min;

    cout << "Enter number of items: \n";
    cin >> numberitems;

    //Make sure user can not enter negatives
    if ( numberitems < 0 ) {
        //no request to perform sum
        std::cout << "I said not to enter a negative number... '\n";
        std::cin.clear(); //clear bad input flag
        return 1;
    }

    //Get the user's values
    for (int i = 0; i < numberitems; i++)
    {
        std::cout << "Enter any NON-negative number: ";
        std::cin >> number; 
        std::cout << '\n';


        //Maximum value entered
        if (number > max) {
            max = number;
        }

        //minimum value entered
        if (number < min) {
            min = number;
        }

        //Make sure user can not enter negatives
        if ( number < 0 ) {
            //no request to perform sum
            std::cout << "I said not to enter a negative number... '\n";
            std::cin.clear(); //clear bad input flag
            return 1;
        }

        //Sum of all the numbers
        sum = sum + number;

        //Average of all the numbers
        average = sum / numberitems;


    }
    std::cout << endl;
    std::cout << endl;
    std::cout << "Sum of numbers entered is:      " << sum << '\n';
    std::cout << "Average of numbers entered is:  " << average <<'\n';
    std::cout << "The Highest number entered was: " << max <<'\n';
    std::cout << "The Lowest number entered was:  " << min <<'\n';
    return 0;
}

做了一个临时修复:3

    double min = 99999999999999999999999999999999999999999999999;

我对此很陌生。

更新

阅读更多 cmets 后,我发现我错过了 &lt;cfloat&gt;。使用#include &lt;cfloat&gt; 现在每个人的上述建议都有效。然而,&lt;cfloat&gt; 根本没有在课堂上讲过。所以我不确定这是否可以在这里使用?

#include <iostream>
#include <cfloat>
using namespace std;

int main()
{

    int numberitems;
    double number, sum = 0, average;
    double max = 0;
    double min = DBL_MAX;

    cout << "Enter number of items: \n";
    cin >> numberitems;

    //Make sure user can not enter negatives
    if ( numberitems < 0 ) {
        //no request to perform sum
        std::cout << "I said not to enter a negative number... '\n";
        std::cin.clear(); //clear bad input flag
        return 1;
    }

    //Get the user's values
    for (int i = 0; i < numberitems; i++)
    {
        std::cout << "Enter any NON-negative number: ";
        std::cin >> number;
        std::cout << '\n';


       //Maximum value entered
      if (number >= max) {
            max = number;
          }

       //minimum value entered
       if (number <= min) {
            min = number;
        }

       //Make sure user can not enter negatives
       if ( number < 0 ) {
            std::cout << "I said not to enter a negative number...'\n";
            std::cin.clear(); //clear bad input flag
            return 1;
        }

       //Sum of all the numbers
       sum = sum + number;

       //Average of all the numbers
       average = sum / numberitems;

    }

    //Print the results
    // some cosmetic...
    std::cout << endl;
    std::cout << endl;
    std::cout << "\n=================REPORT====================\n";
    std::cout << '\n';
    std::cout << "\tYour Totals\tValues\n";
    std::cout << "\t-----------\t------\n";

    std::cout << "\t    Sum:        " << sum << '\n';
    std::cout << "\t  Average:      " << average <<'\n';
    std::cout << "\t  Highest:      " << max <<'\n';
    std::cout << "\t   Lowest:      " << min <<'\n';
    return 0;
}

同样,&lt;cfloat&gt; 工作正常,但我不确定我是否可以使用它。还有什么其他方法可以解决这个问题?

【问题讨论】:

  • 例如,minmax 在哪里设置起始值?
  • 为什么不直接把输入放到std::vector这样的容器中,然后在上面使用std::accumulate()std::minmax_element()这样的标准算法呢?
  • double numberitems; -- 为什么这是double?您对输入进行了很多检查,除了我可以为 numberitems 输入“2.4”,这看起来很奇怪。
  • @Bathsheba 我最初给了他们价值。 Max 为 0,Min 为(无论如何),max 会改变,min 不会。这就是我在这里的原因:/
  • @RemyLebeau 这只是 C++ Programming 1 的第 6 章作业。我不知道那些是什么......

标签: c++


【解决方案1】:

这个问题已经得到了很好的答案 - 很快:minma​​x 未初始化

然而

以上内容非常具体。 当然,它在这种特定情况下会有所帮助,但我觉得需要一个更广泛的建议,在这里和许多其他情况下都可以使用。

添加打印输出

在您的代码中添加调试打印输出(“在没有调试器的情况下进行调试”)在这种情况下总是很有帮助的。

例如,在您的示例中添加以下内容可能会有所帮助:

//Get the user's values
for (int i = 0; i < numberitems; i++)
{
    std::cout << "Enter any NON-negative number: ";
    std::cin >> number; 
    std::cout << '\n';


    //Maximum value entered
    if (number > max) {
        // debug - (remove before submission)
        std::cout << "number is the new max! number = " << number
                  << ", max = " << max << std::endl;
        // end of debug
        max = number;
    }

    //minimum value entered
    if (number < min) {
        // (debug - remove before submission)
        std::cout << "number is the new min! number = " << number 
                  << ", min = " << min << std::endl;
        // end of debug
        min = number;
    }

【讨论】:

  • 很棒的建议。适用于最大值,但不适用于最小值。当我初始化或赋予 min 值时,min 的值永远不会改变。
  • @SirMcSourTowel 这可能需要在代码中的某处进行另一个调试打印输出。通常它不是魔法,如果你打印更多,你就会看到实际发生了什么!
【解决方案2】:

在计算最小值和最大值时,您应该将变量初始化为默认值。对于最小值,它是最大可能值;最大 - 可能的最小。

double max, min; // BUG - not initialized
#include <float.h> // or <cfloat>
...
double max = 0; // CORRECT - initialized
double min = DBL_MAX; // CORRECT - initialized

对于最大值,初始化通常为-DBL_MAX(注意:不是DBL_MIN),但在这种情况下,当不存在负值时,0 就足够了。

【讨论】:

  • IMO 更好的模式是使用bool minValid = false;if (!minValid) {min = number; minValid = true;}。这样,如果用户输入 zero 值,你就不会显示愚蠢的 min/max,你有一个 bool 告诉你这些值是无效的。
  • 我们也会接受适当的std::numeric_limits
  • 我不知道如何正确实现这一点。我只是反复被告知“错误:'DBL_MAX' 未在此范围内声明”
  • 查看编辑(另一个答案也提到了它;阅读其他答案)。
  • 感谢!我仍然不确定我是否可以在这个作业中使用&lt;float.h&gt; / &lt;cfloat&gt;
【解决方案3】:

您需要为minmax 设置一个初始值。对于min,我建议使用DBL_MAX 的初始值,它在标题cfloat 中定义。

【讨论】:

  • 你能举个例子吗?如上所述,我将 min 写成“double min = DBL_MAX”,然后出现错误。
  • 您遇到了哪些错误?你#include &lt;cfloat&gt;了吗?
  • 啊,发现那个问题了。使用 {#include }> 刚刚尝试过,现在每个人的上述建议都有效。但是,{} 根本没有在课堂上介绍。所以我不确定这是否可以在这里使用?
猜你喜欢
  • 2016-03-03
  • 2020-07-10
  • 1970-01-01
  • 2017-06-26
  • 2016-07-24
  • 2015-05-19
  • 2019-08-12
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多