Бонусные баллы
Finn и Jack помогали проводить школьную олимпиаду по математике, и учитель их награждает: каждый получает 3 бонусных балла за каждый тест. Но ни за один тест не может быть больше 50 баллов, ведь это максимум за тест.
На этот раз функция изменяет ученика. Если бы она получала его как Student student, она изменила бы только свою копию, а ученик в массиве остался бы прежним. Поэтому она получает указатель на ученика: Student *student, адрес ученика в массиве. Через него функция меняет оригинал. К полям структуры через указатель обращаются со стрелкой, ->: student->points[i] означает то же самое, что (*student).points[i]. Например, игра, в которой у игрока может быть не больше 5 жизней:
#include <stdio.h>
typedef struct {
char name[20];
int lives;
} Player;
void add_lives(Player *player, int extra) {
player->lives += extra;
if (player->lives > 5) {
player->lives = 5;
}
}
int main(void) {
Player players[] = {
{"Tom", 2},
{"Sara", 4},
};
add_lives(&players[0], 2);
add_lives(&players[1], 2);
printf("%s, жизней: %d\n", players[0].name, players[0].lives);
printf("%s, жизней: %d\n", players[1].name, players[1].lives);
return 0;
}Tom, жизней: 4
Sara, жизней: 5Когда вы вызываете функцию, адрес ученика передаётся через &: &students[3] — это адрес ученика с индексом 3, то есть Jack. Типичные ошибки:
- Без
&компилятор сообщаетerror: passing 'Student' to parameter of incompatible type 'Student *'; take the address with &. В конце сообщения даже сказано, что делать. - Если вместо стрелки поставить точку,
student.points[i], он сообщитerror: member reference type 'Student *' is a pointer; did you mean to use '->'? - Если написать
const Student *student, функции нельзя менять ученика, и компилятор сообщитerror: cannot assign to variable 'student' with const-qualified type 'const Student *'.
Вызовы пишут в main(), над print_report(students, count);: сначала баллы меняются, потом выводятся. Если наоборот, выведутся старые баллы.
Задание
- 1
Под
print_report()(надmain()) напишите функциюvoid add_bonus(Student *student, int bonus), которая в цикле прибавляетbonusк баллам ученика за каждый из трёх тестов. - 2
В
main()над вызовомprint_report()дайте бонус Finn и Jack:add_bonus(&students[2], 3);иadd_bonus(&students[3], 3);. У Jack теперь на 3 балла больше за каждый тест, и со средним баллом 20.7 он получает D:Jack 17 25 20 20.7 DЕсли ничего не изменилось, вы вызываете
add_bonus()послеprint_report(). А у Finn теперь 51 и 53 балла, больше, чем можно получить за тест. Это вы исправите на следующем шаге. - 3
Измените
add_bonus(): если после прибавления за тест получилось больше 50 баллов, установите50. Тогда результаты будут такими:ИТОГИ ПО МАТЕМАТИКЕ Adam 42 38 45 41.7 B Emma 36 33 38 35.7 C Finn 50 50 50 50.0 A Jack 17 25 20 20.7 D Lucy 27 40 41 36.0 C Лучший: Finn (среднее 50.0)