【问题标题】:C++ calculate gpa and standard deviationC++计算gpa和标准差
【发布时间】:2015-03-05 21:13:59
【问题描述】:

我正在尝试计算 txt 文件中学生的标准差和平均值。我的平均值下降了,但我无法使用函数计算 5 个等级的标准差。我的原型是 无效统计(双,双,双,双,双,双&ave,双&sd); 我被困在这一点上。我不知道输出我的标准偏差或者我是否有我的 void 函数。谢谢

#include <iostream>
using namespace std;
#include <cmath>
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
float getValue(char);
void stats(double&grade1,double&grade2,double&grade3,double&grade4,double&grade5,double&ave,double&sd);

int main() {

    cout << "Name\t\tAverage\t\tDeviation\n";

    string name;
    int count;
    char grade;
    float ave,sum;
    ifstream input;
    input.open("data.txt");



          input >>name;
          while (name!="XXX") {
          cout<<name<<"\t"<<"\t";
          sum=count=0;
          input>>grade;

          while (grade!= 'X' ){
              sum+=getValue(grade); //sum = sum+grade
              count++;
             input>>grade;

          }
          if (count>0)ave=sum/count;
          else cout<<"no average";
          cout<< setprecision (2)<<fixed <<ave<<"\n";
          input>>name;



          }


return 0;
    }
float getValue(char x){
float ans=0;
        switch(x){
        case 'A': ans=4.0;break;
        case 'B': ans=3.0;break;
        case 'C': ans=2.0;break;
        case 'D': ans=1.0;break;
        }
        return ans;
        }
void stats(double&grade1,double&grade2,double&grade3,double&grade4,double&grade5,double&ave,double&sd)
{

    double var;
    var=(pow((grade1-ave),2)+pow((grade2-ave),2)+pow((grade3-ave),2)+pow((grade4-ave),2)+pow((grade5-ave),2))/5;
    sd=sqrt(var);

}

【问题讨论】:

  • 只需实现简单的方程式 - 它广为人知,可以用谷歌搜索
  • 你可以使用std::vector吗?向量将使平均偏差和标准偏差更容易实现。
  • @ThomasMatthews 不,我们还没有这样做。
  • 你需要给sumcount赋值。考虑到你所拥有的,两者都很容易。
  • 你不能从你声明返回void的函数返回值。 (要么返回答案,要么将其分配给sd - 不是两者。)

标签: c++ standards average


【解决方案1】:

删除以#define 开头的行。它并没有按照您的想法执行,并且会导致您的神秘错误消息。

【讨论】:

    【解决方案2】:

    首先,您使用了错误的标准差公式。看看page on Wikipedia! 正确的操作顺序是:

    1. 计算成绩与平均值之间的差异
    2. 将您刚刚计算的每个差值平方。

    现在你必须计算这些数字的平均值,因此:

    1. 全部加起来
    2. 将总和除以 5(在这种情况下,当然是!)

    这是你的差异。最后,

    1. 取方差的平方根。

    现在你有了标准差。

    您所做的是不同的,因为您已经恢复了第 2 步和第 3 步:首先对所有结果求和,然后对总和进行平方。不幸的是,它不一样,因为 (a+b)^2 = a^2 + 2ab + b^2 这显然不同于 a^2 + b^2。这意味着当您需要取某些平方和时,您不能取和的平方。

    也就是说,您的代码有些混乱:

    float sum, count,var;
    ave=sum/count;
    

    这里不需要sum,在这种情况下count 是固定的(它是5),所以你也不需要它。并且ave 作为参数传递,因此您不必再次声明它(也不必计算它 - 如果您将它作为参数传递,您在调用函数之前已经计算了它!)。

    【讨论】:

    • 好的,我修正了我的公式并删除了总和和计数。其他一切都正确吗?我会在哪里计算
    • 好的,现在我们要处理另一个问题:函数stats需要5个等级。不幸的是,您没有保存它们,因为在您的 while (grade!= 'X' ){ 循环中您正在执行此操作:input&gt;&gt;grade;,因此您每次都覆盖相同的变量。你说你不能使用向量,所以我认为你也不能使用数组。然后你不能使用循环。但你至少确定成绩正好是 5,不多也不少?你为什么要计算成绩?他们可能不是 5 吗?