Informatik :: C++ :: Funktionen
Funktionen
Allgemeines
In der imperativen Programmierung sind Funktionen ein wichtiges Mittel zur
Modularisierung. Oft benötigter Code kann in Funktionen zusammengefasst werden und über den Namen der Funktion nach Bedarf aufgerufen werden.
Funktionen können einen oder mehrere Aufrufparameter haben und liefern nach ihrem Ende i.d.R. einen Funktionswert zurück.
In C++ gibt es bereits eine Vielzahl von implementierten Funktionen.
So z.B. sqrt(zahl), pow(zahl,exponent), getchar(), system("pause")
Wir wollen uns anschauen, wie man eine benutzerdefinierte Funktion erstellt.
Deklaration
Bevor man eine Funktion verwenden, sprich: aufrufen kann, muss man sie deklarieren.
Syntax
Datentyp Funktionsname (Datentyp p1, Datentyp p2, ...)
{
Anweisung(en);
return Rückgabewert;
}
Hinweise:
- Der Datentyp vor dem Funktionsnamen entspricht dem Datentyp des Rückgabewertes.
- p1, p2, ... nennt man Parameter. Sie übernehmen die Werte, mit denen die Funktion später aufgerufen werden kann.
- Alle Parameter und evtl. Variablen, die innerhalb einer Funktion deklariert werden, sind nur innerhalb der Funktion gültig (lokale Variablen).
Beispiel:
float monatszins (float K, float p)
{
float jahreszins;
jahreszins = K * p / 100;
return jahreszins / 12;
}
oder kürzer:
float monatszins (float K, float p)
{
return K * p / 100 / 12;
}
Erklärung:
Die Funktion
monatszins bekommt bei einem Aufruf einen Wert für
K und einen Wert für
p übergeben.
K und p sind
Parameter. Sie müssen auch
deklariert werden!!!
Die Funktion berechnet die Zinsen für einen Monat und
gibt diesen Wert der aufrufenden Stelle zurück.
Aufruf
Der Vorteil von Funktionen ist, dass man sie an beliebiger Stelle im Programm (also innerhalb der
main()-Pozedur verwenden kann.
Beispiel:
int main()
{
float kapital, zinssatz;
cout << "Bitte geben Sie das Kapital ein! ";
cin >> kapital;
cout << "Bitte geben Sie den Zinssatz ein! ";
cin >> zinssatz;
cout << "Der Monatliche Zins beträgt " << monatszins(kapital, zinssatz);
}
Erklärung:
Nach Eingabe von Kapital und Zinssatz erfogt sofort die Ausgabe.
Innerhalb dieser wird die Funktion
monatszins mit den Werten von
kapital und
zinssatz aufgerufen.
Diese oben deklarierte Funktion monatszinssatz gibt dem Ausgabestream den von der Funktion berechneten Wert zurück, der dann mit dem Text ausgegeben wird.
Rekursive Funktionen
Rein intuitiv programmiert man immer
iterativ. Die Iteration (v. lat.
iterare "wiederholen") ist in der Mathematik eine Methode, sich der Lösung eines Rechenproblems schrittweise, aber zielgerichtet anzunähern. Sie besteht in der
wiederholten Anwendung desselben Rechenverfahrens.
In der Informatik bedeutet Iteration, wenn ein Zugriff
schrittweise, beziehungsweise
wiederholt, auf Datenstrukturen erfolgt, beispielsweise bei einer
FOR-Schleife.
Als Rekursion (lat. recurrere "zurücklaufen") bezeichnet man die Technik in Mathematik, Logik und Informatik, eine Funktion durch sich selbst zu definieren (rekursive Definition).
Jeder Aufruf der rekursiven Funktion muss sich durch Entfalten der rekursiven Definition in endlich vielen Schritten auflösen lassen. Umgangssprachlich sagt man, sie darf nicht in eine Endlosschleife geraten.
Beispiel:
Die Funktion
sum(n) soll zu jeder Zahl n die
Summe der ersten n natürlichen Zahlen berechnen. Sie ist
iterativ folgendermaßen definiert:
- Um eine gleichwertige rekursive Definition der Summenfunktion zu erhalten, bestimmen wir zunächst den einfachen Fall, den Rekursionsanfang.
Im Beispiel handelt es sich um den Funktionswert für 0.

- Übrig bleibt der schwierige Fall, also hier der Funktionswert für n > 0.
Den schwierigen Fall führen wir auf einen einfacheren Fall zurück, nämlich auf den Fall n - 1.
Dieser einfachere Fall wird unser rekursiver Aufruf. Die entsprechende Vorschrift heißt Rekursionsschritt. Beispielsweise lässt sich die Summe der ersten n Zahlen berechnen, indem man die Summe der ersten n - 1 Zahlen berechnet und dazu die Zahl n addiert:

- Diese beiden Gleichungen lassen sich zu einer rekursiven Definition der Summenfunktion zusammenfassen:

- Die Summe der Zahlen von 0 bis 3 berechnet sich dann wie folgt:

- Die Aufruf-Kette dazu sieht so aus:

Rekursive Funktion:
int sum(int n)
{
int summe;
if (n == 0) summe = 0; //Rekursionsanfang
else summe = sum(n-1) + n; //Rekursionsschritt
return summe;
}
Iterative Funktion:
int sum(int n)
{
int summe;
summe = 0;
for (int i=1; i<=n; i++) summe = summe + i;
return summe;
}
Rein mathematische Funktion mit Hilfe der
Gaußschen Summenformel:
int sum(int n)
{
return n * (n + 1) / 2;
}