Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Abstrakte Algorithmen und Sprachkonzepte Spezifikation von Algorithmen, UML, Iterationen, Sprünge, Rekursion Vorlesung 3.11.2005 Foliensatz von D. Huson zur Vorlesung Informatik I, Tübingen 2005/06 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 1 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmen • Ein Algorithmus (algorithm) ist die Beschreibung einer Methode zur Lösung einer gegebenen Aufgabenstellung. • Beispiele: – Verfahren zur Konversion einer eingelesenen Dezimalzahl in eine Dualzahl – Verfahren Konversion einer Dualzahl in eine ausgegebene Dezimalzahl – Ripple carry addition von Dualzahlen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 2 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmen • Wir verlangen, dass ein Algorithmus – in endlicher Zeit – auf völlig mechanische Art – ein wohldefiniertes Ergebnis produziert. • Beispiel: – Der fundamentale Instruktionszyklus eines Prozessors ist kein Algorithmus, da er im obigen Sinne kein Ergebnis produziert und auch nie anhält. – Wird Berechnungsverfahren (computational procedure) genannt W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 3 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beschreibung von Algorithmen • Algorithmen müssen präzise beschrieben werden. Es gibt verschiedene Möglichkeiten: • Textuelle Beschreibung • Diagram • Mathematische Notation • „Pseudo-Code“ • Programmiersprache W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 4 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Definition des Algorithmus • Ein Algorithmus ist die Beschreibung eines Verfahrens, um aus gewissen Eingabegrößen bestimmte Ausgabegrößen zu berechnen. Dabei muss erfüllt sein: • Genaue Spezifikation: – Eingabespezifikation: welche Eingaben, Anforderungen? Anforderungen – Ausgabespezifikation: Welche Ausgaben, Eigenschaften? Zusicherung • Sicherstellung der Durchführbarkeit: – Endliche Beschreibung: in einem endlichen Text vollständig darstellbar – Effektivität: Jeder Schritt muss effektiv (d.h. tatsächlich) mechanisch ausführbar sein – Determiniertheit: Verfahrungsablauf stets fest vorgeschrieben • Sicherstellung der Korrektheit: – Partielle Korrektheit: Ergebnis genügt Ausgabespezifikation, wenn Eingabespezifikation erfüllt ist – Terminierung: Algorithmus hält nach endlich vielen Schritten an, wenn Eingabespezifikation erfüllt ist W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 5 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beispiele • Algorithmen, z.B.: – Schriftliche Addition, Subtraktion, Multiplikation – Backrezept (Kochrezept? Jamie Oliver: add whatever you like) • Keine Algorithmen, z.B.: – Sei s definiert als die Summe s:=1+1/2+1/4+1/8+... (Mathematisch präzise definiert, aber „Endliche Beschreibung“?, „...“ ist nur Abkürzung, „Terminierung“?) – „Man würze bei Bedarf nach“ („Determiniertheit“?) – Sei s= 5/0 („Effektivität“?) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 6 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Textuelle Beschreibung eines Algorithmus • Beispiel: Wir betrachten ein Algorithmus, der die Differenz von zwei natürlichen Zahlen berechnet, und hierzu nur einfaches Inkrementieren um 1 benutzt. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 7 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Textuelle Beschreibung des Algorithmus diff(a,b) diff(a,b) Parameter // Gegeben seien zwei natürliche Zahlen a,b mit a≥ b Kopf // Das Resultat r ist die Differenz r=a-b Kommentare 1. Vorbereitung: Setze r:=0 und setze y:=b 2. Trivialfall: Falls y=a so gebe Resultat r aus und halt. 3. Arbeit: Variable Kopfzeile • • 4. Ergebnisaufbau: Setze r:=r+1 Problemreduktion: Setze y:=y+1 Rumpf Wiederholung: Fahre fort bei 2. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 8 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Textuelle Beschreibung des Algorithmus diff(a,b) diff(a,b) // Gegeben seien zwei natürliche Zahlen a,b mit a≥ b Spezifikation? // Das Resultat r ist die Differenz r=a-b Anforderung und Zusicherung 1. Vorbereitung: Setze r:=0 und setze y:=b sind spezifiziert 2. Trivialfall: Falls y=a so gebe Resultat r aus und halt. 3. Arbeit: Durchführbarkeit? • • 4. Ergebnisaufbau: Setze r:=r+1 Problemreduktion: Setze y:=y+1 Ja, nur Grundoperationen Wiederholung: Fahre fort bei 2. Korrektheit:? Ein Algorithmus? W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson Schritt 3 wird genau a-b mal durchgeführt 9 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Grundschema des Algorithmenaufbaus diff(a,b) // Gegeben seien zwei natürliche Zahlen a,b mit a≥ b // Das Resultat r ist die Differenz r=a-b 1. Vorbereitung: Setze r:=0 und setze y:=b 2. Trivialfall: Falls y=a so gebe Resultat r aus 3. Arbeit: Ergebnisaufbau: Setze r:=r+1 Problemreduktion: Setze y:=y+1 4. Wiederholung: Fahre fort bei 2. • Name des Algorithmus und Liste der Parameter • // Spezifikation des Ein/Ausgabeverhaltens 1. Vorbereitung: Einführung von Hilfsgrößen, etc 2. Trivialfall?: Wenn ein einfacher Fall vorliegt, Beendigung mit Ergebnis 3. Arbeit (Problemreduktion, Ergebnisaufbau): Reduziere Problem X auf eine einfachere Form X´, mit „X´ > X“, baue entsprechend einen Teil des Ergebnisses auf 4. Wiederholung (Iteration oder Rekursion): fahre mit X´ bei Schritt fort 2 (Iteration) oder rufe den Algorithmus mit reduziertem Problem X´ wieder auf (Rekursion) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 10 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Problemreduktion • Die Terminierung eines Algorithmus kann garantiert werden, wenn im Schritt 3 (Problemreduktion) das Problem im Sinne einer „wohlfundierten Ordnung“ in jedem Durchgang echt kleiner wird. • Eine Ordnung > heisst wohlfundiert, wenn es keine unendlich absteigende Kette von Elementen x1 > x2 > x3 >... >xn > ... gibt. • z.B. „größer als“ auf N wohlfundiert, aber auf Z nicht. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 11 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Diagramm für diff(a,b) UML-Aktivitätsdiagramm (UML= unified modelling language) Einige UML Symbole: W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 12 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Grundschema des Algorithmenaufbaus, Aktivitätsdiagramm Steuerungsverlauf (control flow), Anordung der Anweisungen: W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 13 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Grundschema des Algorithmenaufbaus, Aktivitätsdiagramm Steuerungsverlauf (control flow), Anordung der Anweisungen: Verzweigung (branch) Elementarer Schleifenkonstrukt (iteration) Sprung (jump) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 14 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmisches Problem: modulus-Funktion • Problem: man finde ein Verfahren zur Berechnung des Rests der Ganzzahldivision a/b, also für r = a mod b, wobei a ≥ 0, b > 0. • Definition: a mod b:= a-(a/b)· b, wobei „/“ Ganzzahldivision • Diese Funktion wird bei dem Euklidischen Algorithmus zur Berechnung des ggT zweier Zahlen gebraucht • Wichtige Operation, Programmiersprachen wie Java oder C++ haben einen eingebauten Operator %, so dass a % b= a mod b • Beispiel: 32 mod 5 = 32-(32/5)· 5=32-6·5=2 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 15 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmus mod(a,b) mod(a,b) Spezifikation? // Anforderung: a,b ∈ Z mit a ≥ 0, b > 0 ok // Zusicherung: Das Resultat r ist der Rest der Division a/b 1. Vorbereitung: Setze r:=a 2. Trivialfall: Falls r<b, so gebe Resultat r aus, halt. 3. Arbeit (Problemreduktion, Ergebnisaufbau): Durchführbarkeit? • Setze r :=r - b 4. Wiederholung: Fahre fort bei 2. Ja, nur Grundoperationen Korrektheit, insbesondere Terminierung? Zunächst ist r=a≥ 0. Dann, so lange r≥ b >0 ist, wird r in Schritt 3 jeweils um b reduziert, stets bleibt r ≥ 0. Da > auf N wohlfundiert ist, folgt die Terminierung. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson Return r 16 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beispiel für Algorithmus mod(a,b) Beispiel für den Aufruf mod(7,3): W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 17 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Unstrukturierte und strukturierte Sprünge • In den beiden Beispielen diff(a,b) und mod(a,b) benutzen wir einen unstrukturierten Sprung der Form „fahre fort in Zeile 2“. – In C oder C++: goto <Marke> – Freie Sprünge begünstigen „Spaghetti-Code“ • Im Arbeitsschritt des Grundschemas wird kein freier Sprung benötigt, sondern hier reicht ein strukturierter Sprung, der Teil einer Iterationsschleife ist • Die wichtigsten Iterationsschleifen sind: for-Schleife, while-Schleife und repeatuntil-Scheife W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 18 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Die while-Schleife • Die while-Schleife (while loop) hat die Form: while (Bedingung) do {Anweisungssequenz} od • Der Kontrollfluß: – testet die Bedingung im Kopf der Schleife, – ist die Bedingung wahr, so wird die Anweisungsfolge im Körper durchlaufen, sonst wird die while-Schleife verlassen – kehrt zum Kopf zurück W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 19 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmus mod(a,b) mit while-Schleife mod(a,b) // Anforderung: a,b ∈ Z mit a ≥ 0, b > 0 // Zusicherung: Das Resultat r ist der Rest der Division a/b 1. Vorbereitung: Setze r:=a 2. Arbeit (Problemreduktion, Ergebnisaufbau): while (r ≥ b) do r :=r – b od 3. Trivialfall: return r. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 20 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Algorithmus diff(a,b) mit while-Schleife diff(a,b) // Anforderung: a,b ∈ N mit a ≥ b // Zusicherung: Das Resultat r ist die Differenz a - b 1. Vorbereitung: Setze r:=0 und y:=b 2. Arbeit (Problemreduktion, Ergebnisaufbau): while (y ≠ a) do r :=r +1; y:=y+1; od 3. Trivialfall: // y=a return r. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 21 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beschreibung eines Algorithmus in mathematischer Notation • Der euklidischer Algorithmus berechnet den „größten gemeinsamen Teiler (ggT)“ wie folgt: W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 22 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beschreibung in Pseudo-Code • Oft werden Algorithmen in Pseudo-Code angegeben, also eine textuelle Beschreibung mit Bestande des Syntaxes von höheren Programmiersprachen, z.B: if(keine Elemente zu sortieren) return (Erfolg); W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 23 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Programmiersprachen als Notation für Algorithmen • Programmiersprachen bieten eine Notation für Algorithmen, die – so präzise ist, daß die Algorithmen vom Rechner vollautomatisch ausgeführt werden können, und – so abstrakt ist, daß die Algorithmen von Menschen gut verstanden werden können • Machinennahe Sprachen (z.B. Assembler, C): extrem effiziente Verarbeitung • Hochsprachen (z.B. LISP, Prolog): Abstraktion der Notation im Vordergrund • Objektorientierte Sprachen (z.B. C++, Java): fassen Datenstrukturen und Algorithmen in Objekte zusammen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 24 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Programmiersprachliche Grundkonzepte 1. Datenspeicher und Zuweisungen: • • 2. Variablen und Zuweisungen zum Speichern von berechneten Ergebnissen (z.B. r:=a) Konstanten zum Bezeichnen fester Werte (z.B. Kreiszahl π) Ausdrücke: • • • 3. Boolesche und arithmetische Ausdrücke zum Auswerten von Formeln und Bedingungen z.B. a> 0 and (b<0 or c+b >d) Boolesche Ausdrücke haben den Wahrheitswert true oder false Sequenzierungsanweisungen zum Gliedern und Steuen des Ablaufes von Berechnungen: • • • • • 4. Blöcke zum Gruppieren von Daten und Anweisungen { ...} Funktionsaufrufe zum Wiederverwenden eines Algorithmus sin(x)+sin(y) Eine Rückkehranweisung zur Beendigung einer Funktion return r Bedingte Anweisungen zum verzweigen im Programfluß if (...) {...} Iterationsanweisungen while-Schleife, for-Schleife, repeat-until-Schleife Hilfskonstrukte: • Kommentare folgen nach // bis zum Zeilenende, oder als Abschnitte der Art /* Kommentar */ W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 25 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Programmiersprache Java • Wir werden die Grundkonzepte der Programmierung an Hand der Programmiersprache Java kennenlernen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 26 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Das Sprungkonzept goto • Ein unbedingte Sprunganweisung: goto M; wobei M ein Label ist, das eine Anweisung im Algorithmus oder Programm markiert, hat zur Folge, dass der Programmfluss mit dieser Anweisung fortgesetzt wird. mod(a,b) // Anforderung: a,b ∈ Z mit a ≥ 0, b > 0 // Zusicherung: Das Resultat r ist der Rest der Division a/b 1. Vorbereitung: Setze r:=a 2. LOOP: Trivialfall: Falls r<b, so return r 3. Arbeit (Problemreduktion, Ergebnisaufbau): Setze r :=r - b 4. goto LOOP; • Die goto Anweisung gibt es in C++, aber nicht in Java W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 27 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Verzweigung mit if-then-else • Die allgemeine bedingte Anweisung lautet: if (Bedingung) then ja-Anweisung else nein-Anweisung fi; • In Java: if (Bedingung) ja-Anweisung; else nein-Anweisung; • Kurzform: if (Bedingung) then ja-Anweisung fi; • In Java: if (Bedingung) ja-Anweisung; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 28 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beispiele • Nach der folgenden Anweisung ist die Variable x nicht negativ: if x<0 then x := -x; fi; • Die folgende Anweisung berechnet den Absolutbetrag: if x<0 then abs := -x; else abs:= x; fi; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 29 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Schleifen • Die klassiche while-Schleife: while (Bedingung) do {Anweisungssequenz} od • In Java: while (Bedingung) do {Anweisungssequenz} • Entspricht: M: if(Bedingung) {Anweisungssequenz; goto M; } fi W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 30 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Schleifen • Die repeat-until-Schleife: repeat {Anweisungssequenz} until (AbbruchBedingung) • In Java: do {Anweisungssequenz} while (Bedingung) • Entspricht: M: Anweisungssequenz; if(not AbbruchBedingung) then {Goto M;} fi W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 31 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Beispiel • Einlesen von Zeichen, bis ein bestimmtes Zeichen ´s´ gefunden wird: { //1. Initialisere. // 2. z:=´s´; Iteration. repeat { v:=read();} until (v=z); } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 32 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Schleifen • Die klassiche for-Schleife: For Laufvariable from U to O step S do {Anweisungssequenz} od • In Java: so nicht vorhanden, „Superkonstrukt“ • Beispiel: // 1. Initialisiere r:=1; // 2. Iteriere For i from 2 to 20 step 2 do { r:=r * i;} od W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 33 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursive Ansatz • Im rekursiven Ansatz versucht man, ein vorgelegtes Problem P(X) in zwei Teile zu lösen: – Basis: Gib eine direkte Lösung an, falls die Lösung für X einfacher Natur ist. – Schritt: Führe die Lösung fur P(X) durch einen Schritt auf die Lösung eines einfachen Problems P(X´) zurück, wobei X>X´ gilt, bezüglich einer geeigneten wohlfundierte Ordnungsrelation „>“ W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 34 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursion für mod(a,b) • In mathematischer Notation kann (a mod b) wie folgt ausgerechnet werden: • Ist das ein Algorithmus? Spezifikation? Durchführbarkeit? Korrektheit? W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 35 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursion für mod(a,b) • Spezifikation: – Eingabe: nehmen an: a ≥ 0, b > 0 – Ausgabe: wie ist (a mod b) definert? (a mod b) := a – (a/b)·b, hierbei ist „/“ die Ganzahldivision. Wir fordern also, dass das Resultat r die Eigenschaft r=a-(a/b)·b. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 36 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursion für mod(a,b) • Durchführbarkeit: – Endliche Beschreibung: gegeben – Effektivität: gegeben – Determiniertheit: gegeben, da nur zwei Fälle, die sich gegenseitig ausschliessen • Korrektheit – Partielle Korrektheit: siehe Buch – Terminierung: siehe Buch W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 37 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Partielle Korrektheit W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 38 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Terminierung W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 39 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursion für mod(a,b) in Java Zuweisungsoperator = int mod (int a, int b) // Anforderungen: // a>=0 // b>=0 // Zusicherung: // r= a-(a/b)*b { // 1. Vereinbarungen int r; // 2. Initialisierungen r=a; // 3. Einfacher Fall if (r<b) { return r; } // 4. Problemreduktion r=r-b; // 5. Rekursion return mod(r,b); } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 40 J Folien zu Kapitel 3: Abstrakte Algorithmen und Sprachkonzepte Rekursion für ggT(a,b) in Java Gleichheitsoperator == int ggt (int a,int b) { if(b==0) return a; else if (b>a) return ggT(b,a); else // b>0 && b<a return ggT(b,mod(a,b)); } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java, Folien von D. Huson 41 J