В вашем коде есть несколько проблем, первая:
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)
}