Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Informatik II – Übung 4 Gruppe 2 Carina Fuss cfuss@student.ethz.ch 21.3.2018 Carina Fuss 21.3.2018
Übung 4 Administratives Nachbesprechung Übung 3 Vorbesprechung Übung 4 Stack, Bytecode, (Ackermann-Funktion) Carina Fuss 21.3.2018
Übung 4 Code-Samples auf der Vorlesung sind auf CodeExpert verfügbar. alte Prüfungen auf der amiv-Website (aber Achtung: Es wird betont, dass man aus alten Prüfungen nicht auf die nächste schliessen kann!) Tests benutzen! Man sieht auch seine falschen Ausgaben und kann damit korrigieren. Demo Carina Fuss 21.3.2018
Nachbesprechung Übung 3 Carina Fuss 21.3.2018
Übung 3 – Aufgabe 1 – String vs. StringBuffer Verschlüsseln mit String Entschlüsseln mit StringBuffer Carina Fuss 21.3.2018
Übung 3 – Aufgabe 1 Main bestimmt die Zeit, die es für die Ver-/Entschlüsselung braucht Warum gibt es Laufzeitunterschiede? Strings sind immutable und müssen jedes Mal kopiert werden, an StringBuffer kann man ohne Kopie neue Zeichen anhängen (append) Carina Fuss 21.3.2018
Übung 3 – Aufgabe 2 – Syntaxdiagramme Clause: Expr: Carina Fuss 21.3.2018
Übung 3 – Aufgabe 3 – Syntaxchecker Knoten: Baum: Unterbäume: Bäume in Klammerdarstellung Wie kann man auch leere Bäume und Teilbäume ‘-’ darstellen? Carina Fuss 21.3.2018
Übung 3 – Aufgabe 3 – Syntaxchecker Carina Fuss 21.3.2018
checkNext() Hilfsmethode: checkNext() überprüft, ob das nächste Zeichen einem bestimmten (erwarteten) Zeichen entspricht und ob wir noch im String sind Carina Fuss 21.3.2018
Knoten Carina Fuss 21.3.2018
Baum Carina Fuss 21.3.2018
Unterbaum Carina Fuss 21.3.2018
Methode parse() public, kann mit einem String aufgerufen werden Carina Fuss 21.3.2018
Übung 4 – Aufgabe 4 – Programmverifikation Schleifeninvariante: z + u * j – i * j = 0 Schleifeninvariante gilt nach n Schleifendurchläufen immer noch vor und nach der Schleife Carina Fuss 21.3.2018
Übung 3 – Aufgabe 4 Korrektheitsbeweis mittels Schleifeninvariante: I gilt vor dem Schleifenkörper, I ist Schleifeninvariante (gilt während der Schleife) I gilt auch nach dem Schleifenkörper Schleifenbedingung C gilt vor der Schleife, aber nach der Schleife nicht mehr Hoare-Kalkül (Aussage über dem Strich impliziert die darunter) Carina Fuss 21.3.2018
Übung 4 – Aufgabe 4 Dummy-Implementierung: Schleifeninvariante gilt immer noch… Programm ist partiell korrekt Terminierung? Programm terminiert nie, da u immer grösser als 0 bleibt keine totale Korrektheit Carina Fuss 21.3.2018
Vorbesprechung Übung 4 Carina Fuss 21.3.2018
Übung 4 – Aufgabe 1 – Stack siehe Informatik I… LIFO (last in first out) Java arbeitet mit Stacks Demo Carina Fuss 21.3.2018
Konstruktor des Stacks Initialisieren der Klassenvariablen: private int[] buffer private int size size momentane Grösse des Stacks capacity Kapazität des Stacks (wenn sie aus- gelastet ist, muss der Stack wachsen) Mit dem Konstruktor erstellt man eine neue Instanz der Klasse Stack: Stack s = new Stack(100); Carina Fuss 21.3.2018
toString() und grow() Verwendung von StringBuffer und der Methode append(String str) Konvertierung von int zu String mittels static String Integer.toString(int i) Stack soll wachsen, sobald seine Kapazitätsgrenze erreicht ist: neuen buffer mit doppelter Grösse anlegen alle Werte vom alten in den neuen buffer kopieren einfache, aber aufwendige (!) Methode, dynamisch wachsende Stacks zu ermöglichen Carina Fuss 21.3.2018
Funktionen zum Arbeiten mit dem Stack push() Kontrolliert, ob die Kapazität des Stacks ausreichend ist. Ansonsten grow() pop(), peek() Kontrolliert, ob überhaupt etwas auf dem Stack liegt. size(), capacity() Gibt die aktuelle Anzahl an Elementen auf dem Stack und seine Kapazität zurück. Carina Fuss 21.3.2018
Übung 4 – Aufgabe 2 – Ackermann-Funktion A(0, m) = m+1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) extrem schnell wachsende Funktion: Carina Fuss 21.3.2018
Ackermann – Stack A(0, m) = m+1 A(n, 0) = A(n-1, 1) Push Start A(1,1) A(1,1) A(1,0) A(0, 1) <- 2 A(0, 2) <- 3 Iteration m = 1 m = 0 m = 1 m = 2 Pop size > 2? No. n = 0 n = 0 n = 1 n = 1 A(0, m) = m+1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) Push n == 0? m + 1 No. n - 1 Push m == 0? No. 1 n - 1 m = 1 m = 0 Push else n m = 2 n = 0 n = 1 m = 1 m - 1 m = 3 n = 0 n = 1 Berechnung von A(2,1)? Stack Pop End A(1,1) = 3 Carina Fuss 21.3.2018
Iterative Ackermann Wie eben gezeigt mithilfe von Stack implementieren. Verwendet die Methoden vom Stack aus Aufgabe 1! Achtung: CodeExpert: eure Klasse Stack kopieren! Bei Schwierigkeiten: String-Repräsentation des Stacks ausgeben, um Fehler zu analysieren… Carina Fuss 21.3.2018
Übung 4 – Aufgabe 3 – Java-Bytecode Maschinensprache (Inhalt der class-Datei) in der Konsole anzeigen mit javap -c Demo Carina Fuss 21.3.2018
Bytecode – Beispiel Code: 0: iload_0 1: ifne 6 4: iconst_1 5: ireturn static boolean gerade(int); Code: 0: iload_0 1: ifne 6 4: iconst_1 5: ireturn 6: iload_0 7: iconst_1 8: isub 9: invokestatic #2 // Method gerade:(I)Z 12: ifne 19 15: iconst_1 16: goto 20 19: iconst_0 20: ireturn Carina Fuss 21.3.2018
Bytecode – Beispiel static int verdopple(int); Code: 0: iload_0 1: ifne 6 4: iconst_0 5: ireturn 6: iconst_2 7: iload_0 8: iconst_1 9: isub 10: invokestatic #3 // Method verdopple:(I)I 13: iadd 14: ireturn Carina Fuss 21.3.2018
Bytecode – Beispiel static int halbiere(int); Code: 0: iload_0 1: ifne 6 4: iconst_0 5: ireturn 6: iload_0 7: iconst_1 8: if_icmpne 13 11: iconst_0 12: ireturn 13: iconst_1 14: iload_0 15: iconst_2 16: isub 17: invokestatic #4 // Method halbiere:(I)I 20: iadd 21: ireturn Carina Fuss 21.3.2018
Bytecode – wichtige Befehle iload/aload: lädt lokale Variable/Referenz aus dem Speicher iconst: lädt Konstante (z.B. 0 oder 1) iadd: addiert die zwei obersten Variablen auf dem Stack isub: subtrahiert die zwei obersten Variablen auf dem Stack ireturn: Rückgabe (oberster Wert auf dem Stack) goto: springt zu bestimmter Zeile ifne: springt, wenn der Vergleich mit Null negativ ausfällt invokevirtual: ruft eine neue Instanz der Methode auf Carina Fuss 21.3.2018
Fragen? Carina Fuss 7.3.2018