-2

我尝试了一切以使标准偏差起作用。我正在尝试制作一个程序来获取学生的成绩(由用户决定计数)并计算成绩的平均值以及标准偏差。它计算平均罚款,但对于标准偏差,它给出“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

4 回答 4

4

您必须将偏差总和初始化为零。否则将垃圾值作为初始值

于 2013-08-28T16:57:14.560 回答
3

当您进行整数除法时,您的平均计算将失败,这将使后续的 std dev 计算不正确。

改变:

mean = sum/count;

mean = (float)sum/count;

以便使用浮点运算执行除法。此时您可能还想打印 mean 的值以检查它是否合理。

于 2013-08-28T16:56:18.910 回答
2

还有这个

standard_deviation = sqrt(deviation_sum /count - 1);

应该

standard_deviation = sqrt(deviation_sum / (count - 1));

参阅此处了解背景信息

于 2013-08-28T16:59:55.570 回答
1

首先,避免这种类型的构造(i可能导致数组访问越界):

for(i = 0; i <= 5; i++){
      while(grades[i] == 0){
         i++;                
      }

使用if代替while和使用continue再次循环。

为了纠正您遇到的错误,请在您的代码中进行以下更改(我只是给您提示)
1.在必要时使用类型转换
2. 监控变量(尤其是数组索引)以获得正确的界限
3. 使用类似的函数时sqrt,请检查论证的积极性,否则你可能会面临Domain ERROR
4. 永远记得在需要时初始化变量。

我还为您建议一项任务

switch尝试用更简单的逻辑删除你的。

于 2013-08-28T17:07:18.567 回答