2012-02-01 3 views
1

이 작은 프로그램을 작성하여 Stats 클래스에서 도움을 주려고하면 모든 것이 중앙값을 제외하고 계산되는 것 같습니다. 나는 무엇을 놓치고 있습니까?모드, 중간, 평균, 표준 편차, 분산 계산기

누구든지 나에게도 분산 기능을 기꺼이 원한다면 x).

GCC 컴파일러로 OSX를 실행 중입니다.

#include<stdio.h> 
#include<math.h> 

float mean1(float[],int); 
float median1(float[],int); 
float mode1(float[],int); 
double standarddeviation1(float[],int); 

int main() 
{ 
int i,n,choice; 
float array[100],mean,median,mode; 
double standarddeviation; 

printf("Enter No of Elements\n"); 
    scanf("%d",&n); 
printf("Enter Elements\n"); 

for(i=0;i<=n-1;i++) 
    scanf("%f",&array[i]); 
do 
{ 
    printf("\n\tEnter Choice\n\t1.Mean\n\t2.Median\n\t3.Mode\n\t4.Standard deviation\n\t5.Exit\n"); 
    scanf("%d",&choice); 

    switch(choice) 
    { 
     case 1: mean=mean1(array,n); 
      printf("\n\tMean = %f\n",mean); 
      break; 
     case 2: median=median1(array,n); 
      printf("\n\tMedian = \n",median); 
      break; 
     case 3: mode=mode1(array,n); 
      printf("\n\tMode = %f\n",mode); 
      break; 
     case 4: standarddeviation=standarddeviation1(array,n); 
      printf("\n\tStandard deviation = %f\n",standarddeviation); 
      break; 
     case 5: break; 
     default:printf("Wrong Option"); 
      break; 
    } 

}while(choice!=5); 
    getchar(); 

return 0; 
} 

float mean1(float array[],int n) { 
    int i; 
    float sum=0; 
    for(i=0;i<=n;i++) 
    sum=sum+array[i]; 
return (sum/n); 
} 
float median1(float array[],int n) { 
float temp; 
int i,j; 
for(i=n-1;i>=0;i--) 
    for(j=0;j<=i;j++) 
     if(array[j]>=array[j+1]) 
     { 
      temp=array[j]; 
      array[j]=array[j+1]; 
      array[j+1]=temp; 
     } 

if(n%2==0) 
    return (array[n/2]+array[n/2-1])/2; 
else 
    return array[n/2]; 
} 
float mode1(float array[],int n) { 
return (3*median1(array,n)-2*mean1(array,n)); 
} 
double standarddeviation1(float array[],int n) { 
int j; 
double max[100],sum,variance,mean; 
mean=mean1(array,n); 
sum=0; 
for(j=0;j<=n;j++) 
{ 
    max[j]=pow((array[j]-mean),2); 
    sum+=max[j]; 
} 
variance=sum/(j-1); 
return sqrt(variance); 
} 

답변

3

mean1도 올바르지 않습니다. 두 오류는 n에 의해 할당 된 현재 n+1 요소를 추가 할 수 n

float mean1(float array[],int n) { 
    int i; 
    float sum=0; 
    for(i=0;i<=n;i++) 
    sum=sum+array[i]; 
return (sum/n); 
} 

하지만 분열 과거 요소를 액세스, 같은 이유가있다. n+1 st 요소는 계산에 포함되지 않습니다. 루프 조건을 i < n으로 만드십시오. 당신의 거품 정렬에서

float median1(float array[],int n) { 
float temp; 
int i,j; 
for(i=n-1;i>=0;i--) 
    for(j=0;j<=i;j++) 

, 당신은 임의의 값이있는, 너무 array[n] 액세스 (그리고 n == 100 할당 된 배열 과거의 경우, 따라서 정의되지 않은 동작이 발생합니다). 내부 루프 조건을 j < i으로 만들거나 바깥 루프를 i = n-2으로 시작하십시오.

standarddeviation1에서 배열 범위를 너무 많이 넘어 섭니다.

+4

OP의 중요한 점은 'N'개의 요소가있는 경우 유효한 인덱스는 '0'에서 'N-1'(물론 0에서 시작한다고 가정 할 때)입니다. – Marlon

+0

@Daniel Fischer 아시 겠지만, 여기서부터 어떻게 제안 하시겠습니까? – user1145538