Durchschnitte
Das Zeugnis braucht den Durchschnitt jedes Schülers: die Summe seiner Punkte geteilt durch die Zahl der Tests, also 3. Die Summe ist das Muster aus der Lektion über Schleifen: eine Variable, die bei 0 beginnt, und eine Schleife, die jeden Wert zu ihr addiert.
Eine neue Funktion, durchschnitt(), berechnet ihn für einen Schüler. Sie bekommt den ganzen Schüler als Parameter: double durchschnitt(Schueler schueler). Der Typ ist Schueler mit großem S, und der Parameter ist schueler mit einem kleinen. C unterscheidet Groß- und Kleinbuchstaben, für C sind das also zwei verschiedene Namen. Wie du aus der Lektion über Strukturen weißt, ist ein Strukturparameter eine Kopie: Die Funktion bekommt ihre eigene Kopie des Schülers, mit dem Namen und allen Punkten. Das ist hier in Ordnung, weil sie sie nur liest. Sie gibt eine Dezimalzahl zurück, ihr Typ ist also double.
Vorsicht bei der Division ganzer Zahlen: 125 / 3 ist 41, die Nachkommastellen gehen verloren. Das Ergebnis hat Nachkommastellen, wenn mindestens eine der Zahlen ein double ist. Am einfachsten addierst du gleich in einer double-Variablen:
int temperaturen[] = {18, 21, 23, 19};
double summe = 0;
for (int i = 0; i < 4; i++) {
summe += temperaturen[i];
}
printf("Durchschnittstemperatur: %.2f\n", summe / 4);Durchschnittstemperatur: 20.25Noch eine Falle: return gehört hinter die Schleife. In der Schleife würde es die Funktion schon im ersten Durchlauf beenden, und der Durchschnitt würde nur aus dem ersten Test berechnet. Und ohne ein return hinter der Schleife lässt sich das Programm nicht einmal übersetzen: non-void function does not return a value in all control paths.
Schreibe die neue Funktion über ergebnisse_ausgeben(), die sie aufruft. Stünde sie darunter, würde der Compiler sie an der Stelle des Aufrufs noch nicht kennen und einen Fehler melden:
main.c:17:27: error: call to undeclared function 'durchschnitt'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]Eine Funktion, die einen Wert zurückgibt, kannst du direkt in printf aufrufen: durchschnitt(klasse[i]) liefert den Durchschnitt des Schülers mit dem Index i, und %6.1f gibt ihn mit einer Nachkommastelle in 6 Zeichen aus.
So schreibst du es:
Anweisungen
- 1
Schreibe über
ergebnisse_ausgeben()eine Funktiondouble durchschnitt(Schueler schueler), die die drei Zahlen inschueler.punkteaddiert und ihre Summe geteilt durch 3 zurückgibt. - 2
Ersetze in
ergebnisse_ausgeben()dasprintf("\n");am Ende der Zeile jedes Schülers durchprintf("%6.1f\n", durchschnitt(klasse[i]));. Es gibt den Durchschnitt des Schülers aus, bevor es die Zeile beendet. Das Programm gibt aus:ERGEBNISSE IN MATHE Anna 42 38 45 41.7 Emma 36 33 38 35.7 Finn 48 50 47 48.3 Jonas 14 22 17 17.7 Lena 27 40 41 36.0Wenn Anna
41.0hat, dividierst du ganze Zahlen. Wenn sie14.0hat, steht einreturnin der Schleife.