Visual c++ 标准偏差代码输出错误

Visual c++ 标准偏差代码输出错误,visual-c++,Visual C++,我无法从我编写的代码中看到我的输出。我试图计算文件中一组数字的平均值和标准偏差。我不知道问题是什么,在看到输出之前,我不知道我的代码是否正确。以下是我目前掌握的情况: #include <iostream> #include <cmath> #include <fstream> using namespace std; int main() { // Declare Variables int n; int xi; int s

我无法从我编写的代码中看到我的输出。我试图计算文件中一组数字的平均值和标准偏差。我不知道问题是什么,在看到输出之前,我不知道我的代码是否正确。以下是我目前掌握的情况:

#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

int main()
{
    // Declare Variables
    int n;
    int xi;
    int sdv;
    int sum;
    int sum2;
    int sum3;
    int mean;
    // Declare and open input files
    ifstream inData;
    inData.open("score.dat");
    if (!inData) // Incorrect Files
    {
        cout << "Cannot open input file." << endl;
        return 1;
    }
    // Initialize variables and output
    inData >> xi;
    n = 0;
    sum = 0;
    sum3 = 0;
    sdv = 0;
    mean = 0;

    while (inData)
    {
        sum += xi;
        sum2 = sum * sum;
        sum3 += (xi * xi);
        mean = sum / n;
        sdv = (sum3 - sum2) / (n * (n - 1));
        inData >> xi;

    }
    // Print commands
    cout << "The Standard Deviation of the Tests is:" << sdv << endl;
    cout << "The Mean of the Tests is: " << mean << endl;

    inData.close();
    system("pause");
    return 0;
}

运行代码后,我发现了一些bug。您可能无法获得任何输出,因为程序在第一次通过该行的while循环时崩溃:

     mean = sum / n;
由于被零除的错误。 另一个错误是没有增加循环中n的增量值,所以总是只有一个数字

在循环的开头添加一个n++将解决这个问题

while (inData)
{
    n++;
    sum += xi;
    ...
但当n==1时,sdv上仍然会有一个除以零的结果:

sdv = (sum3 - sum2) / (1 * (1 - 1));
如果在分割之前添加条件,则该条件将起作用:

if (n >= 2)
    sdv = (sum3 - sum2) / (n * (n - 1));

查看gdb之类的调试工具,以帮助捕获类似的内容。

我怀疑代码采用了“无法打开输入文件”分支。在这里,您不需要调用systempause;在终止之前。我能让你看看其余的代码吗?我得到的sdv和meann的号码都是错误的,都初始化为0,并且从未更新过。另外,您可能希望将mean和sdv声明为double,而不是int。然后,domean=doublesum/n;。阅读你喜欢的C++教科书中的整数除法。我试过你建议的,而在之前试图找出它,这似乎不起作用。输出结果显示means和sdv都是0。这是另一个bug。你用什么来编译这段代码?在第一次迭代中还有另一个被零除的过程:当n==1,n-1==0,sdv==0时,你必须设置一个条件来确保n>=2。同样,我没有检查你的数学,但是平均值和标准偏差可能不是整数。。。您必须使用float或double类型才能正确计算。在数学公式中混合浮点数和整数会变得很棘手。。。祝你好运