Возможная ошибка режима

Я сделал эту программу, которая вычисляет среднее значение, медиану и режим из массива. Хотя я проверил несколько примеров, я обнаружил, что может быть случай, который я забыл, так как для многих входов, которые я тестировал, он работает, но программа тестирования, которую использует мой учитель, выдает мне ошибку для определенного теста, но мне не представили свой вклад. Может быть, кто-то может посмотреть и посмотреть, не ошибаюсь ли я в точке режима кода:

#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;
}
Другие вопросы по тегам