Функция для сложения и получения среднего значения определенного пользователем одномерного массива - PullRequest
1 голос
/ 03 апреля 2020

Это вопрос «Напишите функцию, которая получает массив целых чисел и количество элементов в качестве параметров, а также вычисляет и отображает сумму и среднее значение всех целых чисел массива на C языке»

Ниже приведен код, который я сделал, он работает, но состоит из ошибок, которые дают ложные ответы

#include <stdio.h>

void SumAvg(int x, int arr[x]) {
  int i, sum = 0;
  float avg = 0;

  for (i = 0; i < x; ++i) {
    sum += arr[i];
  }
  avg = (float)sum / x;

  printf("The sum is %d", sum);
  printf("\nThe average is %.2f", avg);
}

int main() {
  int x, i;

  printf("Enter number of elements");
  scanf("%d", &x);

  int arr[x];

  for (i = 0; i < x; ++i) {
    printf("Enter integers for array[%d]", i + 1);
    scanf("%d", &arr[i]);
  }
  SumAvg(x, arr[x]);

  return 0;
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Для начала функция должна быть объявлена ​​следующим образом

void SumAvg( const int arr[], size_t n );

То есть параметр, который объявляет массив, должен иметь квалификатор const, поскольку массив не изменяется в функции.

Количество элементов массива должно иметь тип size_t.

Определение функции может выглядеть следующим образом

void SumAvg( const int arr[], size_t n )
{
    long long int sum = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        sum += arr[i];
    }

    double avg = n == 0 ? 0 : ( double )sum / n;


    printf( "The sum is %lld\n", sum );
    printf( "The average is %.2f\n", avg );
}

То есть внутри функции переменная sum должна иметь тип long long int для уменьшения риска переполнения.

В общем случае пользователь может передать в функцию количество элементов, равное 0. В этом случае, если не проверять это значение, функция будет иметь неопределенное значение. поведение.

Этот вызов функции

SumAvg(x, arr[x]);

недопустим, поскольку вместо передачи массива вы передаете его несуществующий элемент с индексом x.

* 1023. * Принимая во внимание приведенное выше определение функции, действительный вызов функции будет выглядеть как
SumAvg( arr, x );
1 голос
/ 03 апреля 2020

Во-первых, ваш вызов функции неправильный. Он должен быть SumAvg(x,arr) вместо SumAvg(x, arr[x]);.

также в объявлении функции, в некоторых компиляторах void SumAvg(int x, int arr[x]) может быть проблематичным c.

...