EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio...

24
EINI-I EINI-I Einführung in die Einführung in die Informatik Informatik für Naturwissenschaftler für Naturwissenschaftler und Ingenieure I und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido [email protected]

Transcript of EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio...

Page 1: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und

Ingenieure IIngenieure I

Kapitel 3

Claudio Moraga, Gisbert Dittrich

FBI Unido

[email protected]

Page 2: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

2

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Gliederung Kapitel 3Gliederung Kapitel 3

• Funktionen – Einführendes Beispiel: Potenz– Funktionsdefinition– Funktionsprototyp– Funktionsaufruf

• Formale Parameter • aktuelle Parameter

• call by value

– Rekursive Funktionen: Beispiel Fakultät • u.a. Animation

Page 3: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

3

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

- Erste Möglichkeit:for (n=1; n < 8; n++) {b=n;for (p=1; b>0; --b) p=p*n;cout << p;

}

Einführendes Beispiel: PotenzEinführendes Beispiel: Potenz

• Aufgabe: Berechne nn für 1 n 7 . – Muß also für jedes n ausführen:

b=n;

for (p=1; b > 0; --b) p=p*n;

n * ...* nn mal

Page 4: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

4

Kap 3: Funktionen etc.Vorl “EINI-I"

Einführendes Beispiel: PotenzEinführendes Beispiel: Potenz

• Annahme: – Programmtext sollte mehrfach verwendet

werden/kommt häufiger vor.

• Eine selbständige Formulierung, die dann wiederverwendet werden kann, ist obiger Vorgehensweise vorzuziehen:– Ansprechbar über eigenen Namen– Evtl. mit Parametern

Page 5: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

5

Kap 3: Funktionen etc.Vorl “EINI-I"

• Zweite Möglichkeit: als Funktion.

Gleich allgemein für ab.

Die sieht so aus:

long int Potenz(int a, int b) {

long int p;

for (p = 1; b > 0; --b) p = p * a;

return p;

}

Einführendes Beispiel: PotenzEinführendes Beispiel: Potenz

a * ...* ab mal

Page 6: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

6

Kap 3: Funktionen etc.Vorl “EINI-I"

Rumpf (Text) der Funktion

Funktionen: BestandteileFunktionen: Bestandteile

Name der Funktion

Parameter der Funktion

(Name und Typ)

Typ des Rückgabe-

werts

Rückgabewert

long int Potenz(int a, int b) {long int p;for (p = 1; b > 0; --b) p = p *

a;return p;

}

Page 7: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

7

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Verwendung in einer anderen FunktionVerwendung in einer anderen Funktion

main() {

int i;

for (i = 0; i < 8; i++)

cout << i << " hoch "

<< i << " ist "

<< Potenz(i, i)

<< endl;

}

Angabe

der Signatur

Aufruf

Das Hauptprogramm

ist in C++

eine Funktion!

long int Potenz(int, int);

Potenz

Page 8: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

8

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

/* Potenz als Funktion */

#include <iostream.h>long int Potenz(int , int);

long int Potenz(int a, int b) {long int p;for (p = 1; b > 0; --b) p = p * a;return p;

}int main() {

//long int Potenz(int, int);int i;for (i = 0; i < 8; i++)

cout << i << " hoch " << i << " ist " << Potenz(i, i) << endl;}

•Ausführen

Page 9: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

9

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Anmerkungen: FunktionenAnmerkungen: Funktionen

• Das Hauptprogramm ruft Funktion "Potenz" auf– durch Hinschreiben des Namens mit "aktuellen"

Parametern (Potenz (i,i))Dazu Minimalinformationen über die Funktionen nötig:

– Minimalinformationen über die zu verwendende Funktion stehen im sog. Funktionsprototypen

– Beschreibt die Signatur der Funktion

• Die Signatur einer Funktion sagt,– welche Typen die Parameter (in der gegebenen

Reihenfolge) der Funktion haben,– welchen Typ der Ergebniswert hat.

Page 10: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

10

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Anmerkungen: FunktionenAnmerkungen: Funktionen

• Funktionsprototyp – Es werden hier nur die Typen der Parameter

angegeben.– Sinn: der Compiler kann bei der Übersetzung

überprüfen, ob die Typen richtig verwendet werden. • Daher interessieren die Namen der Parameter, wie in

der Funktionsdefinition verwendet, nicht.

• In unserem Beispiel:

long int Potenz(int, int);– die Funktion hat zwei Parameter je vom Typ int– der Ergebniswert ist vom Typ long int

Page 11: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

11

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Anmerkungen: FunktionenAnmerkungen: Funktionen

• Funktionsparameter– Formale Parameter:

• Werden in der Definition verwendet

• Sie dienen zur formalen, symbolischen Beschreibung der Berechnung.

– Aktuelle Parameter: • Werden beim Aufruf verwendet

• Mit ihnen führt die Funktion die aktuellen Berechnungen durch.

• Im Beispiel: – Formal: a,b - Aktuell: i, i

Page 12: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

12

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Lokale VariablenLokale Variablen

• Die Funktion benötigt für ihre eigenen Berechnungen eigene Variablen – lokale Variablen: lokal deshalb, weil sie

• nur im Rumpf der Funktion deklariert und benutzt werden,

• außerhalb der Funktion nicht bekannt sind.

• Beispiel:– Die Variable p ist außerhalb der Funktion Potenz

nicht bekannt.

Page 13: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

13

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Anmerkungen: FunktionenAnmerkungen: Funktionen

• Schritte bei jedem Aufruf einer Funktion:– Auswertung der aktuellen Parameter zu Werten. – Für jeden formalen Parameter wird eine lokale

Variable gleichen Namens angelegt. – Die Werte der aktuellen Parameter werden an diese

lokalen Variablen übergeben. (Call by Value)– Der Rumpf der Funktion wird ausgeführt.– Am Ende der Ausführung des Rumpfes wird der

Wert, der mit return gekennzeichnet ist, als Ergebnis des Aufrufs zurückgegeben.

Page 14: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

14

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Anmerkungen: FunktionenAnmerkungen: Funktionen

• In unserem Beispiel: • Aufruf von:

Potenz(3*i - 4, 2*j) mit z.B. i = 3, j = 2

– liefert : – Parameterwert links: 5– Parameterwert rechts: 4

– Lok. Variable a : 5

Lok. Variable b : 4– return 625

Page 15: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

15

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Bei Aufruf: Call by ValueBei Aufruf: Call by Value

• Call by Value (Parameterübergabeverfahren) – funktioniert wie oben beschrieben– die Funktion arbeitet:

• mit den Werten der aktuellen Parameter,

• nicht mit den aktuellen Parametern selbst

– Daraus folgt: wenn die Funktion die Werte ihrer Parameter ändert (wie hier a und b), so merkt der Aufrufer das nicht.

Page 16: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

16

Kap 3: Funktionen etc.Vorl “EINI-I"

Aufruf

Arbeit der aufgerufenen FunktionRückgabewert

Auswertung der aktuellen Parameter

Auswertung der aktuellen Parameter

Übergabe der Werte an die

aufgerufene Funktion

Übergabe der Werte an die

aufgerufene Funktion

Aufruf der FunktionAufruf der Funktion

Page 17: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

17

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Rekursive FunktionenRekursive Funktionen

- Wichtiges Hilfsmittel zur Strukturierung des Kontrollflusses von Algorithmen.

Beispiel: Fakultätsfunktion (engl.: factorial)– Definiere für n > 0:

– Besonderheit: Definition (n!; links) stützt sich auf sich selbst

((n-1)!; rechts) ab !!

– Läßt sich direkt in ein Programm übertragen:

0>n falls ,)!(*

0=n falls , := !

1

1

nnn

Page 18: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

18

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Rekursive FunktionenRekursive Funktionen

Funktionsdefinition:int factorial (int n){

int k; // Hilfsvariable (lokal)

if ((n==0) || (n==1))

k=1;

else {

if (n>1)

k = (factorial (n-1)) * n;

}

return k;

}

// später "int" ---> "float"// später: Negativwerte abfangen.

Page 19: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

19

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Rekursive FunktionenRekursive Funktionen

Funktionsdefinition:float factorial (int n){

float k; // Hilfsvariable

if ((n==0) || (n==1))

k=1;

else {

if (n > 1)

k = (factorial (n-1)) * n;

}

return k;

}

Page 20: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

20

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Rekursive FunktionenRekursive Funktionen

Funktionsverwendung:#include <iostream.h>

float factorial (int); // Funktionsprototyp

/*int*/ main(){

int Zahl;

cout << "Fakultät von ? ";

cin >> Zahl;

cout << endl;

<< "Fakultät ist: " << factorial (Zahl)

<< endl;

//return 0;

} factorial Animation

Page 21: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

21

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

/* Factorial; rekursiver AufrufTyp und Hilfsvariable float und nicht int, um größere Eingaben als 9 zu verarbeiten.ACHTUNG!:Eingabe negativer Zahlen nicht abgefangen!! */

#include <iostream.h>float factorial (int); // Funktionsprototyp

float factorial (int n){ float k; // Hilfsvariable

if ((n==0)||(n==1)) k=1; else{

if (n > 1) k = (factorial (n-1)) * n;}

return k;}

Page 22: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

22

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

/* Factorial*/

/*int*/ main(){ int Zahl;

cout << "Fakultät von ? ";cin >> Zahl;cout << endl;cout << "Fakultät ist: " << factorial (Zahl) << endl;

//return 0;}

•Ausführen

Page 23: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

23

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

Rekursive FunktionenRekursive Funktionen

Allgemein:

Rekursive Funktionen müssen aufweisen:– Eine Beschreibung, wie sich der Wert eines Aufrufes

aus den Werten von Aufrufen für "kleinere" Parameterwerte zusammensetzt.

– Eine Terminierungsbedingung:

ist diese Bedingung erfüllt, so muß angegeben werden, wie sich der Wert direkt berechnen läßt.

– Jeder Aufruf einer rekursiven Funktion muß direkt oder indirekt die Terminierungsbedingung erreichen.

Page 24: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

24

Kap 3: Funktionen etc.Vorl “EINI-I"

10.11.2000

float factorial (int n ) { float k; if (( n ==0) || ( n ==1)) k=1; else {if ( n >1) k = (factorial ( n -1)) * n ;} return k ; }

/* n=3 */

3 33 3 factorial (2)

factorial(3)

float factorial (int n ){float k;

if (( n ==0) || ( n ==1)) k = 1; else {if ( n >1) k = (factorial ( n -1)) * n ;} return k ; }

3

22 222

factorial (1)1 * 22

float factorial (int n ){ float k; if (( n ==0) || ( n ==1)) k = 1; else {if ( n >1) k = (factorial ( n -1)) * n ;} return k ; }

1

2 * 36

== 6

/* n=1 */

1

1

/* n= 2 */