Средние баллы
В табель нужен средний балл каждого ученика: сумма его баллов, делённая на число тестов, то есть на 3. Сумма — это шаблон из урока про циклы: переменная, которая начинается с 0, и цикл, который прибавляет к ней каждое значение.
Новая функция average() посчитает средний балл одного ученика. Параметром она получает ученика целиком: double average(Student student). Тип — Student с большой буквы S, а параметр — student с маленькой. C различает большие и маленькие буквы, поэтому для него это два разных имени. Как вы знаете из урока про структуры, параметр-структура — это копия: функция получает собственную копию ученика с именем и всеми баллами. Здесь это нормально, ведь она их только читает. Возвращает она десятичное число, поэтому её тип — double.
Остерегайтесь целочисленного деления: 125 / 3 равно 41, и дробная часть пропадает. Результат получится дробным, если хотя бы одно из чисел — double. Проще всего сразу складывать в переменную типа double:
int temperatures[] = {18, 21, 23, 19};
double sum = 0;
for (int i = 0; i < 4; i++) {
sum += temperatures[i];
}
printf("Средняя температура: %.2f\n", sum / 4);Средняя температура: 20.25Ещё одна ловушка: return должен стоять после цикла. Внутри цикла он завершил бы функцию уже на первом проходе, и средний балл посчитался бы только по первому тесту. А если после цикла нет return, программа даже не скомпилируется: non-void function does not return a value in all control paths.
Напишите новую функцию над print_report(), которая будет её вызывать. Если бы она стояла ниже, в месте вызова компилятор ещё не знал бы о ней и сообщил бы об ошибке:
main.c:17:27: error: call to undeclared function 'average'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]Функцию, которая возвращает значение, можно вызвать прямо внутри printf: average(students[i]) даёт средний балл ученика с индексом i, а %6.1f выводит его с одним знаком после запятой в 6 символах.
Задание
- 1
Над
print_report()напишите функциюdouble average(Student student), которая складывает три числа изstudent.pointsи возвращает сумму, делённую на 3. - 2
В
print_report()заменитеprintf("\n");в конце строки каждого ученика наprintf("%6.1f\n", average(students[i]));: оно выведет средний балл ученика и завершит строку. Программа выведет:ИТОГИ ПО МАТЕМАТИКЕ Adam 42 38 45 41.7 Emma 36 33 38 35.7 Finn 48 50 47 48.3 Jack 14 22 17 17.7 Lucy 27 40 41 36.0Если у Adam получилось
41.0, вы делите целые числа. Если14.0, внутри цикла стоитreturn.