Проблемы с нахождением среднего числа элементов - PullRequest
0 голосов
/ 28 ноября 2018

Работа с Repl.it и попытка использовать функцию в C для усреднения элементов в массиве переменной длины.Моя программа отлично работает в любой другой области ввода / вывода, кроме среднего значения, которое возвращает:

Среднее значение за этот день: -nan.Любое представление о том, что проблема может быть?

Цель состоит в том, чтобы получить пользовательский ввод в виде двойной (например, сколько пин крови было взято в час в течение 7-часового периода, а затем использовать вызов функции длярассчитать среднюю сумму за этот семичасовой период.

Новый код выглядит следующим образом:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double average(int size, float ary[*]);


int main(void)
{
char dayOne[8], dayTwo[8];
int size;
float ave;

printf("Over how many hours do you want to view donation amounts?: "); 
scanf("%d", &size);
if (size < 7 || size > 7)
  size = 7;
printf("Enter day that you want to see average donation amount for: ");
scanf("%s", dayOne);
{
    float ary[size];

    for (int i = 0; i < size; i++)
    {
        printf("\nEnter amount taken in hour %d:", i + 1);
        scanf("%f", &ary[i]);

    }
    ave = average(size, ary);
    printf("\nThe average donated for %s is: %2.1f", dayOne, ave);
 }

 printf("\n\nEnter day that you want to see average donation amount for: ");
 scanf("%s", dayTwo);

if(strcmp(dayOne, dayTwo)== 0)
   printf("\nEnter a different day please: ");

   scanf("%s", dayTwo);

 {
  float ary[size];

  for (int i = 0; i < size; i++)
  {
    printf("\nEnter amount taken in hour %d:", i + 1);
    scanf("%f", &ary[i]);
 }
    ave = average(size, ary);
    printf("\nThe average donated for %s is: %2.1f", dayTwo, ave);

}   


return 0;
}

double average(int size, float ary[])
{

double sum = 0;

double ave;

for (int i = 0; i < size; i++)
    sum += ary[i];

ave = (double)sum / size;
return ave;
}

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Довольно несколько синтаксических и логических изменений, которые нужно сделать, приятель.Как упоминал Эрик Постпишил в своем ответе, ваша переменная size ни перед чем не инициализируется.И использование %f для принятия целых чисел также некорректно.Наряду с этим, есть несколько других глюков, которые я перечислю ниже, с соответствующими исправлениями.Я также приложил полный рабочий код вместе с выводом.

  1. Ошибка: size переменная не инициализирована.

    Исправлено: : Поскольку у вас фиксированное количество часов, вы можете использовать 7 напрямую или через size.Следовательно, инициализируйте переменную при объявлении ее.И просто приятель с предложением, используйте int для size.==> int size = 7;

  2. Ошибка: Прием ввода для значений массива.Массив ary имеет тип int, но вы использовали %f, который является спецификатором формата для float.

    Fix: Используйте %d, который являетсяспецификатор формата для int типа данных.==> scanf("%d", &ary[i]);

  3. Ошибка: Спецификатор формата, используемый для печати среднего значения.Вы снова использовали %f, что для float, а переменная ave для среднего, если типа double.

    Fix: Использовать %lf в форматеспецификатор для double.==> printf("\nThe average for the 2nd day is: %.3lf", ave); .3 перед lf служит только для ограничения количества десятичных знаков до 3. Это необязательно.

  4. Ошибка: Вы принимаете второй день и отображаете сообщение, если оно совпадает с первым днем, но scanf для этого выходит из цикла if.следовательно, он предлагает пользователю ввести другое имя дня независимо от того, совпадает ли второй день ввода с первым или нет.

    Fix: просто переместите это scanf в if цикл, в котором вы проверяете, совпадает ли этот день с предыдущим.

  5. Я бы не стал называть этот день ошибкой, потому что это просто улучшение, которое я считаю нужнымбыть сделаноВы принимаете второй день, который должен отличаться от первого с сообщением, что будет найдено среднее значение.Но вы не рассчитываете среднее значение за этот день.Поэтому я включил эту часть в код.

КОД:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double average(int, int [7]);


    int main(void)
    {
        char dayOne[8], dayTwo[8];
        int size = 7;
        double ave;


        printf("Enter day that you want to see average donation amount for: ");
        scanf("%s", dayOne);

        int ary[7];

        for (int i = 0; i < 7; i++)
        {
            printf("Enter amount taken in hour %d:", i + 1);
            scanf("%d", &ary[i]);

        }
        ave = average(size, ary);
        printf("\nThe average for the 1st day is: %.3lf", ave);


        printf("\n\nEnter day that you want to see average donation amount for:");
        scanf("%s", dayTwo);

        if(strcmp(dayOne, dayTwo)== 0) {
            printf("\nEnter a different day please: ");
            scanf("%s", dayTwo);
        }


        for (int i = 0; i < 7; i++)
        {
            printf("Enter amount taken in hour %d:", i + 1);
            scanf("%d", &ary[i]);
        }

        ave = average(size, ary);
        printf("\nThe average for the 2nd day is: %.3lf", ave);

        return 0;
    }

    double average(int size, int ary[7])
    {

        int sum = 0;
        double ave;
        for (int i = 0; i < size; i++) {
        sum = sum + ary[i];
    }
        ave = sum / size;
        return ave;
    }

ВЫХОД:

Enter day that you want to see average donation amount for:  Day1
Enter amount taken in hour 1: 1
Enter amount taken in hour 2: 2
Enter amount taken in hour 3: 3
Enter amount taken in hour 4: 4
Enter amount taken in hour 5: 5
Enter amount taken in hour 6: 6
Enter amount taken in hour 7: 7

The average for the 1st day is: 4.000

Enter day that you want to see average donation amount for: Day2
Enter amount taken in hour 1: 8
Enter amount taken in hour 2: 8
Enter amount taken in hour 3: 8
Enter amount taken in hour 4: 8
Enter amount taken in hour 5: 8
Enter amount taken in hour 6: 8
Enter amount taken in hour 7: 8

The average for the 2nd day is: 8.000

Надеюсь, это поможет.

0 голосов
/ 28 ноября 2018
  1. double size;

Переменная размера не была установлена ​​до вызова функции усреднения.ave = средний (размер, ary);

Может быть размер может быть инициализирован до 0 и увеличен в цикле for, как указано ниже

double size = 0;
double ave;
printf("Enter day that you want to see average donation amount for: ");
scanf("%s", dayOne);
{
int ary[7];

for (int i = 0; i < 7; i++)
{
    printf("Enter amount taken in hour %d:", i + 1);
    scanf("%f", &ary[i]);
    size++;

}
ave = average(size, ary);
printf("\nThe average for the day is: %f", ave);
}
Если целью является получение пользовательского ввода в виде double, массив, используемый для хранения этих значений, должен быть double.

double ary [7];вместо внутреннего [7];

0 голосов
/ 28 ноября 2018

Это неверно:

int ary[7];
…
scanf("%f", &ary[i]);

%f для сканирования float, но ary[i] - int.Результирующее поведение не определено.

Это неправильно:

double size;
…
ave = average(size, ary);

Ничто в «…» не присваивает значение size, поэтому оно не имеет определенного значения, когда averageназывается.

...