Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

31
Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen

Transcript of Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

Page 1: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

Programmieren

Prof. Dr.-Ing. Franz-Josef Behr

Funktionen

Page 2: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

2FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Gliederung

Definition Funktionsdeklaration Funktionsaufruf, Parameterübergabe Formalparameter, Aktualparameter Verlassen von Funktionen inline-Funktionen Vorgabeargumente Lokale und statische Variablen Überladen von Funktionen Referenzen als Parameter Rekursion

Page 3: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

3FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Funktionen – eine Definition

“benutzerdefinierte Operationen” erlauben, eine Reihe von Anweisungen zu einer einzelnen

zusammenzufassen. Aufbau:

– Ergebnistyp der Funktion

– Name

– Parameterliste in runden Klammern

– in geschweiften Klammern: Funktionsrumpf, beinhaltet die eigentlichen Anweisungen.

Page 4: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

4FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Beispiel

int ggt(int a, int b) // Funktionskopf{ // Funktionsrumpf int rest; // lokale Variable, gilt nur in ggt do { rest = a % b; a = b; b = rest; } while (rest>0); return a; // Rueckgabe Ergebniswert}

int ggt(int a, int b) // Funktionskopf{ // Funktionsrumpf int rest; // lokale Variable, gilt nur in ggt do { rest = a % b; a = b; b = rest; } while (rest>0); return a; // Rueckgabe Ergebniswert}

Page 5: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

5FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Funktionsdeklaration

Eine Funktionsdeklaration gibt den Namen der Funktion, den Typ des zurückgelieferten Funktionswerts sowie Anzahl und Typen der Parameter bekannt.

Funktionsdeklarationen werden auch als Prototypen bezeichnet.

Page 6: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

6FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Funktionsaufruf, Parameterübergabe

Wird eine Funktion definiert, so wird Code für diese Funktion erzeugt. Allerdings wird dieser Code nicht automatisch ausgeführt!

Ausführung der Funktion: Name mit speziellem Funktionsaufrufoperator ().

Dieser Operator wird nach dem Funktionsnamen notiert, in den runden Klammern werden ggf. die Parameter ("Argumente") angegeben:

ch = intToChar(a); // ruft intToChar mit Parameter a aufch = intToChar(a); // ruft intToChar mit Parameter a auf

Page 7: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

7FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Formalparameter, Aktualparameter

Formale Parameter = Platzhalter, die beim Funktionsaufruf mit Werten gefüllt werden.

Die Bezeichnung von formalen und aktuellen Parameter müssen nicht übereinstimmen, sie müssen jedoch typkompatibel sein!

int ggt(int a, int b) // Formale Parameter a und b{ ... }void main(){ cout << ggt(x, y); // Aktualparameter x, y cout << ggt(f, 1); // Aktualparameter f, 1 cout << ggt((3*12+4), 18); // Aktualparameter 40, 18}

int ggt(int a, int b) // Formale Parameter a und b{ ... }void main(){ cout << ggt(x, y); // Aktualparameter x, y cout << ggt(f, 1); // Aktualparameter f, 1 cout << ggt((3*12+4), 18); // Aktualparameter 40, 18}

Page 8: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

8FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Funktionsaufruf ohne Parameter

Achtung: Der Funktionsname ohne Klammern stellt einen konstanten Zeiger auf die Anfangsadresse der Funktion dar und bewirkt keinen Aufruf!

==> Besitzt die aufgerufene Funktion keine Parameter, muss also eine leere Argumentliste angegeben werden.

ok = clearScreen(); // Aufruf der Prozedur clearScreen // ohne Parameterok = clearScreen; // Fehler, kein Funktionsaufruf!

ok = clearScreen(); // Aufruf der Prozedur clearScreen // ohne Parameterok = clearScreen; // Fehler, kein Funktionsaufruf!

Page 9: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

9FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Verlassen von Funktionen

für Funktionen des Typs void:return;

für andere Typen (z.B. int):return 0;

Hinweis: Oftmals wird der Rückgabewert in Klammern gesetzt; dies ist jedoch nicht nötig

Page 10: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

10FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Der Argumentmodifizierer const

Simulation eines “Read-only-Parameters” In der folgenden Funktionen ist es nicht möglich, den Parameter

msg zu verändern:

long quad_p1(const int i){ i = i + 1; // falsch

return i*i;}

long quad_p1(const int i){ i = i + 1; // falsch

return i*i;}

Auch der Rückgabewert einer Funktion lässt sich mit const-Deklaration vereinbaren!

Page 11: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

11FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

inline-Funktionen

In C häufig eingesetzt: Makros, wie z. B.

#define MAX(a,b) (((a)>(b)) ? (a) : (b))

– Makros werden in C vom Präprozessor expandiert; keinerlei Typprüfungen, Expandierung liegt nicht in der Kontrolle des C++-Compilers.

In C++: inline-Funktionen. Vorteil: Performance-Gewinn

inline int max(int a, int b){ if (a >= b) return a; else return b;}

inline int max(int a, int b){ if (a >= b) return a; else return b;}

Page 12: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

12FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

inline-Funktionen II

Inline-Funktionen sind Empfehlung an den Compiler. Geeignet für kurze Funktionen mit einfachen Operationen mit einem

oder mehreren Parametern. Vorgehen: Funktionen erst konventionell implementieren und

debuggen, dann erst Inline-Schlüsselwort einfügen.

Page 13: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

13FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Vorgabeargumente

Aufbau der Parameterliste:– Zunächst Parameter ohne Vorgabewerte,– dann ggf. Parameter mit Vorgabewerten.

void message(const char* msg, const char* name = "Frank")void message(const char* msg, const char* name = "Frank")

Bei Aufruf: Aktualparameter für jeden Parameter ohne Vorgabewerte; für Parameter mit Vorgabewerten kann Aktualparameter entfallen; geschieht dies für einen Parameter, müssen nachfolgende

ebenfalls entfallen.

Page 14: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

14FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Vorgabeargumente - Beispiel

// C++ program that illustrates default arguments#include <iostream.h>

void message(const char* msg, const char* name = "Keith"){

cout << name << " says \"" << msg << '\"' << endl;}

int main(){

message("Hi there!");message("Hi yourself!", "Kevin");return 0;

}

// C++ program that illustrates default arguments#include <iostream.h>

void message(const char* msg, const char* name = "Keith"){

cout << name << " says \"" << msg << '\"' << endl;}

int main(){

message("Hi there!");message("Hi yourself!", "Kevin");return 0;

}

Quelle: Craigh Arnush: Borland C++ in 21 Tagen.

Page 15: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

15FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Vorgabeargumente - Bedeutung

Default-Argumente können unter anderem dann von Nutzen sein, wenn in eine bereits existierende Funktion weitere Argumente aufgenommen werden sollen, ohne die Syntax von bestehenden Funktionsaufrufen zu verändern. Dazu werden die neuen Argumente als Default-Parameter in die Funktionsdeklaration aufgenommen (die korrespondierende Funktionsdefinition muß dann angepaßt werden).

Im Hinblick auf getrennte Übersetzung und die Erstellung größerer Programmsysteme (Zerlegung in Header- und Programmdateien): Default-Werte von Parametern immer in den entsprechenden Prototypen und nicht in den Funktionsdefinitionen angeführen!

Page 16: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

16FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Lokale Variablen in Funktionen

Jede Funktion kann ihre eigenen Datentypen, Konstanten und Variablen haben.

Lokalen Variablen nur so lange existent, während die Funktion aufgerufen ist.

Beendigung der Funktion: lokale Variablen werden eliminiert.

Page 17: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

17FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Statische Variablen I

In manchen Fällen muss der Wert einer Variablen zwischen einzelnen Funktionsaufrufen erhalten bleiben:==> “statische Variablen”,==> Schlüsselwort static.

Der Zugriff auf diese Variablen kann nur innerhalb dieser Funktion erfolgen.

Page 18: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

18FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Statische Variablen II

// C++ program illustrates static local variables#include <iostream.h>double average(double x){

static double count = 0;static double sum = 0;++count;sum += x;return sum / count;

}int main(){

cout << "average = " << average(1) << endl;cout << "average = " << average(2) << endl;cout << "average = " << average(4) << endl;cout << "average = " << average(10) << endl;cout << "average = " << average(11) << endl;return 0;

}

// C++ program illustrates static local variables#include <iostream.h>double average(double x){

static double count = 0;static double sum = 0;++count;sum += x;return sum / count;

}int main(){

cout << "average = " << average(1) << endl;cout << "average = " << average(2) << endl;cout << "average = " << average(4) << endl;cout << "average = " << average(10) << endl;cout << "average = " << average(11) << endl;return 0;

}

Page 19: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

19FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Überladen von Funktionen

Unterschiedliche Funktionen können gleich heißen, sie müssen jedoch aufgrund der (übergebenen) Parameter unterscheidbar sein.

#include <iostream.h>void gibAus(const char* string){ cout << " gibAus(\"" << string << "\")" << endl;}void gibAus(int i){ cout << " gibAus (" << i << ")" << endl;}int main(void){ gibAus("string printing"); // calls gibAus(const char*) gibAus(5); // calls gibAus(int) return 0;}

Ergebnis:

gibAus("string printing")gibAus(5)

Page 20: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

20FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Überladen von Funktionen: Bedeutung

Wir nutzen bereits überladene Operatoren: << und >> bei cout bzw. cin.

Überladen von Funktionen und Operatoren wichtig für objektorientierte Programmierung:– Konstruktoren

– Überladen von Operatoren wie =, <> …

Page 21: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

21FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Signatur einer Funktion I

Unterscheidung überladener Funktionen an Hand ihrer Signatur: Anzahl und Typen der Parameter.

Beim Aufruf vergleicht der Compiler die Argumenttypen mit den verschiedenen Signaturen der Funktionen und ruft die passende Funktion auf.

Implizite Typumwandlungen werden durchgeführt.

int min (int x, int y) {...}double min (double x, double y) {...}double ergebnis, zahl = 5.5;ergebnis = min(zahl, 10.0); // double-Version!

Page 22: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

22FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Signatur einer Funktion II

Der Ergebnistyp der Funktion gehört nicht zur Signatur.

int f1 (char* key) {...}char* f1 (char* name) {...} // unzulässig, da Signatur // identisch!

Page 23: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

23FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Definition von Referenzen

Referenz = Ersatzbezeichner für eine bereits deklarierte Variable. ==> Referenz steht für die Variable, die sie referenziert. Definition einer Referenz über das Zeichen&.

Beispiel:double dfEasting = 3489800.31;double& rdfEasting = dfEasting;

rdfEasting ist dann eine andere Bezeichnung für dfEasting und hat den Typ “Referenz auf double”.

Zuweisungen an rdfEasting betreffen nun die Variable dfEasting:rdfEasting = rdfEasting - 1000;

Page 24: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

24FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Referenzen als Parameter I

Referenzen werden hauptsächlich als Funktionsparameter eingesetzt:

==> Syntaktisch deutlich einfachere Nutzung von “Call by Reference-Parametern” als in C (dort nur über Zeiger).

Vorteile:– Zugriff auf das referenzierte Argument einfach.

– Ein Parameter, der das Argument referenziert, ist genauso effizient wie ein Zeiger als Parameter.

Page 25: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

25FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Referenzen als Parameter II

Beispiel:...void swap(long& lTest1, long& lTest2){ long lTemp = lTest1; lTest1 = lTest2; lTest2 = lTemp;}int main(){ long lVar1 = 10, lVar2 = 20; swap(lVar1,lVar2); cout << lVar1 << “ “ << lVar2 << endl;}

Page 26: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

26FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Rekursion

Eine Funktion, die sich selbst direkt oder indirekt (über den Umweg anderer Funktionen) aufruft, wird als rekursiv bezeichnet.

Viele mathematische Funktionen sind rekursiv definiert. Rekursion: mächtiges Konzept, das zur Lösung ,,rekursiver

Probleme`` eingesetzt werden sollte. Der Einsatz von Rekursion bei der Lösung von iterativen Problemen sollte unterbleiben.

long fak(int n){ if (n == 0) { return 1; } else { return fak(n-1)*n; }}

long fak(int n){ if (n == 0) { return 1; } else { return fak(n-1)*n; }}

Page 27: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

27FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Quiz I

Wie sieht die Ausgabe des folgenden Programms aus?

#include <iostream.h>void swap(int i, int j){ int temp = i; i = j; j = temp;}int main(){ int a = 10, b = 20; swap (a, b); cout << “ a = “ << a << “ b = “ << b; return 0;}

#include <iostream.h>void swap(int i, int j){ int temp = i; i = j; j = temp;}int main(){ int a = 10, b = 20; swap (a, b); cout << “ a = “ << a << “ b = “ << b; return 0;}

Page 28: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

28FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Quiz II

Wo liegt der Fehler bei folgender Funktion?

double volumen(double laenge, double breite = 1,double hoehe)

{ return laenge * breite * hoehe)}

double volumen(double laenge, double breite = 1,double hoehe)

{ return laenge * breite * hoehe)}

Page 29: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

29FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Quiz III

Wie sieht die Ausgabe des folgenden Programms aus?

int iNeu(int& i, int increment = 1){ return I + increment;}

int iNeu(int& i, int increment = 1){ return I + increment;}

Page 30: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

30FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Quiz IV

Wo liegt bei diesen überladenen Funktionen ein Problem?

int iNeu(int& iStart, int increment = 1){ return iStart + increment;}

int iNeu(int& iStart){ return iStart + 10;}

int iNeu(int& iStart, int increment = 1){ return iStart + increment;}

int iNeu(int& iStart){ return iStart + 10;}

Page 31: Programmieren Prof. Dr.-Ing. Franz-Josef Behr Funktionen.

31FHT StuttgartProf. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammieren

Quiz V

Wo gibt es ein Problem?

#include <iostream.h>int main(){ int a = 10, b = 20; cout << “Produkt der beiden Zahlen ist: “; cout << mult (a, b); return 0;}

void mult(int i, int j){

return i*j;}

#include <iostream.h>int main(){ int a = 10, b = 20; cout << “Produkt der beiden Zahlen ist: “; cout << mult (a, b); return 0;}

void mult(int i, int j){

return i*j;}