我正在尝试计算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);
}
答案 0 :(得分:1)
删除以#define
开头的行。它没有做你认为它做的事情,并且正在引起你的神秘错误信息。
答案 1 :(得分:0)
首先,您使用了错误的标准偏差公式。看看page on Wikipedia! 正确的操作顺序是:
现在你必须记录这些数字的平均值,因此:
这是你的差异。最后,
现在你有标准差。
你在做什么是不同的,因为你已经恢复了第2步和第3步:首先你要总结所有的结果,然后你正在平衡总和。不幸的是,它不同,因为(a + b)^ 2 = a ^ 2 + 2ab + b ^ 2,这明显不同于^ 2 + b ^ 2。这意味着当你需要取一些正方形的总和时,就不能取总和的平方。
那就是说,你的代码中有一些混乱:
float sum, count,var;
ave=sum/count;
这里你不需要sum
,在这种情况下count
是固定的(它是5),所以你也不需要它。并且ave
作为参数传递,因此您不必再次声明它(并且既不计算它 - 如果您将它作为参数传递,则在调用函数之前已经计算过它!)。