Sie sind auf Seite 1von 8

GOTO

Eigenschaften von Algorithmen (Lsungsverfahren)


Endliche Beschreibung: Das V muss durch Regeln in einem endlichen Text beschreibbar sein. Ausfhrbarkeit: Jeder Schritt des V muss tatschlich ausfhrbar sein. Endliche Resourcen: Das V darf zu jedem Zeitpunkt nur endlich viel Speicherplatz bentigen. Terminierung: Das Verfahren darf nur endlich viele Schritte bentigen. Determiniertheit: Das V muss bei denselben Eingaben das gleiche Ergebnis liefern. Determinismus: Die nchste anzuwendende Regel im V ist immer eindeutig deniert.
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

Strukturierte Programmierung
OOPM, Ralf Lmmel

44

Algorithmus fr ! (Fakultt)
Eingabe: natrliche Zahl Ausgabe: natrliche Zahl Verfahren: 1. Weise Eingabe an Variable n zu. 2. Initialisiere r mit 1. 3. Wenn n = 0 dann gehe nach 7. 4. Weise n * r an r zu. 5. Dekrementiere n. 6. Gehe nach 3. 7. Gebe r als Ausgabe aus.
Ergebnistyp

Umsetzung (in C)
Funktionsname
int factorial(int n) { int r = 1; start: ! if (n == 0) goto end;

Argument(e)

Krper

r = r * n; n = n - 1; goto start; end: return(r); }

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

45

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

46

Spaghetti-Code (Nichtstrukturierte Programmierung)

E.Dijkstra: Vater der Strukturierten Programmierung, Autor von GOTO Considered Harmful
A study of program structure has revealed that programs can differ tremendously in their intellectual manageability. A number of rules have been discovered, violations of which will either seriously impair or totally destroy the intellectual manageability of the program.... I now suggest that we confine ourselves to the design and implementation of intellectually manageable programs.

Die Verwendung von GOTOs fhrt unter Umstnden zu SpaghettiCode.

https://cs.senecac.on.ca/~chris.szalwinski/archives/btp100.043/content/const.html
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

47

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

48

Fakulttsfunktion in Java
Ergebnistyp Funktionsname

Fakulttsfunktion in Java (Variation)


public static int factorial(int n) { int r = 1; while (n > 0) { r *= n;

public static int factorial(int n) { int r = 1; while (n > 0) { r = r * n; n = n - 1; } return r; }

Argument(e)

Krper

Iteration

Zuweisung n--; mit arithmetischer Operation } return r;


}

Dekrement

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

49

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

50

Funktionen als grundlegende Programmstruktur


Bestandteile einer Funktion Name Argumente -- Namen und Typen Ergebnistyp Anweisungsblock als Krper / Implementation

Testrahmen fr die Anwendung von Funktionen


public class Program { public static void main(String[] args) { System.out.println(factorial(5)); // prints 120 } }

Die Rolle von public, class, static, void, etc. wird erst spter behandelt.
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

51

52

Begriff der Kontrollstruktur


Imperative Programme Variablendeklaration Zuweisung Kontrollstruktur Sequenz Verzweigungen Wiederholung Sprunganweisung (GOTO)
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

Schleifenkonstruktionen (Java)
While-Schleife (Vorabtesten der Bedingung) Syntax: while (Bedingung) Anweisung; while (Bedingung) { ... } For-Schleife: Syntaktischer Zucker: for ( int i=0; i < n; i++) Anweisung; Expansion: int i = 0; while (i < n) { Anweisung; i++; }
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

53

54

! in Java mit while vs. for


public static int factorial(int n) { } int r = 1; while (n > 0) { } return r; public static int factorial(int n) { } int r = 1; for (int i=1; i <= n; i++) r *= i; r *= n; n--;

Begriff der Strukturierten Programmierung

GOTO

Baumartige Zerlegung eines Programms in Teilprogramme (Prozeduren) -- Top-Down Ansatz Keine Verwendung von GOTO auf unterster Ebene; lediglich Sequenz, Auswahl und Wiederholung
Die Vorgehensweise der baumartigen Zerlegung wird an dieser Stelle bergangen.
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

return r;

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

55

56

! Struktogramme =! Grasche Notation " " fr GOTO-freie Algorithmen


Struktogramm fr !

! Struktogramme =! Grasche Notation " " fr GOTO-freie Algorithmen

Funktion bzw. Block int fak(int n) r=1 n>1 r=r*n n=n-1 return r Schleife mit Test am Anfang Bediung der Selektion Zweige der Selektion Sequentielle Schritte

Schleife mit Test am Ende

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

57

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

58

Struktogramm fr ggT
int ggT(int x, int y) x != y x>y

ggT in Java
public static int ggT( int x, int y ) { while (x != y) { if (x > y) x = x - y; else = y - x; y } return x;


FALSE y=y-x

TRUE x=x-y return x

bungsaufgabe: Argumentieren Sie, dass dieses Verfahren in der Tat den ggT ermittelt.
59

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

60

Weitere 2 Vter der Strukturierten Programmierung


Struktogramme = Nassi-Shneiderman-Diagramme

(Folgerung aus dem) Satz von Bhm-Jacopini: Jedes GOTO-Programm kann in ein While-Programm umgewandelt werden. (Es reicht eine While-Schleife.)
Intuition: Benutze eine Variable v als Sprungziel-Speicher. GOTOs werden als Zuweisungen an v gehandhabt. Anspringbare Anweisungen mssen nun v testen. Wiederhole alle Anweisungen (bis zum return).

ISAAC NASSI

BEN SHNEIDERMAN

Der so erhaltene Code ist u.U. nicht gut lesbar. Es gibt alternative Eliminationstechniken.

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

61

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

62

! mit Goto (in C)


int factorial(int n) { int r = 1; start: ! if (n == 0) goto end; r = r * n; n = n - 1; goto start; end: return(r); }

! nach Goto-Elimination (in Java)


public static int factorial(int n) { int r = 1; int v = 1; while (true) if (v==1) // start if (n == 0) v = 2; // goto end else { r = r * n; n = n - 1; v = 1; // goto start } else if (v==2) // end return r; }

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

63

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

64

Eine Variante basierend auf switch


public static int factorial(int n) { int r = 1; int v = 1; while (true) switch (v) { case 1: // start if (n == 0) Switch v = 2; // goto end Anweisungen else { fr einfache r = r * n; Kaskaden von If n = n - 1; Anweisungen v = 1; // goto start } break; case 2: // end return r; } }
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

! mit Schleifen-artigem GOTO (in C)

int factorial(int i) { int r = 1; start: if (i != 0) { r = i * r; i = i - 1; goto start; } return(r); }

65

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

66

! nach GOTO-zu-While-Konvertierung (in Java)

Zwischenberlegungen
Warum machen wir uns Gedanken um GOTOs? Java enthlt keine allgemeine Goto-Anweisung. Grnde Es gibt noch andere Sprachen ausser Java. Es gibt weitere Kontrollstrukturen (in Java). Es gibt weitere Beherrschbarkeitsprobleme.
Verwendung globaler Variablen Unstrukturierte Nebenlugkeit Code-Klone und Tangled Code Vermengung von Daten, Logik und GUI ...

public static int factorial(int n) { int r = 1; while (n > 0) { r = r * n; n = n - 1; } return r; }

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

67

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

68

Eine weitere visuelle Notation fr Algorithmen: Programmablaufplne


Alternativ: Fakultt(n) Programmablaufplan fr !
Anfang Setze r auf 1 Setze n auf n 1 n=0?
ja nein
Quelle: Einfhrung in die Informatik Jrg Siekmann, Nils Hebbinghaus, Claus Zinn Universitt des Saarlandes
UN
IV
E R SIT

Programmablaufplne (Flussdiagramme)
A

A VIE N

Oval: Start, Stopp Pfeil, Linie: Forsetzung mit ... Rechteck: Operation Rechteck mit Linien: Unterprogrammaufruf Raute: Verzweigung Parallelogramm: Ein- und Ausgabe

Setze r auf r n

Rckgabe r Ende
c Jrg Siekmann, Nils Hebbinghaus, Claus Zinn, SS 06

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

69

Einfhrung in die Informatik fr Hrer aller Fakultten I p.9

SA

IS

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

70

Programmablaufplan fr ggT Alternativ: ggT(x, y)


Anfang Setze y auf y x
ja nein nein

UN

IV

E R SIT

A VIE N

IS

Vorsicht: Spaghetti
Flussdiagramme sind sehr freizgig: Pfeile entsprechen allgemeinem GOTO.

SA

x=y?
ja

x<y?

Setze x auf x y

Strukturierte Flussdiagramme sind grasch erkennbar. (Folgerung aus dem) Satz von Bhm-Jacopini: Jedes Flussdiagramm lsst sich ein quivalentes Struktorgramm umformen.
(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

Rckgabe x Ende
c Jrg Siekmann, Nils Hebbinghaus, Claus Zinn, SS 06 Einfhrung in die Informatik fr Hrer aller Fakultten I p.8

Quelle: Einfhrung in die Informatik Jrg Siekmann, Nils Hebbinghaus, Claus Zinn Universitt des Saarlandes

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

71

72

Datentypen fr die (Strukturierte) Programmierung


Heute: Typen fr Zahlen Wahrheitswerte Spter: Arrays (Felder) Strings (Zeichenketten) Files (Dateien) Objekte

Zusammenfassung Strukturierte Programmierung = Zuweisung + Sequenz + if + while ! GOTO Nassi-Shneiderman-Diagramme genau richtig Programmablaufplne zu freizgig Ausblick Nchstes Mal: Numerische Algorithmen bernchstes Mal: Programmierung mit Feldern

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau

73

(C) Ralf Lmmel, OOPM, Universitt Koblenz-Landau