Einen Schüler finden
Lena ist gekommen, um sich zu beschweren: Die Lehrerin hat ihren ersten Test falsch zusammengezählt. Sie müsste 35 Punkte haben, nicht 27. Das Programm braucht eine Funktion, die die Punkte eines Schülers anhand seines Namens korrigiert. Aber zuerst muss es den Schüler im Array finden.
Suchen ist ein Muster, das du kennst: Eine Schleife geht die Schüler durch, und wenn sie den richtigen findet, gibt sie sofort einen Zeiger auf ihn zurück (return beendet auch die Schleife). Wenn die Schleife endet, ohne jemanden zu finden, gibt die Funktion NULL zurück, den Zeiger, der nirgendwohin zeigt. Die Namen vergleichst du mit strcmp aus string.h, das für gleichen Text 0 zurückgibt:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[20];
int preis;
} Produkt;
Produkt *finde_produkt(Produkt waren[], int anzahl, const char name[]) {
for (int i = 0; i < anzahl; i++) {
if (strcmp(waren[i].name, name) == 0) {
return &waren[i];
}
}
return NULL;
}
int main(void) {
Produkt laden[] = {
{"Brot", 349},
{"Milch", 129},
};
Produkt *milch = finde_produkt(laden, 2, "Milch");
if (milch != NULL) {
milch->preis = 119;
}
printf("Milch: %d Cent\n", laden[1].preis);
if (finde_produkt(laden, 2, "Quark") == NULL) {
printf("Heute kein Quark.\n");
}
return 0;
}Milch: 119 Cent
Heute kein Quark.Die Funktion gibt &waren[i] zurück, die Adresse des Produkts im Array des Aufrufers, keine Kopie. Deshalb hat die Änderung von milch->preis den Preis in laden geändert. Der Parameter ist Produkt waren[] ohne const, weil das Produkt über den zurückgegebenen Zeiger verändert wird.
Häufige Fehler:
klasse[i].name == namevergleicht nicht die Texte, sondern ihre Adressen und findet deshalb nie jemanden. Verwendestrcmp.strcmpgibt0zurück, wenn die Texte gleich sind, die Bedingung lautet alsostrcmp(...) == 0. Ohne== 0ist sie für jeden anderen Namen wahr.- Ohne
#include <string.h>meldet der Compilererror: call to undeclared library function 'strcmp'.
Und was, wenn die Lehrerin einen Namen eingibt, der nicht im Array steht? Max zum Beispiel geht in die Parallelklasse. finde_schueler() gibt NULL zurück, und ein Schreiben von schueler->punkte[test] über NULL würde das Programm mit RuntimeError: unreachable anhalten. Deshalb prüft punkte_korrigieren() den Zeiger, bevor sie ihn benutzt.
So schreibst du es:
Anweisungen
- 1
Füge unter
#include <stdio.h>die Zeile#include <string.h>hinzu. Schreibe dann unterbonus_geben()eine FunktionSchueler *finde_schueler(Schueler klasse[], int anzahl, const char name[]), die einen Zeiger auf den Schüler mit dem Namennamezurückgibt oderNULL, wenn er nicht im Array steht. - 2
Schreibe darunter eine Funktion
void punkte_korrigieren(Schueler klasse[], int anzahl, const char name[], int test, int neue_punkte). Sie findet den Schüler mitfinde_schueler(). Bekommt sieNULL, gibt sie den Namen gefolgt vonist nicht in der Klasse.aus. Für Max ist dasMax ist nicht in der Klasse.Sonst setzt sie die Punkte des Schülers im Test mit dem Indextestaufneue_punkte. - 3
Korrigiere in
main()über dem Aufruf vonergebnisse_ausgeben()Lenas ersten Test (Index0):punkte_korrigieren(klasse, anzahl, "Lena", 0, 35);. Lena hat jetzt eine 2:Lena 35 40 41 38.7 2Wenn Lena
27 35 41hat, hast du den Index 1 verwendet. Der erste Test hat den Index 0. - 4
Probiere einen Namen aus, der nicht in der Klasse ist: Füge unter Lenas Korrektur
punkte_korrigieren(klasse, anzahl, "Max", 0, 40);hinzu. Über den Ergebnissen erscheint:Max ist nicht in der Klasse.