Einen Schüler finden
Lena hat sich beschwert: Die Lehrerin hat ihre Punkte falsch zusammengezählt. Sie sollte 35 haben, nicht 27. Das Programm braucht eine Funktion, die die Punktzahl eines Schülers anhand des Namens korrigiert. Aber zuerst muss sie den Schüler in namen finden, also seinen Index.
Das Suchen ist ein Muster aus der Lektion über Schleifen: Die Schleife geht die Elemente durch, und wenn sie das richtige findet, merkt sie sich seinen Index, und break beendet die Schleife, weil es nicht nötig ist, weiterzusuchen. Die Variable für den Index beginnt bei -1. Kein Vektor hat so einen Index. Findet die Schleife nichts, bleibt die Variable -1, und das bedeutet, dass das Gesuchte nicht im Vektor ist:
#include <iostream>
#include <string>
#include <vector>
int findeFach(const std::vector<std::string>& faecher, std::string gesucht) {
int index = -1;
for (int i = 0; i < faecher.size(); i++) {
if (faecher[i] == gesucht) {
index = i;
break;
}
}
return index;
}
int main() {
std::vector<std::string> stundenplan = {"Mathe", "Physik", "Geschichte"};
std::cout << findeFach(stundenplan, "Physik") << std::endl;
std::cout << findeFach(stundenplan, "Chemie") << std::endl;
return 0;
}1
-1Texte vergleichst du mit ==, und der Vergleich ist exakt: "lena" ist nicht dasselbe wie "Lena".
Die Funktion korrigierePunkte() bekommt beide Vektoren. namen liest sie nur, deshalb bekommt sie sie als const-Referenz. punkte ändert sie, deshalb bekommt sie sie als Referenz ohne const.
Die Reihenfolge der Aufrufe in main() ist wichtig. Lena hat im Test 35 Punkte erreicht, und sie bekommt die 3 Punkte für die fehlerhafte Frage wie alle anderen. Die Korrektur steht also vor dem Aufruf von addierePunkte(punkte, 3). Danach würde die Korrektur Lenas Bonus überschreiben, und sie hätte nur 35 Punkte.
Und was, wenn die Lehrerin einen Namen eingibt, der nicht im Vektor steht? Max zum Beispiel geht in die Parallelklasse. findeSchueler() gibt -1 zurück, und punkte[-1] liegt außerhalb des Vektors. Aus der Lektion über Vektoren weißt du, dass ein Index außerhalb des Bereichs ein Fehler ist: Das Programm kann abstürzen oder stillschweigend Speicher überschreiben, der nicht zum Vektor gehört. Deshalb prüft korrigierePunkte() zuerst den Index.
So schreibst du es:
Anweisungen
- 1
Schreibe unter
addierePunkte()eine Funktionint findeSchueler(const std::vector<std::string>& namen, std::string name), die den Index des Schülers mit dem Namennamezurückgibt, oder-1, wenn er nicht im Vektor steht. Wenn sie den Schüler findet, beende die Schleife mitbreak. - 2
Schreibe darunter eine Funktion
void korrigierePunkte(const std::vector<std::string>& namen, std::vector<int>& punkte, std::string name, int neuePunkte), die den Index des Schülers mitfindeSchueler()findet und seine Punktzahl aufneuePunktesetzt. - 3
Korrigiere in
main()über dem Aufruf vonaddierePunkte()Lenas Punktzahl:korrigierePunkte(namen, punkte, "Lena", 35);. Lena hat jetzt 35 + 3 = 38 Punkte, und die Ergebnisse enden so:Lena: 38 Punkte, Note B Durchschnitt: 38.2 Bester: Finn (50 Punkte)Wenn Lena 35 Punkte hat, rufst du die Korrektur nach
addierePunkte()auf. - 4
Füge zu
korrigierePunkte()eine Prüfung hinzu: GibtfindeSchueler()-1zurück, gibMax ist nicht in der Klasse.aus, mit dem Namen, den die Funktion bekommen hat, stattMax, und ändere die Punktzahlen nicht. Probiere es dann aus: Füge unter Lenas KorrekturkorrigierePunkte(namen, punkte, "Max", 40);ein. Über den Ergebnissen erscheint:Max ist nicht in der Klasse.