Возможная ошибка режима
Я сделал эту программу, которая вычисляет среднее значение, медиану и режим из массива. Хотя я проверил несколько примеров, я обнаружил, что может быть случай, который я забыл, так как для многих входов, которые я тестировал, он работает, но программа тестирования, которую использует мой учитель, выдает мне ошибку для определенного теста, но мне не представили свой вклад. Может быть, кто-то может посмотреть и посмотреть, не ошибаюсь ли я в точке режима кода:
#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 чисел с одинаковым количеством повторений.
РЕДАКТИРОВАТЬ: режим массива должен возвращать число с максимальным количеством вхождений в массиве. Если у нас есть 2 или более чисел с таким же количеством максимальных вхождений, в этом массиве нет режима.
3 ответа
Я обнаружил свою ошибку. Я не думал о случае, когда у меня есть числа с одинаковой максимальной частотой, и после этого пришло число с более низкой частотой, но все же больше, чем у других. Например: 1 1 1 2 2 2 3 3 4 5 6. С моим кодом результат будет 3 . Мне просто нужно было изменить сравнение noOfRepetitions со oldMaxRepetition.
Ваш код для поиска режима кажется слишком сложным. Сравните это:
//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;
}
}
Это, наверное, самый простой код, чтобы делать то, что вам нужно, но он перезаписывает maxVal
а также maxRepetitions
слишком часто
Следующая версия перезаписывает две переменные 'max' только один раз для каждого нового найденного максимума - за счет дублирования некоторой части кода:
//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;
}
Кажется, нет никакой цели для переменной 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;
}