我尝试了一切以使标准偏差起作用。 我正在尝试制作一个能够获得成绩的学生(计数由用户决定)并计算成绩的平均值以及标准差。它计算平均罚款,但对于标准差,它给出“7712160851427328.00”
#include <stdio.h>
int main(){
int i;
int j;
int count;
int grade = 0;
int grades[5] = {0}; //Init
int sum = 0;
float deviation_sum;
float mean;
float standard_deviation;
printf("Give Count: ");
scanf("%d", &count);
for(i = 0; i < count; i++){
printf("Give %d grade: ", (i+1));
scanf("%d", &grade);
switch(grade){
case 0:
grades[0]++;
break;
case 1:
grades[1]++;
break;
case 2:
grades[2]++;
break;
case 3:
grades[3]++;
break;
case 4:
grades[4]++;
break;
case 5:
grades[5]++;
}
sum += grade;
}
mean = sum/count;
printf("mean: %.2f \n", mean);
for(i = 0; i <= 5; i++){
while(grades[i] == 0){
i++;
}
for(j = 0; j < grades[i]; j++){
deviation_sum += (i-mean)*(i-mean);
printf("%d,%d\n",i,j);
}
}
standard_deviation = sqrt(deviation_sum /count - 1);
printf("deviation: %.2f\n", standard_deviation);
}
我认为问题出现在最后一个for循环中,但是无法弄明白。
答案 0 :(得分:4)
您必须将偏差总和初始化为零。否则,它将垃圾值作为其初始值
答案 1 :(得分:3)
当您进行整数除法时,您的平均计算将失败,这将使随后的std dev计算不正确。
变化:
mean = sum/count;
到
mean = (float)sum/count;
以便使用浮点运算执行除法。您可能还想在此时打印mean的值以检查它是否合理。
答案 2 :(得分:2)
也是这个
standard_deviation = sqrt(deviation_sum /count - 1);
应
standard_deviation = sqrt(deviation_sum / (count - 1));
答案 3 :(得分:1)
首先,避免使用这种类型的构造(i
可能导致数组访问超出范围):
for(i = 0; i <= 5; i++){
while(grades[i] == 0){
i++;
}
使用if
代替while
并使用continue
重新循环。
为了纠正您所遇到的错误,请在代码中进行以下更改(我只是给您提示)
1.必要时使用类型转换
2.监视变量(尤其是数组索引)以获得适当的界限
3.使用sqrt
等函数时,请检查参数的积极性,否则您可能会遇到Domain ERROR
。
4.务必记住在需要时初始化变量。
我还建议一项任务:
尝试使用更简单的逻辑删除
switch
。