Eigene Funktionen definieren und aufrufen
Eine Funktion fasst Anweisungen unter einem Namen zusammen. Sie kann Eingabewerte erhalten und einen Ergebniswert zurückgeben. Dadurch kannst du eine Aufgabe mehrfach verwenden und getrennt prüfen.
Eigene Funktionen definieren und aufrufen#
Funktionen und Programmaufbau · Lektion 22 von 60
Voraussetzungen: Programmfluss, Operatoren. Lernziel: Du zerlegst ein Programm in benannte Aufgaben.
Eine Funktion fasst Anweisungen unter einem Namen zusammen. Sie kann Eingabewerte erhalten und einen Ergebniswert zurückgeben. Dadurch kannst du eine Aufgabe mehrfach verwenden und getrennt prüfen.
1#include <iostream>2 3double quadrat(double zahl) {4 return zahl * zahl;5}6 7void begruessen() {8 std::cout << "Quadrat-Rechner\n";9}10 11int main() {12 begruessen();13 const double ergebnis = quadrat(4.0);14 std::cout << ergebnis << '\n';15}Die Ausgabe ist Quadrat-Rechner und danach 16. double vor quadrat ist der Rückgabetyp. zahl ist ein Parameter, also ein benannter Eingang in der Funktionsdefinition. 4.0 beim Aufruf ist das Argument, der konkret übergebene Wert.
Definition, Deklaration und Aufruf#
Eine Definition enthält hier den Körper in {}. Eine Deklaration wie double quadrat(double zahl); kündigt die Funktion nur an. Der Compiler muss eine passende Deklaration kennen, bevor du die Funktion aufrufst. Deshalb stehen die Definitionen im Beispiel vor main.
Ein Funktionsprototyp ist eine Deklaration, die Rückgabetyp und Parametertypen angibt. Die Definition darf später stehen, wenn der Prototyp vorher sichtbar ist. Fehlt die Definition im gesamten Build, entsteht häufig erst ein Linkerfehler.
Rückgabe und Nebenwirkung#
quadrat berechnet und liefert einen Wert. begruessen hat den Rückgabetyp void und gibt nichts an den Aufrufer zurück; die sichtbare Ausgabe ist eine Nebenwirkung. Eine Funktion ohne solche Änderungen, deren Ergebnis nur von ihren Eingaben abhängt, nennt man häufig rein. Reine Berechnungen lassen sich besonders einfach testen.
Eine Funktion mit Ergebnis muss auf allen normal erreichten Wegen einen passenden Wert zurückgeben. Die automatische Rückgabe von 0 beim Funktionsende ist eine Sonderregel für main.
Gute Aufgabenaufteilung#
Nenne Funktionen nach ihrer Aufgabe, etwa berechneMittelwert. Wenn eine Funktion gleichzeitig einliest, prüft, rechnet und Dateien schreibt, ist sie schwer isoliert zu prüfen. Isoliert bedeutet hier ohne die übrigen Ein- und Ausgabeschritte.
Übung#
Schreibe eine Funktion istGerade, die für eine ganze Zahl einen Wahrheitswert liefert.
Lösung
bool istGerade(int zahl) { return zahl % 2 == 0; }. Der Rückgabewert ist bool. Die Funktion muss nichts ausgeben, um ihr Ergebnis nutzbar zu machen.
Was beim Aufruf tatsächlich passiert#
Verfolge const double ergebnis = quadrat(4.0); aus dem ersten Beispiel:
Das Argument 4.0 wird ausgewertet.
Der Parameter zahl erhält für diesen Aufruf den Wert 4.0.
Der Funktionskörper berechnet zahl * zahl, also 16.0.
return liefert das Ergebnis an die Aufrufstelle zurück.
ergebnis wird mit diesem zurückgegebenen Wert initialisiert.
main läuft mit der nächsten Anweisung weiter.
Die Funktion wird nicht allein dadurch ausgeführt, dass ihre Definition oberhalb von main steht. Dafür braucht es einen Aufruf. Bei einem späteren Aufruf quadrat(3.0) wird ein neuer Parameter für diesen Aufruf mit 3.0 initialisiert.
Berechnen und Anzeigen auseinanderhalten#
1#include <iostream>2 3double halbiere(double wert) {4 return wert / 2.0;5}6 7int main() {8 const double eingabe{9.0};9 const double haelfte{halbiere(eingabe)};10 std::cout << eingabe << ' ' << haelfte << '\n';11}Die Ausgabe ist 9 4.5. halbiere verändert eingabe nicht: Ihr Parameter ist ein eigener Wert. Die Funktion gibt selbst keinen Text aus. std::cout zeigt die beiden Zahlen erst später an.
Übung: Rückgabe verwenden#
Was passiert, wenn du die Zeile mit haelfte durch halbiere(eingabe); ersetzt und danach nur eingabe ausgibst?
Lösung
Die Berechnung läuft, aber ihr Rückgabewert wird verworfen. eingabe bleibt 9. Die Ausgabe lautet deshalb 9. Ein Rückgabewert ändert die Argumentvariable nicht automatisch.
Weiterlernen#
Zurück: Eingaben wiederholen, ohne hängen zu bleiben · Kursübersicht · Weiter: Parameter: Wertübergabe, Referenz und Überladung
Kommentare 0
Kommentare sind für diese Seite deaktiviert.