Почему среднее значение для моего массива чисел неверно? - PullRequest
0 голосов
/ 13 сентября 2018

Я написал метод для получения массива (через указатель) и его размера для вычисления среднего значения. Я все еще относительно новичок в указателях. Я попытался удалить оператор ссылки по всему коду до точки, в которой он будет компилироваться, но возвращаемые значения не предназначены. Например, если я передам размер массива 3, и тогда мои значения массива будут {1, 2, 3}, с закрытыми глазами я могу сказать вам, что это среднее значение должно быть 2. Однако мой код возвращает 2.666666667. Думая наоборот, я умножил 2.6666 ... 7 на 3, что равно 8. Это заставляет меня думать, что я где-то, 2, поправляется в массив, как {1,2,3,2}, однако я ' Я не уверен в этом. Если у кого-то есть опыт работы с указателями / простой арифметикой, я буду признателен за ваш совет, потому что, опять же, я новичок в указателях и эта идея ссылки по адресу. Спасибо!

double *Average(double *arr, int size)
    {
        double *avg;
        avg = (double *)malloc(sizeof(double));

        *avg = 0;

        int i;
        for (i = 0; i < size; i++)
        {
            *avg = *avg + arr[i];
        }

        *avg = *avg / (double) size;

        printf("The average of the array: %f\n", *avg);
        return avg;
}

Как метод вызывается из main:

else if (choice == 'C' || choice == 'c')
{
    int count;

    printf("How many numbers do you want to use in the array?\n> ");
    scanf("%d", &count);

    double *arr;
    arr = (double *)malloc(sizeof(double) * count);

    int i;
    for (i = 0; i < count; i++)
    {

        printf("Please enter a number (%d of %d)\n> ", i + 1, count);
        scanf("%lf", &arr[i]);
    }

    Min(arr, count);

    Max(arr, count);

    Average(arr, count);
}

Тесты:

  • Средний ({1,3,5}, 3)

    Ожидаемый: 3, получил: 4,333333

  • Средний ({1,1,1}, 3)

    Ожидаемый: 1, Получил: 1

  • Средний ({1,2,3,4,5,6,7,8,9}, 9)

    Ожидается: 5, получено: 5,888889

Два дополнительных метода для каждого запроса пользователя:

double *Min(double *arr, int size)
{
    double *min = &arr[0];
    int i;
    for (int i = 1; i < size; i++)
    {
        if (arr[i] < *min)
        {
        *min = arr[i];
        }
    }

    printf("Smallest number in array: %f\n", *min);
    return min;
}

double *Max(double *arr, int size)
{
    double *max = &arr[0];
    int i;
    for (int i = 1; i < size; i++)
    {
        if (arr[i] > *max)
        {
            *max = arr[i];
        }
    }

    printf("Largest number in array: %f\n", *max);
    return max;
}

1 Ответ

0 голосов
/ 13 сентября 2018

Проблема здесь, исправьте это:

        *max = arr[i];

вы меняете *max, который равен arr[0], на максимум или минимум вашего массива.Поэтому, когда Average() функция получает массив, это не тот массив, который вы вводите, он изменяется.Например:

        Max({1,3,5})=5

массив становится:

        arr={5,3,5}  

Среднее значение правильно:

       Average({5,3,5} = 4.3333      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...