Halbjahresergebnisse
Willkommen zur letzten Lektion des C-Kurses! In ihr fügst du alles zusammen, was du gelernt hast, und baust Schritt für Schritt ein nützliches Programm: die Mathe-Ergebnisse einer Klasse für das ganze Halbjahr. Die Klasse hat in diesem Halbjahr drei Tests geschrieben, und für die Zeugnisse braucht die Lehrerin von jedem Schüler den Durchschnitt und die Note. Wenn du fertig bist, gibt dein Programm Ergebnisse wie diese 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 35 40 41 38.7 2
Bestes Ergebnis: Finn (Durchschnitt 50.0)
Klassendurchschnitt: 37.3Das Programm gibt eine Tabelle mit den Punkten, dem Durchschnitt und der Note jedes Schülers aus, findet das beste Ergebnis, vergibt Bonuspunkte und korrigiert einen Fehler in den Punkten eines Schülers. Du verwendest Variablen, Bedingungen, Schleifen, Arrays, Zeichenketten, Funktionen, Zeiger und Strukturen: alles aus dem Kurs. Jede Übung setzt dort an, wo die vorige aufgehört hat (der Editor beginnt mit ihrem fertigen Code), und fügt ein Stück hinzu.
Die Daten. Jeder Schüler ist eine Struktur vom Typ Schueler mit einem Namen und einem Array mit den Punkten aus den drei Tests (in jedem Test gab es höchstens 50 Punkte). Die Schüler stehen am Anfang von main() im Array klasse. Jeder Schüler hat darin zwei Paare geschweifter Klammern: Die äußeren gehören zum ganzen Schüler, die inneren zum Array punkte. Das Komma nach dem letzten Schüler ist kein Fehler: C erlaubt es, und es macht das Hinzufügen eines weiteren Schülers einfacher. klasse[0].name ist also "Anna", und klasse[0].punkte[2] ist ihr Ergebnis im dritten Test, 45. Die Variable anzahl enthält die Zahl der Schüler. Sie wird mit sizeof berechnet, bleibt also richtig, auch wenn du einen Schüler hinzufügst. In einer echten Schule kämen die Daten aus dem Online-System der Schule. Die Programme hier bekommen ihre Daten aus Variablen.
Der Plan. Das Programm ist in Funktionen aufgeteilt, und jede hat eine Aufgabe. Bisher gibt es eine: ergebnisse_ausgeben(), die das Array der Schüler und ihre Anzahl bekommt. Vorerst gibt sie nur die Überschrift aus. Sie steht über main(), weil eine Funktion deklariert sein muss, bevor du sie aufrufst. Das ist die übliche Form eines C-Programms: oben die Struktur, darunter die Funktionen und ganz unten main(), das sie benutzt.
Der Parameter const Schueler klasse[] ist die Adresse des Arrays aus main() (er bedeutet dasselbe wie const Schueler *klasse), es wird also nichts kopiert. Dank const darf die Funktion die Schüler nur lesen, und das ist alles, was die Ausgabe braucht.
Du gibst jeden Schüler in einer Zeile aus, Stück für Stück: den Namen, dann die Punkte mit einer inneren Schleife und zum Schluss \n. Breiten richten die Spalten aus: %-10s füllt den Namen mit Leerzeichen auf 10 Zeichen auf (das - setzt den Namen nach links), und %4d gibt eine Zahl rechtsbündig in 4 Zeichen aus. Zum Beispiel Fußballspieler und ihre Tore in drei Spielen:
#include <stdio.h>
typedef struct {
char name[20];
int tore[3];
} Spieler;
int main(void) {
Spieler team[] = {
{"Tom", {2, 0, 1}},
{"Lisa", {1, 3, 0}},
};
for (int i = 0; i < 2; i++) {
printf("%-6s", team[i].name);
for (int j = 0; j < 3; j++) {
printf("%3d", team[i].tore[j]);
}
printf("\n");
}
return 0;
}Tom 2 0 1
Lisa 1 3 0Die Bedingung ist i < anzahl, nicht <=. Der letzte Index ist anzahl - 1. Mit <= würde die Schleife also nach einem Schüler greifen, der nicht im Array steht, und das Programm würde mit RuntimeError: unreachable anhalten.
So schreibst du es:
Anweisungen
- 1
Schreibe in
ergebnisse_ausgeben()unter die Zeile, die die Überschrift ausgibt, einefor-Schleife mit einer Variableni, die bei0beginnt und läuft, solangeikleiner alsanzahlist. Gib in der Schleife den Namen jedes Schülers mitprintf("%-10s", klasse[i].name);aus und beende darunter die Zeile mitprintf("\n");. Die Namen erscheinen jeweils in einer eigenen Zeile. - 2
Füge zwischen diesen beiden
printf-Aufrufen eine innerefor-Schleife mit einer Variablenjhinzu, die läuft, solangejkleiner als3ist (drei Tests). Gib darin die Punkte des Schülersklasse[i].punkte[j]mit%4daus, ohne\n. Das Programm gibt aus:ERGEBNISSE IN MATHE Anna 42 38 45 Emma 36 33 38 Finn 48 50 47 Jonas 14 22 17 Lena 27 40 41