배열에서 평균, 중앙값 및 모드를 계산하는 프로그램을 만들었습니다. 몇 가지 예제로 테스트했지만, 테스트 한 많은 입력에 대해 잊어 버린 경우가있을 수 있지만 선생님이 사용하는 테스트 프로그램을 사용하면 특정 테스트에서 오류가 발생합니다. , 그러나 나는 그것의 입력으로 제시되지 않았다. 어쩌면 누군가는 모양과 나는 코드의 모드 시점에서 실수를하고 있는지 볼 수 있습니다 단지를 횡단 할 때 번호가 분류되어 있기 때문에 모드가능한 모드 오류
#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 개 이상이면 해당 배열에 모드가 없습니다.
가 있다는 점 유의 하시길 바랍니다보기의 통계 지점에서 2 개 이상의 숫자는 멀티 모드 배포판이있는 최대 발생 횟수가 동일합니다. 모드가 전혀 나타나지 않습니다. –
_unsorted_ 입력은 어떻습니까? 배열이'1 2 1 5 1 4 1 3 3 1'이라면 프로그램은 모드로'1' 또는'3'을 리턴 할 것입니까? 중앙값을 찾을 수 있습니까? – CiaPan
또한 중앙값의 경우 요소 수가 짝수 인 경우 두 개의 중심 값의 평균을 취해야합니다. –