Funktionen und Vektoren
Ein Argument kann ein beliebiger Wert sein, auch ein Vektor. Der Parameter hat dann einen Vektortyp, zum Beispiel std::vector<int> zahlen. Eine Funktion, die einen Vektor bekommt, kann ihn mit einer Schleife durchgehen und ein Ergebnis zurückgeben. Diese Funktion zählt, wie viele Zahlen im Vektor größer als eine vorgegebene Grenze sind:
#include <iostream>
#include <vector>
int zaehleUeber(std::vector<int> zahlen, int grenze) {
int anzahl = 0;
for (int zahl : zahlen) {
if (zahl > grenze) {
anzahl++;
}
}
return anzahl;
}
int main() {
std::vector<int> temperaturen = {18, 25, 31, 22, 28};
std::vector<int> punkte = {5, 10, 15};
std::cout << zaehleUeber(temperaturen, 24) << std::endl;
std::cout << zaehleUeber(punkte, 7) << std::endl;
return 0;
}Dieses Programm gibt aus:
3
2Der Parameter zahlen enthält den Vektor, den der Aufruf übergibt: zuerst temperaturen, dann punkte. Das Zählen kennst du aus der Lektion über Schleifen, aber jetzt steckt es in einer Funktion, du kannst es also für jeden Vektor mit einem einzigen Aufruf erledigen. Und weil anzahl eine lokale Variable ist, beginnt jeder Aufruf wieder bei 0.
Achte darauf, wo das return steht: nach dem }, das die Schleife beendet, wenn alle Zahlen geprüft wurden. Ein häufiger Fehler ist, es eine Zeile höher in die Schleife zu schreiben:
for (int zahl : zahlen) {
if (zahl > grenze) {
anzahl++;
}
return anzahl;
}Jetzt steht das return im Rumpf der Schleife. Es beendet gleich im ersten Durchlauf die ganze Funktion und damit die Schleife. Die Funktion prüft nur die erste Zahl, 18, und gibt für temperaturen 0 zurück.
Eine Funktion kann auch einen Vektor zurückgeben. Der Rückgabetyp ist dann zum Beispiel std::vector<int>. Erstelle vor der Schleife einen leeren Vektor, füge in der Schleife mit push_back() Elemente hinzu und gib ihn nach der Schleife zurück.
Achte auf eines: Der Parameter bekommt eine Kopie des Vektors, genau wie bei den Zahlen in der vorigen Übung. Ändert die Funktion den Vektor in ihrem Parameter, ändert sie nur ihre Kopie, und der Vektor in main bleibt gleich:
#include <iostream>
#include <vector>
void fuegeBonusHinzu(std::vector<int> punkte) {
punkte.push_back(10);
std::cout << "In der Funktion: " << punkte.size() << " Elemente" << std::endl;
}
int main() {
std::vector<int> punkte = {5, 8, 7};
fuegeBonusHinzu(punkte);
std::cout << "In main: " << punkte.size() << " Elemente" << std::endl;
return 0;
}Dieses Programm gibt aus:
In der Funktion: 4 Elemente
In main: 3 ElementeDie Funktion hat ihrer Kopie ein Element hinzugefügt, nicht dem Vektor punkte in main. Willst du also, dass eine Funktion einen Vektor ändert, gib den Vektor vorerst aus der Funktion zurück und speichere ihn in main. Außerdem dauert das Kopieren eines großen Vektors eine Weile. In der nächsten Lektion, Referenzen und Zeiger, lernst du, wie du eine Variable aus main direkt, ohne Kopieren, an eine Funktion übergibst, damit die Funktion sie ändern kann.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren, weil es die Funktion
durchschnittnoch nicht gibt. Schreibe sie anstelle des Kommentars: Sie hat einen Parameterzahlenvom Typstd::vector<int>und gibt den Durchschnitt der Zahlen im Vektor alsdoublezurück, also ihre Summe geteilt durch ihre Anzahl. Achte auf die Ganzzahldivision: Halte die Summe in einer Variablen vom Typdouble. Das Programm gibt dann die Durchschnittstemperaturen von zwei Wochen aus,20.8und12.75. - 2
Schreibe unter der Funktion
durchschnitteine FunktionwarmeTagemit zwei Parametern:temperaturenvom Typstd::vector<int>undgrenzevom Typint. Sie gibt einen neuen Vektor mit den Temperaturen zurück, die höher alsgrenzesind. Speichere am Ende vonmain, vorreturn 0;,warmeTage(woche1, 20)in einer Variablenwarmeund gib mit einer Schleife jede ihrer Temperaturen in einer eigenen Zeile aus. Das Programm gibt21,24und22aus.