230 likes | 334 Views
Basisinformationstechnologie HK-Medien. Teil 1, 11.Sitzung WS 02/03. Unterprogramme. Große Programmierprobleme sollten in kleinere Teilprobleme, und diese möglich-erweise wiederum in kleinere Teilprobleme, zerlegt werden.
E N D
BasisinformationstechnologieHK-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öglich-erweise wiederum in kleinere Teilprobleme, zerlegt werden. • Das Programm löst das Problem, die Unterprogramme lösen die Teilprobleme. • Unterprogramme müssen im Hauptpro-gramm deklariert und von dort aus aufge-rufen werden. BIT – Schaßan – WS 02/03
Beispiel Unterprogramm PROCEDURE Sterne( k : Integer) ; VAR i := Integer ; BEGINFOR 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 ; BEGINFOR 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 ; BEGINIF x MOD 4 = 0 THENIF x MOD 100 = 0 THENIF x MOD 400 = 0 THEN Schalt := TrueELSE Schalt := FalseELSE Schalt := TrueELSE 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 ;BEGINEND ; PROCEDURE MacheZug;BEGINEND ; FUNCTION SpielEnde : Boolean ;BEGIN SpielEnde := True ;END ; … BIT – Schaßan – WS 02/03
Beispiel Top-Down-Entwurf (2) BEGINFertig := False ;Spieler := 1 ;REPEAT ZeigeSpiel ; MacheZug ;IF SpielEnde THEN Fertig := TrueELSE SpielerWechselUNTIL 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 ; BEGINIF n = 0 THEN fact := 1ELSE 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 ; BEGINIF x = y THEN ggT := xELSE 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)BEGINIF n < 2 THEN write(n)ELSEBEGIN writeBin(n div 2) ; write(n mod 2)ENDEND ; 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 ; BEGINIF n = 0 THEN Even := TrueELSE Even := Odd(n-1) END ; FUNCTION Odd( n : Integer ) : Boolean ; BEGINIF n = 0 THEN Odd := FalseELSE 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