Informatik II – Übung 4 Gruppe 3 Julia Gygax jgygax@student.ethz.ch Julia Gygax 03.09.2019
Nachbesprechung Übung 2 Julia Gygax 03.09.2019
Aufgabe 1 - Programmverifikation Schleifeninvariante z+u*j–i*j=0 Anfang: z = 0 und u*j = i*j Nach einem Schleifendurchgang: z = z + j und u = u – 1 -> (z+j) + (u-1)*j – i*j= z + j + u*j – j - i*j = 0 Nach n Schleifendurchgängen: z = n*j und u = i - n Am Ende (nach u Schleifendurchgängen): z = u*j und u = i – u = 0 -> u*j + 0*j – i*j = 0 Julia Gygax 03.09.2019
Aufgabe 1 - Programmverifikation Gilt die Schleifeninvariante noch? Ist das Programm korrekt? Julia Gygax 03.09.2019
Terminierung BSP: Collatz-Vermutung: Terminierung nicht bei allen Programmen ersichtlich Julia Gygax 03.09.2019
Aufgabe 2 – String und StringBuffer Inspiration bei encrypt() Char entspricht dem numerischen Wert aus dem ASCII-Zeichensatz Main-Funktion misst Ausführungszeit Julia Gygax 03.09.2019
Aufgabe 3 - Syntaxdiagramm ∼ (X1 OR ∼ X2) (X2) OR (∼X1 OR X2) (X1 OR X2) AND (∼X1) (X1) AND (∼X1 OR ∼X2) AND (X2) Julia Gygax 03.09.2019
Aufgabe 4 – Syntaxdiagramm für Bäume Unterbäume Knoten – Julia Gygax 03.09.2019
Aufgabe 5 – Syntaxchecker für Wurzelbäume Was wir brauchen: -> Funktionen für Bäume, Unterbäume und Knoten -> Hilfsfunktion um das nächste Zeichen vorherzusehen Julia Gygax 03.09.2019
Aufgabe 5 – Syntaxchecker Bäume Leerer Baum? -> nichts mehr zu prüfen 1.) ein Knoten und evtl. 2.) eine Klammer auf 3.) ein Unterbaum 4.) eine Klammer zu Nach jedem Zeichen den offset erhöhen! Julia Gygax 03.09.2019
Aufgabe 5 – Syntaxchecker Unterbaum Ein Unterbaum ist ein Baum gefolgt von beliebig vielen Bäumen getrennt durch Kommas Julia Gygax 03.09.2019
Aufgabe 5 – Syntaxchecker Falls kein Knoten mehr kommt -> Exception Knoten Gültige Knoten sind Grossbuchstaben Ansonsten -> Exception Julia Gygax 03.09.2019
Aufgabe 5 - Syntaxchecker checkNext Liegt der offset im String? Gibt true zurück, wenn an der Stelle offset im Baum das Zeichen c steht Julia Gygax 03.09.2019
Aufgabe 5 - Syntaxchecker Parser Nach dem parsen sollte der offset gleich sein wie die Länge de Strings Julia Gygax 03.09.2019
Theorie Julia Gygax 03.09.2019
Klassenmethoden und Instanzmethoden static Für die Klasse als ganzes Lösen allgemeine Aufgaben Zugriff nur auf klassenbezogene Variablen und andere Klassenmethoden (static) Zugriff via Klassenname Von allen Instanzen einer Klasse geteilt Main-Funktion ist static Instanzmethoden Für spezifische Objekte Zugriff auf this (und andere Instanz- und Klassenmethoden und -variablen) Julia Gygax 03.09.2019
Stack Funktioniert wie ein Stapel -> LIFO-Prinzip (Last in, first out) Pointer zeigt auf das nächste freie Element Vielgenutzte Datenstruktur Z. B. Call-Stack Julia Gygax 03.09.2019
Call Stack Jeder Funkstionsaufruf erhält eigenen “Kontext” Eigene Parameter (Funktionsargumente) Lokale Variablen Rücksprungadresse und Rückgabewerte Je nach Implementierung (verfügbare “Features”) sehr komplex Beispiel: siehe Demo Impedance.add Vereinfachtes Beispiel Julia Gygax 03.09.2019
Call Stack Beispiel Impedance z3 = Impedance.add("z3", z1, z2); double real = z1.getReal() + z2.getReal(); getReal double real double imag String name = “z3” Impedance z1 = #1 Impedance z2 = #2 add local Variables function arguments Julia Gygax 03.09.2019 Animation von Leyna Sadamori
Call Stack Beispiel Impedance z3 = Impedance.add("z3", z1, z2); double real = z1.getReal() + z2.getReal(); double imag = z1.getImag() + z2.getImag(); getImag double real double imag String name = “z3” Impedance z1 = #1 Impedance z2 = #2 add local Variables function arguments Julia Gygax 03.09.2019 Animation von Leyna Sadamori
Call Stack Beispiel Impedance z3 = Impedance.add("z3", z1, z2); double real = z1.getReal() + z2.getReal(); double imag = z1.getImag() + z2.getImag(); return new Impedance(name, real, imag); String name = “z3” double real = 50.0 double imag = 20.0 Impedance double real double imag String name = “z3” Impedance z1 = #1 Impedance z2 = #2 add local Variables function arguments Julia Gygax 03.09.2019 Animation von Leyna Sadamori
Bytecode In der Konsole navigieren: cd change directory cd.. eine Ebene zurück dir listet die Dateien auf (Windows) ls listet die Dateien auf (Linux) Kompilieren javac myPackage/*.java (kompiliert alles im Package myPackage) Ausführen java myPackage.myCode Disassemble javap -c myPackage.myCode Julia Gygax 03.09.2019
Bytecode iconst_0 lade int mit Wert 0 auf Stack istore_3 speichere den Wert in res iload_3 lade res auf stack iload_2 lade a auf stack iadd a + res usw. Index Variabel 1 a 2 b 3 res Julia Gygax 03.09.2019
Vorbesprechung Übung 3 Julia Gygax 03.09.2019
Aufgabenübersicht A1 – Ein wachsender Stack A2 – Ackermann-Funktion A3 – Stackimplementierung der Ackermann-Funktion A4 – Java-Bytecode Julia Gygax 03.09.2019
Aufgabe 1 – Ein wachsender Stack A1.1: Konstruktor implementieren - muss die Klassenvariablen initialisieren - d.h. für Objekte: dieses Objekt erzeugen - size ist die aktuelle Grösse des Stacks (und nicht die Kapazität) A1.2: toString() implementieren - StringBuffer verwenden -> sb.append(String str) verwenden (für StringBuffer sb) - Integer zu String mit Integer.toString(int i) - StringBuffer zu String mit sb.toString() Julia Gygax 03.09.2019
Aufgabe 1 – Ein wachsender Stack A1.3: grow() implementieren - Neues Array mit doppelter Länge (Kapazität) erstellen - Alle Werte aus dem alten Array ins neue kopieren A1.4: push, pop, peek, empty, size, capacity implementieren - push: überprüft, ob noch Platz auf dem Stack ist, sonst -> grow() - pop und peek: überprüft, ob überhaupt ein Element auf dem Stack ist - Beschreibung der Funktionen im JavaDoc lesen Julia Gygax 03.09.2019
Aufgabe 2 – Ackermann – Funktion Quelle: Wikipedia Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Eine etwas andere Definition der Funktion: A(0, m) = m+1 A(n+1,0) = A(n,1) A(n+1, m+1) = A(n, A(n+1, m)) A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Push Start A(1,1) ---------------------------------------- Size > 1 ? m = 1 n = 1 n == 0 ? Nein m == 0 ? Nein n - 1 n m - 1 A(1,1) A(1,0) A(0,1) 2 A(0,2) 3 Pop m = 0 n = 1 m = 1 n = 0 n = 1 Push Stack A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Start A(1,1) ---------------------------------------- Size > 1 ? m = 0 n = 1 n == 0 ? Nein m == 0 ? Ja n -1 1 A(1,1) A(1,0) A(0,1) 2 A(0,2) 3 Pop m = 1 m = 0 n = 1 n = 0 Push n = 0 Stack A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Start A(1,1) ---------------------------------------- Size > 1 ? m = 1 n = 0 n == 0 ? Ja m == 0 ? Nein m+1 A(1,1) A(1,0) A(0,1) 2 A(0,2) 3 Pop m = 1 n = 0 m = 2 Push n = 0 Stack A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Start A(1,1) ---------------------------------------- Size > 1 ? m = 2 n = 0 n == 0 ? Ja m == 0 ? Nein m+1 A(1,1) A(1,0) A(0,1) 2 A(0,2) 3 Pop m = 2 Push n = 3 n = 0 Stack A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Start A(1,1) ---------------------------------------- Size > 1 ? Ende A(1,1) = 3 A(1,1) A(1,0) A(0,1) 2 A(0,2) 3 Pop n = 3 Stack A(0,m) = m+1 A(n,0) = A(n-1,1) A(n, m) = A(n-1, A(n, m-1)) Julia Gygax 03.09.2019
Aufgabe 3 – Stackimplementierung der Ackermann - Funktion Verwendet den Stack aus Aufgabe 1 -> import u4a1.stack; Falls Aufgabe 1 nicht geklappt hat, könnt ihr den Stack aus java.util verwenden Ein neues Objekt vom Typ Stack erzeugen: Julia Gygax 03.09.2019
Aufgabe 4 – Bytecode Erst kompilieren, dann disassemblieren Für Bytecode -> nutzt die Links: https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5 Hinweis für Linux und Mac Nutzer: Verwendet den >> Operator in der Konsole, um die Ausgabe direkt in eine Datei zu schreiben Beispiel: javap -c RecursiveAckermann >> output.txt Julia Gygax 03.09.2019
… viel Spass! Julia Gygax 03.09.2019