【问题标题】:Statistical Calculator outputs infinite loop统计计算器输出无限循环
【发布时间】:2015-01-06 09:56:22
【问题描述】:

我的程序设计为从用户那里获取 3-30 个值,并让它通过几个函数来计算平均值、中值和标准偏差。 但是,一旦我放置了一组测试用例值,我的输出就会导致我认为是无限循环的混乱。

我完全不知道我到底做错了什么。我将不胜感激。

#include <iostream>
#include <iomanip> // for Setprecision
#include <cmath> // for pow and sqrt

using namespace std;

int main()
{
    // Declare Local Variables
    const int SIZE=30.0;
    double array[SIZE];
    int count = 0;
}
//Module: inputArrayValues
//Description: Ask the user to input values between 3 and 30 elements for the array to hold. Also validates that the user inputs a total of values between 3 and 30.
void inputArrayValues (double array[], int SIZE, int &count)
{
    double number = 0;
    const double SENTINEL = -1.0;
    // Basic information about what the user can input. Does not repeat.
    cout << "Please enter values one at a time." <<endl;
    cout << "Up to a maximum of 30 values and a minimum of 3 values." << endl;
    cout << "Only positive values are accepted or the program will not work." << endl;
    cout << "With the exception, please enter the value -1.0 to stop entering values." << endl;

    // While Loop
    // Variable count is counting how many values the user inputs for later calculation
    for (int i = 0; i < SIZE; i++)
    {
        while (number!= SENTINEL)
        {
            cout << "Please enter a value or enter -1.0 to stop entering values" << endl;
            cin >> number;
            array[i] = number;
            if (number != SENTINEL)
            {
                count++;
            }

        }
    }

    if (count < 3 || count > SIZE)
    {
        cout << "Invalid total number of values." << endl;
        cout << "The total number of values must between 3 and 30 values." <<endl;
        cout << "This program will now close..." << endl;
        cout << "Thank you for using this program." << endl;
    }
}

//Function: comupteAverage
//Description: Computes the average of the given inputs.
double computeAverage (double array[], int count)
{
    double sum = 0.0;
    double resultA;
    for (int i =0; i < count; i++)
    {
        sum = sum + array[i];
    }
    resultA = sum / count;
    return resultA;
}
//Function: computeMedian
//Description: Computes the Median of the given inputs.
double computeMedian (double array[], int count)
{
    double resultM;
    if ((count % 2) == 0)
    {
        resultM = (array[count/2] + (array[count/2] -1.0) /2.0);
    }
    else
        resultM = array[count/2];
    return resultM;
}
//Function: computeSTD
//Description: Computes the Standard Deviation of the given inputs.
double computeSTD (double array[], int count, double average)
{
    double temp;
    double sum = 0;
    double resultV;
    for(int i = 0; i < count; i++)
    {
        temp = pow((array[i] - average), 2);
        sum = sum + temp;
    }
    //Account for Sample Standard Deviation N-1
    resultV = sqrt(sum/(count -1));
    return resultV;
}

我使用的测试用例编号。

73.3
83.4
58
11.9
25.1
69.9
45.7
95.0
44.4
-1.0 // To stop entering values

Thank you in advance for your time and advice!

I performed a shorter test case with only 5 values.

Please enter a value or enter -1.0 to stop entering values
4

Please enter a value or enter -1.0 to stop entering values
3

Please enter a value or enter -1.0 to stop entering values
2

Please enter a value or enter -1.0 to stop entering values
-1.0

-1.0 -92559631349317830000000000000000000000000000000000000000000000.0 -92559631
349317830000000000000000000000000000000000000000000000.0 -9255963134931783000000
0000000000000000000000000000000000000000.0 -1.0 -9255963134931783000000000000000
0000000000000000000000000000000.0 The average is: -61706420899545223000000000000
000000000000000000000000000000000.0
The median is: -1.0
The Standard Deviation is: 53439328075621178000000000000000000000000000000000000
000000000.0
Press any key to continue . . .

但是,我仍然不清楚是什么导致程序以这种方式运行。

【问题讨论】:

  • 这不是一个简短的代码示例。您的大部分代码与问题无关。见sscce.org
  • 抱歉!我发布了整个代码,因为我不知道是什么原因造成的。请允许我缩小范围。谢谢你让我排队。

标签: c++


【解决方案1】:

第一

for (int i = 0; i < SIZE; i++)
{
    while (number!= SENTINEL)
    {
        cout << "Please enter a value or enter -1.0 to stop entering values" << endl;
        cin >> number;
        array[i] = number;       // <-----
        if (number != SENTINEL)
        {
            count++;
        }

    }
}

填充array 的第一个元素,因为您不增加i。正确的代码应该是这样的:

count = 0;
do
{
    cout << "Please enter a value or enter -1.0 to stop entering values" << endl;
    cin >> number;
    if ( number != SENTINEL )
    {
        array[ count ] = number;
        count++;
    }
}
while ( number != SENTINEL && count < SIZE );

第二:调用你的函数的代码在哪里???

第三:你的computeAveragecomputeSTD 看起来不错,但你到底在computeMedian 做什么???

更新: 正确的中位数计算应该是这样的:

double computeMedian (double array[], int count)
{
    double resultM;
    double * sorted_array = new double[ count ];
    for ( int i = 0; i < count; i++ )
    {
        sorted_array[ i ] = array[ i ];
    }
    std::sort( sorted_array, sorted_array + count );
    if ((count % 2) == 0)
    {
        //resultM = (sorted_array[count/2] + (sorted_array[count/2] -1.0) /2.0); // <-- compare this line
        resultM = ( sorted_array[count/2] + sorted_array[count/2 - 1] ) / 2.0;  // <-- and this
    }
    else
        resultM = sorted_array[count/2];
    delete []sorted_array;
    return resultM;
}

最后一个:我强烈建议您使用std::vector 而不是“原始”数组。

【讨论】:

  • 您好!非常感谢您的建议。关于你的问题。我不得不缩短显示的代码量,使其不那么碍眼。 (模块调用工作正常)对于computeMedian,遗憾的是我不知道具体该怎么做,我能想到的最好的方法是在互联网上查看示例。如果您也能在这部分为我提供帮助,我将不胜感激。
  • 看看 Max Shawabkeh 对这个 SO 问题的回答 - stackoverflow.com/questions/2114797/…
  • 这是我基于中值函数的示例。但是,我还没有学会 size_t 来找到数组的确切长度。相反,我使用计数变量来跟踪用户输入值的次数。我不确定我是否可以使用这种方法,因为我在课堂上没有教过这种方法。我有什么更简单的方法来表示这个例子吗?非常感谢您的帮助。
  • 非常感谢您的辛勤工作。可悲的是,我不确定我是否可以使用这个示例,因为它包含许多我在课堂上没有学到的方面,例如 std::。实际上,如果我要使用这个例子来学习如何计算中位数,我的教授很可能会标记我。不过,我非常感谢您为帮助我付出的辛勤工作。
  • 好的。函数std::sort(你可以从它的名字中来宾)))正在对给定的数组从最低元素到最大元素进行排序。你可以自己写,阅读this link from wiki
猜你喜欢
  • 2015-10-02
  • 2012-11-20
  • 2020-01-20
  • 2013-09-06
  • 2011-07-12
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多