240 likes | 428 Views
Algorithmen und Datenstrukturen 1 SS 2002. Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz. Termin 2 – Dijkstra Diagramme. Übersicht. Organisation Themenbereiche heute Strukturierung im Kleinen unbeschränkte Ablaufstrukturen
E N D
Algorithmen und Datenstrukturen 1SS 2002 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 2 – Dijkstra Diagramme
Übersicht • Organisation • Themenbereiche heute • Strukturierung im Kleinen • unbeschränkte Ablaufstrukturen • D-Diagramme (Dijkstra) • Transformation in D-Diagramme • Beispiele • Übungsbesprechung Übung 2
Organisation • Teilnehmerliste • Grundsätzlich ist Jana zu verwenden • Java optional; Jana ist Klausur-relevant • Vorsicht: • Java unterstützt einige Features von Jana nicht: • Ausgangsparameter • Übergabeparameter • ÜBUNGSABGABE: • Ausarbeitungen bitte links oben klammern ! • keine Klarsichthülle abgeben.
Rückblick • Prosa • Ablaufdiagramm • Struktogramm • Algorithmenbeschreibungssprache • Programmiersprache
JANA Jana Übersicht • Algorithmen (Prozeduren) • Kommentare • Operatoren • Ablaufsteuerung (Sequenz, Selektion, Iteration) • if / else if / else, switch; while, repeat, for • 4 Elementare Datentypen • boolean, int, float, char • Felder (inkl. Zeichenketten) • boolean[1:n], char[], float[-3:3], int[1:n; 1:m] • und weitere Sprachkonstrukte
Strukturierung im Kleinen Strukturierung im Kleinen Algorithmen sollen einfach zu lesen sein • Entwicklung (z.B. Testen) • Wartung unbeschränkte Ablaufstrukturen • erschweren die Lesbarkeit (Verständlichkeit) • einige Sprachen ermöglichen GOTO oder JUMP-Anweisungen • Sprung von jeder Stelle an jede Stelle möglich • dadurch sind beliebige Ablaufstrukturen möglich • z.B: Basic, Assembler • nicht möglich: Java, Modula 2
unbeschränkte Ablaufstrukturen unbeschränkte Ablaufstrukturen Beispiel (~BASIC) A:PRINT " IST N EINE PRIMZAHL ?" INPUT "Welche Zahl ?"; N PRINT IF N == 1 THEN GOTO C IF N == 2 THEN GOTO D T = 1 B:T = T + 1 IF T * T > N THEN GOTO D IF N <> T * INT (N / T) THEN GOTO B C:PRINT " N IST KEINE PRIMZAHL" GOTO A D:PRINT "N IST EINE PRIMZAHL" GOTO A (da ein Teiler t mit t * t > n einen Gegenteiler n/t mit n/t < t hätte) Problem: schlechte Lesbarkeit, da beliebig gesprungen werden darf
unbeschränkte Ablaufstrukturen (2) unbeschr Probleme • Sprunganweisungen ermöglichen unbeschränkte Ablaufstrukturen • hohe Komplexität möglich (statisch, dynamisch) • schwierige Validation, hoher Aufwand für Verifikation • Beispiel: mehrere Einsprünge in Schleifen, mehrere Aussprünge aus Schleifen, ... Grundidee der strukturierten Programmierung • nur Ablaufstrukturen mit einem Eingang und einem Ausgang zulassen • Böhm und Jacopini haben gezeigt, daß jeder (!) Algorithmus durch Kombination von Sequenz, Verzweigung und Wiederholung mit einem Ein-und Ausgangdarstellbar ist • (das allein bietet noch keine Garantie für Strukturiertheit (z.B. ist es möglich schlecht strukturierte Programme ohne Sprunganweisung zu schreiben))
D-Diagramme D-Diagramme Idee • Beschränkung auf wenige Ablaufstrukturen • Folge: weniger Komplexität, bessere Strukturiertheit rekursive Definition • einfache Anweisung S ist ein D-Diagramm • wenn S1 und S2 D-Diagramme sind, so sind auch folgende Konstrukte D-Diagramme: • S1; S2 // Sequenz • if p then S1 // Verzweigung • if p then S1 else S2 • while p do S1 end // Abweisschleife • nichts anderes ist ein D-Diagramm
D-Diagramme (2) Grundlegende D-Diagramm Strukturen • jeweils genau ein Eingang, ein Ausgang • rekursive Komposition dieser Strukturen erlaubt • dadurch entstehen neue Strukturen, die wieder sog. reine D-Diagramme sind • keine reinen D-Diagramm Strukturen: Repeat, For, Switch
D-Diagramme (3) erweiterte D-Diagramme • Die Erfahrung hat gezeigt, daß einige weitere Strukturen verwendet werden dürfen • Repeat-Schleife (Durchlaufschleife) • Case Statement (Fallunterscheidung, switch) • (For-Schleife) Diese Strukturen können wir zusätzlich einsetzten.
D-Diagramme (4) D-Diagramme (4) Beispiel (D-Diagramm?) DIM N = 12 PRINT IF N = 1 THEN GOTO C IF N = 2 THEN GOTO D T = 1 B:T = T + 1 IF T * T > N THEN GOTO D IF N <> T * INT (N / T) THEN GOTO B C:PRINT " N IST KEINE PRIMZAHL" END D:PRINT "N IST EINE PRIMZAHL" END • Für jede Anweisung ein Kasten • Pfeile für Gotos • Verzeigung ? Bedingung
D-Diagramme (5) D-Diagramm ? j ? p Ja n ? N==1 ? q Nein j ? N==2 n Ja Nein A T = 1 B T = T + 1 j ? r Ja ? T*T > N n j Nein ? s Ja ? N <> T * INT (N/T) n Nein C PRINT "Prim" D PRINT "nicht Prim" E END
Nicht D-Diagramm Strukturen Einige grundlegende Strukturen • Verzweigung mit Einsprung • Verzweigung mit Aussprung (Verzweigung in Verzweigung, die aus der umgebenden Verzweigung rausführt) • Schleife mit Einsprung • Schleife mit Aussprung (Verzweigung in Schleife, die aus der Schleife rausführt)
Transformation in D-Diagramme Allgemeines • Jede beliebige Ablaufstruktur läßt sich als D-Diagramm darstellen (lt. Böhm und Jacopini) • Wie kann man ein Nicht-D-Diagramm in ein D-Diagramm transformieren? • Mehrere Methoden • Einige ändern die Struktur des ursprüngl. Algo. stark • Wir -> heuristisch: • Codeverdoppelung oder/und • Einführung boolescher Hilfsvariablen
Transformation in D-Diagramme (2) Beispiel
Transformation in D-Diagramme (3) Beispiel • D-Diagramm? • Code Verdoppelung oder boolesche Hilfsparameter
Transformation in D-Diagramme (4) Lösungen • D-Diagramm?
Transformation in D-Diagramme (4) Problem und Lösung • D-Diagramm?;
Transformation in D-Diagramme (5) Problem (Kreuzstruktur) • Idee: zwei Spieler, die abwechselnd drankommen; r,q == gewonnen
Transformation in D-Diagramme (6) Lösung (Kreuzstruktur) • D-Diagramm?
Transformation Wie prüft und transformiert man Algorithmen? • Algorithmus von Jana als Ablaufdiagramm darstellen • Prüfen, ob D-Diagramm konform • Ablaufdiagramm durch: • boolesche Hilfsvariable und • Code-Verdoppelung • in D-Diagramm überführen • 4. D-Diagramm prüfen (z.B. von außen nach innen) • 5. D-Diagramm in Algorithmenbeschreibungssprache darstellen
Übung 2 • Jana wird um GOTO-Statement erweitert • Übung betrifft Darstellung, Transformation • Nur Grundstrukturen + Repeat Schleife nötig • Achten Sie auf saubere Darstellung • Einsatz der Mittel: Codeverdoppelung, boolesche Hilfsvariablen • Anmerkung: • In der Praxis (z.B. Java): • Programmierprache ohne Goto Statement -> gut • dann prüfen, ob break oder continue Anweisungen verwendet wurden, da z.B. Java auch mehrere Schleifenaussprünge ermöglicht