eini-i einführung in die informatik für naturwissenschaftler und ingenieure i kapitel 3 claudio...
Post on 05-Apr-2015
104 Views
Preview:
TRANSCRIPT
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
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
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
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
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
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;
}
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
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
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.
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
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
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.
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.
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
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.
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
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
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.
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;
}
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
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;}
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
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.
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 */
top related