私は、配列から平均、中央値、およびモードを計算するこのプログラムを作った。私はいくつかの例でテストしましたが、テストした入力の多くは忘れてしまったかもしれないが、先生が使っているテストプログラムでは、私はその入力を提示されていませんでした。たぶん、誰かが見ていると私は、コードのモードポイントでミスを作っていますかどうかを確認することができます可能なモードエラー
#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
より大きい場合は、これに置き換えてください。例えば、同じ回数の繰り返しを持つ2つ以上の数値がある場合に必要な最後の最大値も格納します。
EDIT:配列のモードは、配列内で最大の出現数を持つ数値を返さなければなりません。同じ数の最大出現数を持つ2つ以上の数字がある場合、その配列にモードはありません。
とき、統計的観点から、以下のことを注意してください2つ以上の数字は、あなたがマルチモードの分布を持っているのと同じ最大出現数を持ちます。 –
_unsorted_入力はどうですか?あなたの配列が '1 2 1 5 1 4 1 3 3 1'ならば、あなたのプログラムはモードとして' 1'または '3'を返しますか?中央値を見つけることができますか? – CiaPan
また、中央値の場合、偶数の要素の場合は、2つの中心値の平均値を取る必要があります。 –