C ++计算gpa和标准差

时间:2015-03-05 21:13:59

标签: c++ standards average

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

#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);

}

2 个答案:

答案 0 :(得分:1)

删除以#define开头的行。它没有做你认为它做的事情,并且正在引起你的神秘错误信息。

答案 1 :(得分:0)

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

  1. 计算成绩与平均值之间的差异
  2. 调整您刚刚计算出的每个差异。
  3. 现在你必须记录这些数字的平均值,因此:

    1. 总结所有这些
    2. 将总和除以5(当然,在这种情况下!)
    3. 这是你的差异。最后,

      1. 取方差的平方根。
      2. 现在你有标准差。

        你在做什么是不同的,因为你已经恢复了第2步和第3步:首先你要总结所有的结果,然后你正在平衡总和。不幸的是,它不同,因为(a + b)^ 2 = a ^ 2 + 2ab + b ^ 2,这明显不同于^ 2 + b ^ 2。这意味着当你需要取一些正方形的总和时,就不能取总和的平方。

        那就是说,你的代码中有一些混乱:

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

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