无法获得标准偏差在C中工作

时间:2013-08-28 16:52:49

标签: c math standards deviation

我尝试了一切以使标准偏差起作用。 我正在尝试制作一个能够获得成绩的学生(计数由用户决定)并计算成绩的平均值以及标准差。它计算平均罚款,但对于标准差,它给出“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循环中,但是无法弄明白。

4 个答案:

答案 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));

see here for the background

答案 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