2017-10-24 19 views
1

배열에서 평균, 중앙값 및 모드를 계산하는 프로그램을 만들었습니다. 몇 가지 예제로 테스트했지만, 테스트 한 많은 입력에 대해 잊어 버린 경우가있을 수 있지만 선생님이 사용하는 테스트 프로그램을 사용하면 특정 테스트에서 오류가 발생합니다. , 그러나 나는 그것의 입력으로 제시되지 않았다. 어쩌면 누군가는 모양과 나는 코드의 모드 시점에서 실수를하고 있는지 볼 수 있습니다 단지를 횡단 할 때 번호가 분류되어 있기 때문에 모드가능한 모드 오류

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

void *safeMalloc(int n) { 
    void *p = malloc(n); 
    if (p == NULL) { 
     printf("Error: malloc(%d) failed. Out of memory?\n", n); 
     exit(EXIT_FAILURE); 
    } 
    return p; 
} 

int main(int argc, char *argv[]) { 
    int n, i; 
    scanf("%d", &n); 
    int *array = safeMalloc(n * sizeof(int)); 
    for (i = 0; i < n; i++) { 
     int value; 
     scanf("%d", &value); 
     array[i] = value; 
    } 

    //mean 
    double mean; 
    double sum = 0; 
    for (i = 0; i < n; i++) { 
     sum = sum + (double)array[i]; 
    } 
    mean = sum/n; 
    printf("mean: %.2f\n", mean); 

    //median 

    float temp; 
    int j; 
    for (i = 0; i < n; i++) 
     for (j = i + 1; j < n; j++) { 
      if (array[i] > array[j]) { 
       temp = array[j]; 
       array[j] = array[i]; 
       array[i] = temp; 
      } 
     } 
    printf("median: %d\n", array[n/2]); 

    //mode 

    int val = array[0], noOfRepetitions = 1, valMax = array[0], maxRepetitions = 1, possibleMax = 1; 

    for (i = 1; i < n; i++) { 
     if (array[i] == val) { 
      noOfRepetitions++; 
     } 

     if (array[i] != val) { 
      val = array[i]; 
      noOfRepetitions = 1; 
     } 

     if (noOfRepetitions == possibleMax) { 
      maxRepetitions = 1; 
      continue; 
     } 

     if (noOfRepetitions > maxRepetitions) { 
      valMax = val; 
      maxRepetitions = noOfRepetitions; 
      possibleMax = maxRepetitions; 
     } 
    } 

    if (maxRepetitions > 1) { 
     printf("mode: %d\n", valMax); 
    } else { 
     printf("mode: NONE\n"); 
    } 

    return 0; 
} 

내 생각이었다. 다음 요소가 이전 요소와 같으면 noOfRepetitions을 늘립니다. noOfRepetition이 지금까지 maxRepetitions보다 큰 경우이를 바꿉니다. 또한 예를 들어 반복 횟수가 같은 두 개 이상의 숫자가있는 경우 필요한 마지막 최대 값을 저장합니다.

EDIT : 배열의 모드는 배열의 최대 발생 횟수와 함께 숫자를 반환해야합니다. 동일한 최대 발생 횟수를 가진 숫자가 2 개 이상이면 해당 배열에 모드가 없습니다.

+0

가 있다는 점 유의 하시길 바랍니다보기의 통계 지점에서 2 개 이상의 숫자는 멀티 모드 배포판이있는 최대 발생 횟수가 동일합니다. 모드가 전혀 나타나지 않습니다. –

+0

_unsorted_ 입력은 어떻습니까? 배열이'1 2 1 5 1 4 1 3 3 1'이라면 프로그램은 모드로'1' 또는'3'을 리턴 할 것입니까? 중앙값을 찾을 수 있습니까? – CiaPan

+0

또한 중앙값의 경우 요소 수가 짝수 인 경우 두 개의 중심 값의 평균을 취해야합니다. –

답변

0

변수가 possibleMax 인 것 같습니다.

if(noOfRepetitions==possibleMax){ 
     maxRepetitions=1; 
     continue; 
    } 

이로 인해 maxRepetitions이 잘못 재설정 될 수 있습니다.

당신은 분포가 복합 인 경우 감지하고 모든 모드 값을 인쇄 할 수는 :

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

void *safeMalloc(int n) { 
    void *p = malloc(n); 
    if (p == NULL) { 
     printf("Error: malloc(%d) failed. Out of memory?\n", n); 
     exit(EXIT_FAILURE); 
    } 
    return p; 
} 

int main(int argc, char *argv[]) { 
    int n, i; 
    if (scanf("%d", &n) != 1 || n <= 0) 
     return 1; 
    int *array = safeMalloc(n * sizeof(int)); 
    for (i = 0; i < n; i++) { 
     if (scanf("%d", &array[i]) != 1) 
      return 1; 
    } 

    //mean 
    double sum = 0; 
    for (i = 0; i < n; i++) { 
     sum = sum + (double)array[i]; 
    } 
    printf("mean: %.2f\n", sum/n); 

    //median 

    int j; 
    for (i = 0; i < n; i++) { 
     for (j = i + 1; j < n; j++) { 
      if (array[i] > array[j]) { 
       int temp = array[j]; 
       array[j] = array[i]; 
       array[i] = temp; 
      } 
     } 
    } 
    printf("median: %d\n", array[n/2]); 

    //mode 

    int val = array[0], noOfRepetitions = 1, valMax = array[0], maxRepetitions = 1; 

    for (i = 1; i < n; i++) { 
     if (array[i] == val) { 
      noOfRepetitions++; 
      if (noOfRepetitions > maxRepetitions) { 
       valMax = val; 
       maxRepetitions = noOfRepetitions; 
      } 
     } else { 
      val = array[i]; 
      noOfRepetitions = 1; 
     } 
    } 

    if (maxRepetitions == 1) { 
     printf("mode: NONE\n"); 
    } else { 
     printf("mode: %d", valMax); 
     val = array[0]; 
     noOfRepetitions = 1; 
     for (i = 1; i < n; i++) { 
      if (array[i] == val) { 
       noOfRepetitions++; 
      } else { 
       if (noOfRepetition == maxRepetitions && val != valMax) { 
        printf(", %d", val); 
       } 
       val = array[i]; 
       noOfRepetitions = 1; 
      } 
     } 
     if (noOfRepetition == maxRepetitions && val != valMax) { 
      printf(", %d", val); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
+0

제 생각에는 아닙니다.possibleMax의 아이디어는 사실 동일한 최대 빈도를 가진 여러 개의 숫자가있는 경우입니다. 예를 들어 내가 그 라인을 지우면 case 1 1 2 2 3은 나에게 2를 준다. 1과 2 모두 빈도 2를 가지므로 나에게 아무 것도주지 않을 때 mode = 2가된다. maxRepetition이 1로 재설정되면 maxRepetition 변경되지 않으며 1로 인쇄되어 아무 것도 인쇄하지 않습니다. –

+0

질문을 편집하여 * mode *의 의미를 명확히 할 수 있습니까? – chqrlie

+1

@chqrlie https://en.wikipedia.org/wiki/Mode_(statistics) – CiaPan

0

내 실수를 발견했습니다. 같은 최대 주파수를 가진 숫자가 있고 그 다음에 주파수가 낮지 만 다른 것보다 더 큰 숫자가있는 경우를 생각하지 않았습니다. 예를 들면 다음과 같습니다. 1 1 2 1 2 2 3 3 4 5 6. 코드를 사용하면 결과는 3이됩니다. noOfRepetitions과 oldMaxRepetition의 비교를 변경해야했습니다.

+0

'oldMaxRepetition'이 정의되지 않았습니다. 코드를 수정하기 위해 어떤 변화가 있었는지는 분명하지 않습니다. – chqrlie

0

모드 검색 코드가 너무 복잡해 보입니다. 이 비교 :

//mode 

    int val = array[0], noOfRepetitions = 1, 
     valMax = array[0], maxRepetitions = 1; 

    for (i = 1; i < n; i++) { 
     if (array[i] == val) { 
      if (++noOfRepetitions > maxRepetitions) { 
       valMax = val; 
       maxRepetitions = noOfRepetitions; 
      } 
     } 
     else 
     { 
      val = array[i]; 
      noOfRepetitions = 1; 
     } 
    } 

그것은 당신이 무엇을해야하는 가장 간단한 코드는 아마,하지만 너무 자주 많이 maxValmaxRepetitions을 덮어 씁니다.

다음 버전은 발견 된 각 새로운 최대에 한 번 두 '최대'변수를 덮어 - 코드의 일부를 복제의 비용 :

//mode 

    int val = array[0], noOfRepetitions = 1, 
     valMax = array[0], maxRepetitions = 1; 

    for (i = 1; i < n; i++) { 
     if (array[i] == val) { 
      ++noOfRepetitions; 
     } 
     else 
     { 
      if (noOfRepetitions > maxRepetitions) { 
       valMax = val; 
       maxRepetitions = noOfRepetitions; 
      } 

      val = array[i]; 
      noOfRepetitions = 1; 
     } 
    } 

    if (noOfRepetitions > maxRepetitions) { 
     valMax = val; 
     maxRepetitions = noOfRepetitions; 
    }