Powerpoint

Werbung
Basisinformationstechnologie
HK-Medien
Teil 1, 11.Sitzung
WS 02/03
BIT – Schaßan – WS 02/03
Unterprogramme
Große Programmierprobleme sollten in
kleinere Teilprobleme, und diese möglicherweise wiederum in kleinere Teilprobleme,
zerlegt werden.
Das Programm löst das Problem, die
Unterprogramme lösen die Teilprobleme.
Unterprogramme müssen im Hauptprogramm deklariert und von dort aus aufgerufen werden.
BIT – Schaßan – WS 02/03
Beispiel Unterprogramm
PROCEDURE Sterne( k : Integer) ;
VAR i := Integer ;
BEGIN
FOR i := 1 TO k DO write( 'x' )
END ;
BIT – Schaßan – WS 02/03
Beispiel Unterprogramm (2)
PRORAM Dreieck;
VAR Zeile : integer;
PROCEDURE Sterne( k : Integer) ;
VAR i : Integer ;
BEGIN
FOR i := 1 TO k DO write( 'x' )
END ;
BEGIN
 hier beginnt das Hauptprogramm
FOR Zeile := 1 TO 5 DO
BEGIN
Sterne(Zeile) ;
Writeln
END
END.
BIT – Schaßan – WS 02/03
Prozedurale Abstraktion
Die Vorgehensweise, Teilprobleme durch
Prozeduren zu lösen, nennt man
prozedurale Abstraktion.
Ein Prozeduraufruf ist eine Anweisung und
darf überall dort stehen, wo syntaktisch
eine Anweisung erlaubt ist.
BIT – Schaßan – WS 02/03
Funktionale Abstraktion
Wenn ein Unterprogramm nicht nur eine
Anweisung ausführen, sondern einen Wert
zurückgeben soll, muss der Aufruf anders
formuliert und weitere Parameter
angegeben werden.
Der Aufruf muss ein wohlgeformter
Ausdruck sein und darf überall dort stehen,
wo syntaktisch ein Ausdruck erlaubt ist.
BIT – Schaßan – WS 02/03
Beispiel Funktionale Abstraktion
FUNCTION Schalt ( x : Integer ) : Boolean ;
BEGIN
IF x MOD 4 = 0 THEN
IF x MOD 100 = 0 THEN
IF x MOD 400 = 0 THEN Schalt := True
ELSE Schalt := False
ELSE Schalt := True
ELSE Schalt := False;
END ;
BIT – Schaßan – WS 02/03
Bestimmung des Rückgabewertes
In Pascal dient der Name der Funktion
gleichzeitig als Variable zur Aufnahme des
Rückgabewertes. Maßgeblich ist der Wert,
der sich in der Variable befindet, wenn das
Unterprogramm terminiert.
Der Programmierer muss Sorge tragen,
dass der gewünschte Wert gespeichert
wird.
BIT – Schaßan – WS 02/03
Abstraktionen bei C und Java
In C und Java müssen Rückgaben explizit
vorgenommen werden. Dies geschieht mit
Hilfe der Anweisung return. Das
Unterprogramm wird sofort verlassen.
In diesen Sprachen gibt es keine klare
Trennung zwischen Anweisungen und
Ausdrücken, bzw. zwischen Funktionen
und Prozeduren.
BIT – Schaßan – WS 02/03
Beipiel Abstraktion in C und Java
int ggT (int x, int y) {
while ( x != y ) {
if ( x > y ) x = x – y ;
else y = y – x ;
}
return x ;
}
BIT – Schaßan – WS 02/03
Top-Down-Entwurf
In der Praxis der Programmierung kann
man die prozedurale Abstraktion einsetzen,
um ein Problem von Anfang an in immer
kleiner werdende Teilprobleme zu zerlegen.
Jedes Teilproblem wird sofort als Prozedur
(ohne Anweisungen) deklariert und ist
damit "compilierbar".
BIT – Schaßan – WS 02/03
Beispiel Top-Down-Entwurf
PROGRAM Spiel ;
VAR Spieler : Integer ; Fertig : Boolean
PROCEDURE ZeigeSpiel ;
BEGIN
END ;
PROCEDURE MacheZug;
BEGIN
END ;
FUNCTION SpielEnde : Boolean ;
BEGIN
SpielEnde := True ;
END ;
…
BIT – Schaßan – WS 02/03
Beispiel Top-Down-Entwurf (2)
BEGIN
Fertig := False ;
Spieler := 1 ;
REPEAT
ZeigeSpiel ;
MacheZug ;
IF SpielEnde THEN Fertig := True
ELSE SpielerWechsel
UNTIL Fertig ;
GratuliereDemSieger
END.
BIT – Schaßan – WS 02/03
Schachtelung von
Unterprogrammen
Jedes Unterprogramm kann seinen eigenen
lokalen Deklarationsteil haben, wo Variablen oder
weitere Unterprogramme deklariert werden.
Dort erklärte, lokale Variablen sind nach außen
nicht sichtbar, alle Variablen des umfassenden
(aus Sicht des Unterprogramms globalen)
Programms sind sicht- und veränderbar.
In Pascal sind beliebige Schachtelungstiefen von
Unterprogrammen möglich.
BIT – Schaßan – WS 02/03
Schachtelung von
Unterprogrammen (2)
BIT – Schaßan – WS 02/03
Rekursive Funktionen
Funktionen können rekursiv sein, d.h.
innerhalb der Funktion wird die gleiche
Funktion wieder aufgerufen, sie ruft sich
gleichsam selbst auf.
Die Funktion muss terminieren, d.h. die
rekursiv aufgerufene Funktion muss
irgendwann einen Wert erhalten, welcher in
die anderen Funktionen eingesetzt werden
kann.
BIT – Schaßan – WS 02/03
Beispiel Rekursive Funktion
Beispiel: Fakultätsfunktion
fact(n) = n!
fact(0) = 1
 fact(n) = n * fact(n-1), für alle n > 0

FUNCTION fact(n : Integer) : Integer ;
BEGIN
IF n = 0 THEN fact := 1
ELSE fact := n*fact(n-1)
END ;
BIT – Schaßan – WS 02/03
Beispiel Rekursive Funktion (2)
IF n = 0 THEN fact := 1 ELSE fact := n*fact(n-1)
BIT – Schaßan – WS 02/03
Beispiel 2 Rekursive Funktion
FUNCTION ggT(x,y : Integer) : Integer ;
BEGIN
IF x = y THEN ggT := x
ELSE IF x > y THEN ggT := ggT(x-y,y)
ELSE ggT := ggT(x,y-x)
END ;
BIT – Schaßan – WS 02/03
Rekursive Prozeduren
Wie eine Funktion kann auch eine Prozedur
rekursiv aufgerufen werden.
Beispiel: writeBin wandelt eine natürliche Zahl in eine
Binärzahl um
PROCEDURE writeBin (n : Integer)
BEGIN
IF n < 2 THEN write(n)
ELSE
BEGIN
writeBin(n div 2) ;
write(n mod 2)
END
END ;
BIT – Schaßan – WS 02/03
Backtracking
Es ist möglich, mit der Rekursion eine
"Abfrage" zu verknüpfen: Möglichkeiten
werden der Reihe nach getestet; wenn eine
nicht erfolgreich war, wird der Versuch
zurückgezogen und die nächste Möglichkeit
getestet.
Diese Möglichkeit heißt Backtracking.
BIT – Schaßan – WS 02/03
Wechselseitige Rekursion
Wenn in der Definition f ein Aufruf der Funktion g
vorkommt und umgekehrt, liegt eine
wechselseitige Rekursion vor.
FUNCTION Even( n : Integer ) : Boolean ;
BEGIN
IF n = 0 THEN Even := True
ELSE Even := Odd(n-1)
END ;
FUNCTION Odd( n : Integer ) : Boolean ;
BEGIN
IF n = 0 THEN Odd := False
ELSE Odd := Even(n-1)
END ;
BIT – Schaßan – WS 02/03
Zuweisungsorientierte
Programmierung
Die Anweisungen (statements) eines
Programms sind folgendermaßen definiert:
<statement> ::=
nop | abort |
<sequential composition> |
<assignment statement> |
<conditional stmt> |
<while stmt> |
<block> |
<procedure call>
BIT – Schaßan – WS 02/03
Herunterladen