Передача массива структуры в функцию и вычисление среднего значения в C? - PullRequest
1 голос
/ 07 апреля 2020

Новичок здесь, я пытался это часами и не могу заставить его работать, искал в Интернете и не мог найти ответ.

Я пытаюсь написать программу, в которой вы введите людей, указав их возраст и рост, затем вычислите среднее значение каждого из них и среднее отношение возраста к росту. Всякий раз, когда я передаю структуру моей функции getAverage, она возвращает адрес (я думаю) вместо средних значений.

#include <stdio.h>
#include <stdlib.h>

typedef struct person
{
    int age;
    double height;
} Person;

double getAv (Person people[50], int max)
{

    int i;
    double total, retval;
    total = 0;
    for (i=0; i<=max; i++)
    {
        total = total + people[i].age;
    }

    retval = total / max;
    return retval;
}


int main (void)
{
    Person people[50];
    int i;

    while (i++, people[i].age>=0)
    {
        printf ("Person #%d\n", i);

        printf ("enter an age: ");
        scanf ("%d", &people[i].age);

        if (people[i].age<0)
            break;

        printf ("enter a height: ");
        scanf ("%lf", &people[i].height);

        printf ("\n");
    }

    double averageAge;
    averageAge = getAv (&people[50], i);
    printf ("%.1lf\n", averageAge);
}

Еще не реализовали среднюю высоту или соотношение, просто пытаясь получить среднее значение для возрастов работать на данный момент. Когда я пытаюсь взять & out of averageAge = getAv (& people [50], I); Я получаю ошибку компиляции, которая говорит мне, что ей нужно &. Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

в этом коде есть ошибки, сначала вы должны инициализировать int i до int i=0 в функции mian.

как используется это условие while (i++, people[i].age>=0), когда вы не сканировали ни один вход, это как использование неинициализированной переменной. вам нужен do-while как этот

    do 
    {
        printf("Person #%d\n", i);

        printf("enter an age: ");
        scanf("%d", &people[i].age);

        if (people[i].age < 0)
            break;

        printf("enter a height: ");
        scanf("%lf", &people[i].height);

        printf("\n");
        i++;
    } while (people[i-1].age >= 0);

также вы отправляете неверные аргументы в вашу getAv функцию, которую вы должны использовать averageAge = getAv (people, i);.

и в вашей функции вы должны удалить = в этом l oop for (i=0; i<=max; i++) .Это должно быть for (i=0; i<max; i++), в противном случае введенный отрицательный возраст также будет добавлен к итогу и повлияет на среднее значение.

0 голосов
/ 07 апреля 2020

В вашем коде есть несколько проблем, первая:

Person people[50];
int i;

while (i++, people[i].age>=0)

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

Чтобы избежать подобных проблем, в будущем включите предупреждения на вашем компиляторе, компилятор сказал бы вам что-то вроде:

‘i’ is used uninitialized in this function [-Wuninitialized]

Так что переключитесь на

Person people[50] = {0};
int i = 0;

Кажется (на основе оператора предварительного приращения ++i), что вы хотите использовать массивы с основанием 1, в этом нет ничего плохого, но в вашей средней функции вы начинаете с 0, поэтому используйте for:

for (i = 0; ; i++)
{
   ...
   if (people[i].age <= 0) break;
   ...
}

Другая проблема:

double averageAge;
averageAge = getAv (&people[50], i);

Таким образом, вы передаете только элемент 50, который не является частью вашего массива (помните, что массивы являются базовыми 0 в C) , чтобы передать весь массив:

averageAge = getAv (people, i);

или

averageAge = getAv (&people[0], i);

Последний:

for (i=0; i<=max; i++)

Вы включаете элемент, отброшенный при проверке на наличие age > 0, переключиться на:

for (i=0; i<max; i++)

Незначительная проблема:

Если пользователь вводит 0 для первого элемента people, вы в итоге делитесь на 0

double averageAge;
averageAge = getAv (&people[50], i);
printf ("%.1lf\n", averageAge);

должно быть

if (i > 0)
{
    double averageAge;
    averageAge = getAv (people, i);
    printf ("%.1f\n", averageAge); // No need to use lf (long double)
}
0 голосов
/ 07 апреля 2020

Если вы делаете это таким образом, вам нужно получить в своей функции (Person & people [], int n), где n - длина массива. Мы используем '&', чтобы не делать копии массива, а также вы передаете в функцию только элемент с индексом 50, просто сделайте только (people, n)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...