C++ - Einführung in die Programmiersprache Funktionen Leibniz Universität IT Services Anja Aue
Subroutine (Unterprogramm) Lösung von Teilen einer Gesamtaufgabe. Kapselung von Anweisungen, die zu einer in sich abgeschlossenen Aufgaben gehören. Beschreibung einer bestimmten Funktionalität mit Hilfe einer Programmiersprache. Strukturierung von großen Programmen. C++ - Einführung 06.05.15 Seite 2
Parameter und Rückgabewerte Jeder Funktion können Werte übergeben werden. Eine Funktion kann einen Rückgabewert an den Aufrufer zurückgeben. C++ - Einführung 06.05.15 Seite 3
Aufruf von Subroutinen 4.) main() 1.) sub 01(p01) 2.) sub 02(p01, p02) 3.) C++ - Einführung 06.05.15 Seite 4
main() int main() { } umrechnung_temperatur(); return 0; Beispiele/_0701_FunktionOhneRueckgabe... C++ - Einführung 06.05.15 Seite 5
main() Einstiegspunkt in ein C++-Programm. Steuerungszentrale für ein C++-Projekt. In einem C++-Projekt ist diese Funktion nur einmal vorhanden. Hinweis: Bei einer Speicherung eines C++-Projekts auf einen Netzlaufwerk erstellt NetBeans automatisiert diese Funktion zweimal. Wenn das Programm ohne Fehler vollständig durchlaufen wurde, gibt die Funktion den Wert 0 zurück. C++ - Einführung 06.05.15 Seite 6
Funktionskopf und rumpf int main() Funktionskopf { } umrechnung_temperatur(); return 0; Funktionsrumpf C++ - Einführung 06.05.15 Seite 7
Aufbau einer Funktion Datentyp Funktionsname ( Parameterliste ) Funktions- kopf { Anweisung; return wert; Funktionsrumpf } C++ - Einführung 06.05.15 Seite 8
Funktionskopf int main ( p01,, p02,... ) Datentyp Name ( Parameterliste ) Der Datentyp legt den Typ der Funktion und des Rückgabewertes fest. Der Name des Funktionskopfes ist eindeutig. In den runden Klammern folgt dem Funktionsnamen eine Parameterliste. Die Parameterliste kann leer sein. C++ - Einführung 06.05.15 Seite 9
Bezeichner Namen für Funktionen, Konstanten, Variablen etc. Die Namen sind in ihrem Gültigkeitsbereich eindeutig. Schlüsselwörter der Programmiersprache sind als benutzerdefinierte Namen nicht erlaubt. Unterscheidung zwischen Groß- und Kleinschreibung. Der Name main und Main sind für den Compiler verschiedene Platzhalter. C++ - Einführung 06.05.15 Seite 10
Erlaubte Zeichen Buchstaben A...Z und a...z. Zahlen 0...9. Der Unterstrich. C++ - Einführung 06.05.15 Seite 11
Konventionen Benutzerdefinierte Namen beginnen mit einem Buchstaben. Namen, die mit einem Unterstrich beginnen, werden für Bezeichnungen aus dem Standard von C++, den zugelassenen Bibliothekten und Makronamen genutzt. Leerzeichen werden durch Unterstriche ersetzt. Zum Beispiel celsius_to_fahrenheit. Namen, die nur aus Großbuchstaben und Unterstrichen bestehen, sind Makros oder Konstanten vorbehalten. C++ - Einführung 06.05.15 Seite 12
Konventionen für Funktionen Funktionen, die mit is beginnen, liefern einen boolschen Wert zurück. Zum Beispiel is_integer überprüft, ob der übergebene Parameter ein Integer ist. Funktionen, die mit set beginnen, setzen eine Variable. Funktionen, die mit get beginnen, liefern einen beliebigen Wert zurück. C++ - Einführung 06.05.15 Seite 13
Funktionsrumpf Beginn und Ende mit dem geschweiften Klammern. Kapselung von Anweisungen. In einem Funktionsrumpf kann eine Funktion aufgerufen, aber nicht definiert werden. C++ - Einführung 06.05.15 Seite 14
Funktion ohne Rückgabewert void umrechnung_temperatur(){ char einheit; double temperatur; double umrechnung; Beispiele/_0701_FunktionOhneRueckgabe... } cout << "Wert in Celsius: "; cin >> temperatur; cout << "\numrechnung in C-elsius, F-ahrenheit, K-elvin "; cin >> einheit; switch(einheit){ case 'F': umrechnung = celsius_to_fahrenheit(temperatur); break; default: cout << "\ndie Einheit ist nicht bekannt."; } cout << "\numrechnung von Celsius nach " << einheit << ": " << umrechnung; C++ - Einführung 06.05.15 Seite 15
Nutzung Die Funktion verändert keine Daten. Die Funktion gibt die Parameter am Bildschirm aus oder schreibt diese in eine Datei. C++ - Einführung 06.05.15 Seite 16
Funktionskopf void umrechnung ( p01,, p02,... ) Datentyp Name ( Parameterliste ) Der Datentyp void kennzeichnet Funktionen, die keinen Rückgabewert an den Aufrufer zurück geben. C++ - Einführung 06.05.15 Seite 17
Parameterliste im Funktionskopf void umrechnung_temperatur ( p01 ) void umrechnung_temperatur ( p01 char e, double t ) Datentyp Name ( Parameterliste ) Beginn und Ende mit Hillfe der runden Klammern. Eine Parameterliste kann leer sein. C++ - Einführung 06.05.15 Seite 18
Parameter im Funktionskopf void umrechnung_temperatur ( p01 char e, double t ) Datentyp Name ( p01 typ var, typ var ) Die Parameter werden durch Kommata in der Parameterliste getrennt. Jeder Parameter setzt sich aus einem Datentyp und den Namen des Parameters zusammen. Die Parameter sind nur in dem dazugehörigen Funktionsrumpf definiert. Eine Parameterliste kann beliebig viele Parameter haben. C++ - Einführung 06.05.15 Seite 19
Aufruf einer Funktion ohne Rückgabewert umrechnungtemmperatur(); void umrechnung_temperatur ( p01 ) Jede Funktion wird mit Hilfe ihres Namens aufgerufen. Der Name ist ein eindeutiger Platzhalter für die Funktion. Dem Namen folgt die Parameterliste. Die Parameterliste beim Aufruf entspricht der Liste im Funktionskopf. C++ - Einführung 06.05.15 Seite 20
Keine Übergabe von Parametern umrechnung_temperatur ( p01 ) ; void umrechnung_temperatur ( p01 ) Die Parameterliste im Funktionskopf ist leer. Die Parameterliste beim Aufruf ist leer. C++ - Einführung 06.05.15 Seite 21
Übergabe von Parametern umrechnung_temperatur ( p01 'f', 3.234 ) ; void umrechnung_temperatur ( p01 char e, double t ) Für jeden Parameter der Parameterliste im Funktionskopf wird ein Wert übergeben. Die Parameter des Aufrufs werden von links nach rechts dem Parameter im Funktionskopf zugeordnet. Der Parameter im Funktionskopf und der Wert im Aufruf sollten den gleichen Datentypen haben. C++ - Einführung 06.05.15 Seite 22
Funktion mit Rückgabewert double celsius_to_fahrenheit(double temperatur) { double fahrenheit = 0; fahrenheit = temperatur * 1.8 + 32; return fahrenheit; } Beispiele/_0702_FunktionMitRueckgabe... C++ - Einführung 06.05.15 Seite 23
Nutzung Daten werden vom Bildschirm oder einer Datei eingelesen und in anderen Funktion weiterverarbeitet. Die Parameter werden durch eine Berechnung etc. verändert. C++ - Einführung 06.05.15 Seite 24
Funktionskopf double celsius_to_fahrenheit ( p01, p02,... ) Datentyp Name ( Parameterliste ) Die Funktion ist vom Datentyp... Die Funktion gibt einen Wert an den Aufrufer von einem bestimmten Datentyp zurück. C++ - Einführung 06.05.15 Seite 25
Rückgabewert double celsius_to_fahrenheit(double temperatur) { } return fahrenheit; Das Schlüsselwort return liefert einen Wert an den Aufrufer zurück. Der Wert entspricht dem Datentyp der Funktion oder kann in diesen konvertiert werden. Funktionen können immer nur ein Wert zurückliefern. Ein Array von Werten ist nicht möglich. C++ - Einführung 06.05.15 Seite 26
Berechnung eines Rückgabewertes double celsius_to_kelvin(double temperatur) { return (temperatur + 273); } Beispiele/_0702_FunktionMitRueckgabe... Der Rückgabewert kann mit Hilfe eines Ausdrucks berechnet werden. Im ersten Schritt wird der Ausdruck ausgewertet. Das Ergebnis der Auswertung wird an den Aufrufer zurückgegeben. Der Ausdruck wird geklammert. C++ - Einführung 06.05.15 Seite 27
return in Abhängigkeit einer Bedingung Beispiele/_0702_FunktionMitRueckgabe... switch(einheit){ case 'C': return temperatur; case 'K': umrechnung = celsius_to_kelvin(temperatur); return umrechnung; case 'F': umrechnung = celsius_to_fahrenheit(temperatur); return umrechnung; default: cout << "\ndie Einheit ist nicht bekannt."; return 0; } C++ - Einführung 06.05.15 Seite 28
Datenstrukturen als Rückgabewert struct umfrage{ char geschlecht; int alter; }; Beispiele/_0702_FunktionStruktur... umfrage setumfrageergebnis(){ umfrage proband; } cout << "Bitte geben Sie das Geschlecht ein: "; cin >> proband.geschlecht; return proband; C++ - Einführung 06.05.15 Seite 29
Hinweis Eine Anweisung return kann einer beliebigen Position in einer Funktion stehen. Eine Anweisung return beendet die Funktion. C++ - Einführung 06.05.15 Seite 30
Aufruf einer Funktion variable = celsius_to_fahrenheit(...); 1.) n.) double celsius_to_fahrenheit (... { } return wert; ) C++ - Einführung 06.05.15 Seite 31
Übergabe von Werten an die Funktion umrechnung_temperatur ( p01 'f', 3.234 ) ; void umrechnung_temperatur ( p01 char e, double t ) Beim Aufruf einer Funktion wird in diesem Beispiel den Parameter ein Wert übergeben. Die Parameter des Aufrufs werden von links nach rechts dem Parameter im Funktionskopf zugeordnet. C++ - Einführung 06.05.15 Seite 32
call by Value Der Wert der zu übergebenen Variablen wird beim Aufruf 0040100C f char 00401004 3.234 double in den dazugehörigen Parameter gespeichert. 0050200C f char 00503004 3.234 double C++ - Einführung 06.05.15 Seite 33
Erläuterung Der Wert einer Variablen, einer Konstanten oder eines berechneten Ausdrucks wird an ein Parameter im Funktionskopf übergeben. Der Wert der Quelle und der Wert des Parameters / des Ziels werden an unterschiedlichen Stellen im Speicher abgelegt. Die Quelle kann durch die Funktion nicht verändert werden. Der Wert der Quelle ist schreibgeschützt. Nur der Wert im Parameter kann durch die Anweisungen im dazugehörigen Funktionsrumpf verändert werden. C++ - Einführung 06.05.15 Seite 34
Übergabe des Wertes 0050200C f 00401004 3.234 umrechnung_temperatur ( p01 'f', 3.234 ) ; void umrechnung_temperatur ( p01 char e, double t ) 0050200C f 00503004 3.234 C++ - Einführung 06.05.15 Seite 35
Übergabe von Adressen an die Funktion celsius_to_kelvin ( &temperatur ) ; void celsius_to_kelvin ( p01 double *temperatur ) Beim Aufruf einer Funktion wird in diesem Beispiel den Parameter eine Speicheradresse, an der ein Wert liegt, übergeben. Die Parameter des Aufrufs werden von links nach rechts dem Parameter im Funktionskopf zugeordnet. C++ - Einführung 06.05.15 Seite 36
call by reference Die Adresse der zu übergebenen Variable im Speicher 0040100C f char 00401004 3.234 double wird an den dazugehörigen Parametern übergeben. 0050200C 0040100C *char 00503004 00401004 *double C++ - Einführung 06.05.15 Seite 37
Erläuterung Der Wert einer Variablen, einer Konstanten oder eines berechneten Ausdrucks wird an einer Speicherstelle abgelegt. An den Parameter wird ein Verweis auf den Beginn des Speicherbereichs der Quelle übergeben Die Quelle sowohl als auch der Zielparameter greifen auf die gleiche Stelle im Speicher zu. Aufrufer sowohl als auch die Anweisungen im dazugehörigen Funktionsrumpf können den Wert an der Position im Speicher ändern. C++ - Einführung 06.05.15 Seite 38
Übergabe von Speicheradressen celsius_to_kelvin ( &temperatur ) ; 00401004 3.234 void celsius_to_kelvin ( p01 double *temperatur ) C++ - Einführung 06.05.15 Seite 39
Beispiel Beispiele/_0703_FunktionCallByReference_Zeiger... void celsius_to_kelvin(double *temperatur){ *temperatur = *temperatur + 273; } double umrechnung_temperatur(char einheit, double temperatur){ switch(einheit) { case 'K': case 'k': celsius_to_kelvin(&temperatur); break; C++ - Einführung 06.05.15 Seite 40
Nutzung von konstanten Zeigern struct umfrage{ double gewicht; double groesse; }; double bodymassindex(const umfrage *ptrproband){ double bmi = 0; Beispiele/_0702_FunktionStruktur... } bmi = ptrproband->groesse * ptrproband->groesse; return bmi; int main(){ umfrage proband; cout << "\nbmi: " << bodymassindex(&proband); C++ - Einführung 06.05.15 Seite 41
Nutzung von Referenzen Beispiele/_0703_FunktionCallByReference_Referenz... void celsius_to_kelvin(double &temperatur) { temperatur = temperatur + 273; } double umrechnung_temperatur(char einheit, double temperatur){ switch(einheit) { case 'K': case 'k': celsius_to_kelvin(temperatur); break; C++ - Einführung 06.05.15 Seite 42
Lebensdauer einer Variablen Wie lange existiert eine Variable? Die Lebensdauer kann sich auf das Modul (die Datei), die Funktion oder einen Anweisungsblock beziehen. Bei der Geburt wird Speicher für die Variable reserviert, der beim Tod freigegeben wird. C++ - Einführung 06.05.15 Seite 43
Globale Variablen const char close = 'q'; const char newline = '\n'; int main() { } return 0; Beispiele/_0703_Funktion_Variable_Gueltigkeit... C++ - Einführung 06.05.15 Seite 44
Erläuterung Globale Variablen sind für das Modul (die Datei), in der sie deklariert sind, gültig. Konstanten, die im gesamten Programm benötigt werden, werden global am Anfang der Datei deklariert. Auf globale Variablen sollte verzichtet werden. C++ - Einführung 06.05.15 Seite 45
Lokale Variablen in einer Funktion Beispiele/_0703_Funktion_Variable_Gueltigkeit... int main() { char zeichen; int wert; } do { cout << "\nbitte geben Sie einen Wert ein: "; cin >> wert; cout << "\nmöchten Sie einen weiteren Wert einlesen (q quit)?"; cin >> zeichen; }while(zeichen!= close); return 0; C++ - Einführung 06.05.15 Seite 46
Lokale Variablen in einem Anweisungsblock int main() { char zeichen; int wert; Beispiele/_0703_Funktion_Variable_Gueltigkeit... do{ cout << "\nbitte geben Sie einen Wert ein: "; cin >> wert; for(int lzahl = 1; lzahl <= wert; lzahl++ ){ for(int rzahl = 1; rzahl <= wert; rzahl++) { cout << (lzahl * rzahl); } } C++ - Einführung 06.05.15 Seite 47
Lokale Variablen Lokale Variablen sind in der Funktion oder den Anweisungsblock gültig, in der sie deklariert sind. Ein Block beginnt und endet mit den geschweiften Klammern. Variablen, die in einem Block definiert sind, sind auch nur in diesem Block gültig. Sobald der Block beim Durchlauf des Programms betreten wird, wird Speicherplatz für die Variable bereitgestellt. Sobald der Block verlassen wird, wird der Speicherplatz wieder freigegeben. Ein Zugriff auf die Variable ist nicht möglich. C++ - Einführung 06.05.15 Seite 48
Sichtbarkeit einer Variablen Wann ist ein Zugriff auf die Variable möglich? In welchen Bereich kann der Inhalt / den Wert der Variablen gelesen und verändert werden? Globale Variablen können von lokalen Variablen gleichen Namens überdeckt werden. C++ - Einführung 06.05.15 Seite 49
Überdeckung einer globalen Variablen double radius = 10; Beispiele/_0703_Funktion_Variable_Sichtbarkeit... int main() { double radius; } cout << "\n Bitte geben Sie einen Radius ein: "; cin >> radius; cout << "\n Der Kreisradius (lokal) beträgt: " << radius; cout << "\n Der Kreisradius (global) beträgt: " << ::radius; return 0; C++ - Einführung 06.05.15 Seite 50
Gültigkeit der Variable... radius ::radius function.() function.() Modul main() Modul main() C++ - Einführung 06.05.15 Seite 51
Sichtbarkeit der Variable... radius ::radius function.() function.() Modul main() Modul main() C++ - Einführung 06.05.15 Seite 52
Zugriff auf die überdeckte globale Variable :: global ; Mit Hilfe des Gültigkeitsoperators kann auf die globale Variable innerhalb der Funktion zugriffen werden. Der Gültigkeitsoperator besteht aus zwei Doppelpunkten, C++ - Einführung 06.05.15 Seite 53
Statische Variable int addition(int neuwert){ static int summe = 0; Beispiele/_0703_Funktion_Variable_Static.. } summe = summe + neuwert; return summe; int main() { int summe = 0; for(int wert = 1; wert <= 10; wert++){ summe = addition(wert); } C++ - Einführung 06.05.15 Seite 54
Erläuterung Statische Variablen sind in der Funktion oder den Anweisungsblock gültig, in der sie deklariert sind. Sobald der Block beim Durchlauf des Programms betreten wird, wird Speicherplatz für die statische Variable bereitgestellt. Sobald der Block verlassen wird, wird der Speicherplatz bei einer statischen Variablen nicht freigegeben. Beim nächsten Aufruf der Funktion ist ein Zugriff auf den gültigen Wert möglich. Sobald das Modul verlassen wird, wird der Speicherplatz für eine statische Variable freigegeben. C++ - Einführung 06.05.15 Seite 55
Deklaration static int summe ; static Datentyp Name ; Eine Deklaration von statischen Variablen steht immer am Anfang eines Anweisungsblockes. Die Deklaration beginnt mit dem Schlüsselwort static. Der Datentyp legt die Art des zu speichernden Wertes und den benötigten Speicherplatz fest. Der Name der Variablen ist frei wählbar. C++ - Einführung 06.05.15 Seite 56
Initialisierung static int summe = 0 ; static Datentyp Name = wert ; Sobald für eine Variable Speicherplatz reserviert wird, wird der Bereich mit einem x beliebigen Wert initialisiert. Um Fehler zu vermeiden, sollten statische Variablen wie Konstanten immer gleichzeitig deklariert und initialisiert werden. C++ - Einführung 06.05.15 Seite 57