2013-08-28 3 views
-2

표준 편차를 얻으려고 모든 것을 시도했습니다. 나는 (사용자가 결정한) 학생의 성적을 얻고 성적의 평균과 표준 편차를 계산하는 프로그램을 만들고자한다. 그것은 평균 벌금을 계산하지만, 표준 편차는 "7712160851427328.00는" C에서 표준 편차가 작동하지 않습니다

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

나는 문제가 루프의 마지막에 생각 그냥 알아낼 수 있습니다.

+5

첫 번째 팁 : 전체 switch 문을 'grade [grade] ++'로 바꿀 수 있습니다. 두 번째 팁 : 당신이 스스로 울기를 원하지 않는다면,'grades'와'grade'라는 두 개의 변수를 사용하지 마십시오. –

+0

'count'에'0'을 입력하면 다른 답변에서 지적 된 모든 논리적 오류를 수정 한 후 코드의 출력은 어떻게됩니까? –

+1

'1'을 입력해도 재미있을 수 있습니다. – alk

답변

4

편차를 0으로 초기화해야합니다. 그렇지 않으면 또한이

standard_deviation = sqrt(deviation_sum /count - 1); 

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

하십시오 see here for the background한다 초기 값

3

정수 나누기를 수행 할 때 평균 계산이 실패하고 이후의 std dev 계산이 잘못됩니다.

변경 :

mean = sum/count; 

나눗셈 부동 소수점 산술을 사용하여 수행되도록

mean = (float)sum/count; 

한다. 이 시점에서 평균값을 인쇄하여 합리적인 것으로 확인하는 것이 좋습니다.

2

으로 쓰레기 값을 사용합니다. 모든

1

첫째, 구조의이 유형을 피하기 (i는 배열 액세스 범위를 벗어날 발생할 수) : 대신 while

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

사용 if을 다시 반복 할 continue를 사용합니다. 당신이 점점 오류를 정정

는 코드의 변화를 다음과 같이
1. 타입 캐스팅을 (난 그냥 당신이 힌트를주고있다) 여기서 적절한 경계에 필요한
2. 모니터 변수 (특히 배열 인덱스)
3. sqrt과 같은 함수를 사용할 때는 인수의 양성을 검사하십시오. 그렇지 않으면 Domain ERROR과 마주 할 수 있습니다.
4. 필요할 때마다 변수를 초기화해야합니다.

나는 또한 당신을 위해 작업을 제안 :

제거하십시오 당신의 간단한 논리 switch.

관련 문제