Bonuspunkte
Finn und Jonas haben beim Mathe-Wettbewerb der Schule geholfen, und die Lehrerin belohnt sie: Sie bekommen jeweils 3 Bonuspunkte für jeden Test. Aber kein Test darf mehr als 50 Punkte haben, denn mehr konnte ein Test nicht geben.
Diesmal verändert die Funktion einen Schüler. Bekäme sie den Schüler als Schueler schueler, würde sie nur ihre eigene Kopie ändern, und der Schüler im Array bliebe gleich. Deshalb bekommt sie einen Zeiger auf den Schüler: Schueler *schueler, die Adresse des Schülers im Array. Darüber ändert die Funktion das Original. Auf die Member einer Struktur greifst du über einen Zeiger mit einem Pfeil zu, ->: schueler->punkte[i] bedeutet dasselbe wie (*schueler).punkte[i]. Zum Beispiel ein Spiel, in dem ein Spieler höchstens 5 Leben haben kann:
#include <stdio.h>
typedef struct {
char name[20];
int leben;
} Spieler;
void leben_hinzufuegen(Spieler *spieler, int extra) {
spieler->leben += extra;
if (spieler->leben > 5) {
spieler->leben = 5;
}
}
int main(void) {
Spieler team[] = {
{"Tom", 2},
{"Lisa", 4},
};
leben_hinzufuegen(&team[0], 2);
leben_hinzufuegen(&team[1], 2);
printf("%s: %d Leben\n", team[0].name, team[0].leben);
printf("%s: %d Leben\n", team[1].name, team[1].leben);
return 0;
}Tom: 4 Leben
Lisa: 5 LebenBeim Aufruf der Funktion gibst du ihr mit & die Adresse eines Schülers: &klasse[3] ist die Adresse des Schülers mit dem Index 3, Jonas. Typische Fehler:
- Ohne das
&meldet der Compilererror: passing 'Schueler' to parameter of incompatible type 'Schueler *'; take the address with &. Das Ende der Meldung sagt sogar, was du tun sollst. - Mit einem Punkt statt des Pfeils,
schueler.punkte[i], meldet ererror: member reference type 'Schueler *' is a pointer; did you mean to use '->'? - Mit
const Schueler *schuelerdarf die Funktion den Schüler nicht ändern, und der Compiler meldeterror: cannot assign to variable 'schueler' with const-qualified type 'const Schueler *'.
Die Aufrufe stehen in main() über ergebnisse_ausgeben(klasse, anzahl);: Zuerst ändern sich die Punkte, dann werden sie ausgegeben. Umgekehrt würden die alten Punkte ausgegeben.
So schreibst du es:
Anweisungen
- 1
Schreibe unter
ergebnisse_ausgeben()(übermain()) eine Funktionvoid bonus_geben(Schueler *schueler, int bonus), die in einer Schleifebonuszu jedem der drei Testergebnisse des Schülers addiert. - 2
Gib in
main()über dem Aufruf vonergebnisse_ausgeben()Finn und Jonas den Bonus:bonus_geben(&klasse[2], 3);undbonus_geben(&klasse[3], 3);. Jonas hat jetzt in jedem Test 3 Punkte mehr, und mit einem Durchschnitt von 20.7 bekommt er eine 4:Jonas 17 25 20 20.7 4Wenn sich nichts geändert hat, rufst du
bonus_geben()nachergebnisse_ausgeben()auf. Aber Finn hat jetzt 51 und 53 Punkte, mehr als ein Test geben konnte. Das behebst du im nächsten Schritt. - 3
Ändere
bonus_geben(): Wenn ein Test nach der Addition mehr als 50 Punkte hat, setze ihn auf50. Dann sehen die Ergebnisse so aus:ERGEBNISSE IN MATHE Anna 42 38 45 41.7 2 Emma 36 33 38 35.7 3 Finn 50 50 50 50.0 1 Jonas 17 25 20 20.7 4 Lena 27 40 41 36.0 3 Bestes Ergebnis: Finn (Durchschnitt 50.0)