【问题标题】:Standard Deviation Formula标准差公式
【发布时间】:2020-05-24 17:23:50
【问题描述】:

我有这个作业,我将在其中显示它的提示:

编写一个程序,从用户那里读取一组测试分数数据。 (测试 分数应以十进制形式输入以表示百分比等级)。一旦用户拥有 输入完考试成绩(输入-1表示输入结束),打印出成绩 输入的测试、测试的平均值和标准偏差。使用以下公式 (Welford 方法)计算标准差: (Standard Deviaton Formula)

您可以通过跟踪计数(测试次数)、总和和总和来计算此数量 处理输入值时的平方数。 注意:虽然还有其他方法可以计算标准差,但请使用此方法。这 使用方法是因为它只需要传递一次数据。不要使用数组或向量。

现在下面的代码是我目前所拥有的。在终端中,我得到了错误的平均值和标准数字。偏差输出(Terminal Output)。我的数学有什么问题吗?任何帮助表示赞赏。

 #include <iostream>
    #include <cmath>
    using namespace std;
    int main()

    double sum = 0;
    double sumSq = 0;
    double grade = 0;
    int numtests = 0;

    cout << "Enter the test scores. Once finished, enter -1 to end input.\n";
    cin >> grade;

    while(grade != -1)
    {
            cin >>grade;
            sum = sum + grade;
            sumSq = sumSq + pow(grade,2);
            numtests++;
    }

    double average =(sum/numtests);
    double std = (sumSq - numtests*pow(average,2)/(numtests - 1));

    cout << "The number of scores: "<<numtests<<"\n";
    cout << "Average: "<<average<<"\n";
    cout << "Std. Deviation: "<<std<<"\n";




    return 0;

}

【问题讨论】:

  • bool cin = true 将局部变量命名为 cin 是一个非常糟糕的主意,它隐藏了 std::cin。无论如何,第一次之后,您在代码中的哪个位置阅读grade?也就是说,循环在哪里?如果你再也没有读过任何东西,你就不能指望grade 改变值。
  • pow(2,grade) 是 2 的 grade 幂,而不是 grade 的平方。
  • @kaylum 我是 C++ 新手,目前是我专业的第一年。你能解释一下你所说的阅读是什么意思吗?我还更新了删除布尔值的代码。
  • 查看它的简单方法是在cin &gt;&gt; grade; 之后,grade 只包含一个整数值。如果该值不是-1 -- “成绩到底在哪里发生变化?” 那么while(grade != -1) 会将其视为输入的第一级以外的其他内容?

标签: c++ math computer-science cmath


【解决方案1】:

我发现调试程序的一个好方法是经常假装我是计算机,然后尝试一次单步执行程序,看看我在做什么。

如果我遵循你的程序,几行之后我就会得到语句

cin >> grade;

然后我从输入中读取一个数字并将grade 设置为该数字。

然后我进入while 循环。请注意,我从不回到while 循环之前的任何行。并且没有其他程序行从cin 获取任何输入。所以我再也没有读过来自cin 的任何东西。

您可以在第一个数字之后键入您想要的所有数字。该程序没有读取其中任何一个。它正忙着做你告诉它做的事情,即在循环中保持循环 grade 不等于 -1。 它将继续循环,直到发生其他事情来阻止程序运行, 因为grade 在循环中永远不会改变。 每次到达循环顶部时,grade 仍然等于您输入的第一个数字。

顺便说一句,循环末尾的ifbreak 是完全多余的。 如果你没有那个if,程序接下来会回到循环的顶部,然后如果grade 等于-1,它就会退出。因此,如果grade 在循环期间变为-1,则无论哪种方式,您都将在循环结束时退出。

【讨论】:

【解决方案2】:

旁注:对于while(grade != -1)if (grade != -1) break; 是多余的/多余的。

但是,当您尝试对一个数字求平方时,您使用的是“2 的 x 次方”pow(2,x)——这不是您想要的。

要对数字 x 求平方,您需要:pow(x,2)

【讨论】:

  • 或者更简单更高效的x * x:)
  • @DavidC.Rankin 每个人群中都有一个,大卫 :-)
  • 人群越大,里面的人就越多:)
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2018-10-27
相关资源
最近更新 更多