Raphael Fischer fischrap@student.ethz.ch 23.03.2014 Informatik II - Übung 04 Raphael Fischer fischrap@student.ethz.ch 23.03.2014
Besprechung Übungsblatt 3 Raphael Fischer 13.11.2018
U3.A1 Terminierungsbeweis nötig für Korrektheitsbeweis! static int f(int i, int j) { int u = i; int z = 0; while (u > 0) { z = z + j; u = u - 1; } return z; i*j = z + u*j u = 0 => i*j = z Terminierungsbeweis nötig für Korrektheitsbeweis! Raphael Fischer 13.11.2018
U3.A2 – String vs StringBuffer Raphael Fischer 13.11.2018
U3.A2 – Unterschied zwischen diesen Optionen? StringBuffer sb = new StringBuffer("Hey "); sb.append("you!"); //Option 1 sb = sb.append(":)"); //Option 2 String str = "Hey"; str = str + "you! :)";//Option 3 Raphael Fischer 13.11.2018
U3.A2 b) Starting encryption (using Strings) Done - Duration: 2927 ms. Starting decryption (using StringBuffers) Done - Duration: 54 ms. Decryption successful :-) Raphael Fischer 13.11.2018
U3.A3 – Was ist erzeugbar und was nicht? Raphael Fischer 13.11.2018
U3.A4 a) - Raphael Fischer 13.11.2018
U3.A3 b) - Syntaxchecker public class KD { private static boolean checkNext(char c, String kd, int offset) private static int parseTree(String kd, int offset) throws ParseException private static int parseNode(String kd, int offset) throws ParseException private static int parseSubtree(String kd, int offset) throws ParseException public static void parse(String kd) throws ParseException { int offset = parseTree(kd, 0); if(offset != kd.length()) throw new ParseException("There is something more at the end", offset); } parseTree(2,kd): returns 8 Die Funktionen parsen ihren Teil ab offset und geben den past-the-end offset ihres Teils zurück (1 nach dem letzten Zeichen) A(B(C,D),E) 012345678910 Raphael Fischer 13.11.2018
KD.nextChar() private static boolean checkNext(char c, String kd, int offset) { if (offset < kd.length()) { return kd.charAt(offset) == c; } return false; Raphael Fischer 13.11.2018
KD.parseNode() private static int parseNode(String kd, int offset) throws ParseException { boolean found = false; for(char c = 'A'; c <= 'Z'; c++) if(checkNext(c, kd, offset)){ found = true; break; } if(!found) throw new ParseException("Expected A..Z", offset); return offset+1; Raphael Fischer 13.11.2018
KD.parseTree() - private static int parseTree(String kd, int offset) throws ParseException{ if(checkNext('-', kd, offset)) offset++; else { offset = parseNode(kd, offset); if(checkNext('(', kd, offset)) { offset = parseSubtree(kd, offset); if(checkNext(')', kd, offset)) else throw new ParseException("Closing bracket expected", offset); } return offset; Raphael Fischer 13.11.2018
KD.parseSubtree() private static int parseSubtree(String kd, int offset) throws ParseException { while(true){ offset = parseTree(kd, offset); if(checkNext(',', kd, offset)) offset++; else break; } return offset; Raphael Fischer 13.11.2018
Ausblick: Übungsblatt 4 Raphael Fischer 13.11.2018
U4.A1 - Stack Datenstruktur: Nur oberstes Element zugreifbar Last-in-first-out Anwendungen Parameterübergabe bei Programmiersprachen Postfixnotation Peek Raphael Fischer 13.11.2018
Implementation aus der Vorlesung Raphael Fischer 13.11.2018
Hinweise U4.A1 a-c Konstruktor internes Array initialisieren. Grösse wird Konstruktor übergeben toString()-> am besten mit StringBuffer erwartete Ausgabe: "[e0, e1, e2, …]" grow() Kapazität verdoppeln, alte Werte kopieren Raphael Fischer 13.11.2018
Erinnerung: Objekte und Referenzen int[] a = new int[5]; int[] b = a; a = new int[6]; Referenzen: Objekte: a int[5] b int[6] Raphael Fischer 13.11.2018
Hinweise U4.A1 d) push(), pop(), peek(), empty() size() capacity() Standard Stackfunktionalität Argumente sind vom Typ int Wenn nötig, rufe grow() auf size() Anzahl der Elemente momentan auf dem Stack capacity() Gesamtzahl von Elementen welche auf den aktuellen Stack passen (ohne grow nochmal aufzurufen) Raphael Fischer 13.11.2018
U4.A3 – Java Bytecode Einfache Befehle = Spaghetticode z.B. Sprung nach Zeile … Kein if, keine Schleifen! Es gibt globalen Stack Alle arithm. Befehle operieren auf diesem z.B.: iadd: push(pop()+pop()) integer Raphael Fischer 13.11.2018
U4.A3 – Java Bytecode iload_0: push(Argument0) static int f(int a, int b) { if(a == 0) return b; return f(a-1, b); } iload_0: push(Argument0) ifne X: if(peek() != 0) goto X ifgt X: if(peek() > 0) goto X not equal greater than etc. ireturn: Return (Rückgabewert ist auf Stack) iconst_1: push(1) isub: Ersetze die beiden obersten Werte durch ihre Differenz invoke…: Funktionsaufruf. Argumente / Rückgabewert via Stack Raphael Fischer 13.11.2018
Hinweise U4.A3 – Java Bytecode D:\Projects\DisassemblerDemo> javac JavaTip.java //compiler java JavaTip //run javap –c –private JavaTip.java //disassembler Häufiger Fehler: „javap is not recognized as an internal or external command, operable program or batch file” Grund: java binaries sind nicht im Systemvariable PATH definiert Lösung: Rechtsclick auf Computer Properties Advanced System Settings Environment Variables PATH folgendes hinzufügen (je nach dem, wo euer Java installiert ist): ;C:\Program Files\Java\jdk1.6.0_31\bin Raphael Fischer 13.11.2018
U4.A2 - Ackermannfunktion Bedeutende Funktion in der theoretischen Informatik Wächst extrem schnell! Wilhelm Ackermann (1986 – 1962, Deutschland) 19‘729 Dezimalstellen A(3,3) = 61 A(4,2) Raphael Fischer 13.11.2018
U4.A2 a&b a): A(2,1) „von Hand“ berechnen In Baumstruktur Interessant: http://www.wolframalpha.com b): Iterativer Algorithmus mit while und Stack auf Papier Pseudocode erlaubt! Die Ackermann-Funktion hat die Eigenschaft, dass man vorher nicht sagen kann, wie tief die Rekursion wird anstatt for-loop benutze while! Raphael Fischer 13.11.2018
Was ist Pseudocode? Keine sprachspezifische Syntax Selbsterklärend Oft: einfache, englische Sprache Schon mit Funktionen, Verzweigungen und Schlaufen Selbsterklärend Vorteil??? Fokus auf das Wesentliche! Raphael Fischer 13.11.2018
Hinweise U4.A2 b&c – Iterativer Ansatz Funktionsaufruf = 1 while-Durchgang Funktionsarg. immer zuoberst auf Stack Rückgabewert wieder auf Stack push Argument_1_or_2 //In welcher Reihenfolge? push Argument_2_or_1 //->3. Fall muss funktionieren Loop as long as stack size != 1: //neuer Aufruf der Ackermann-Funktion: //Parameter vom Stack holen: a = pop b = pop //Do something with those values Push one value as return item or: Push two values for new function call or: What to do for third case? Raphael Fischer 13.11.2018
Hinweise U4.A2c – Iterativer Ansatz Stack Nutzt dazu euren Stack aus Aufgabe 1 Verändert euren Code davon nicht! Debuggen oder toString() Methode des Stacks verwenden Was, wenn Ihr Aufgabe 1 nicht gelöst habt? Ihr braucht nur push(), pop(), size und toString() Zur Not: Nutzt java.util.Stack<Integer> Raphael Fischer 13.11.2018
…viel Spass! Informatik II - Übung 02 06.03.2013