Informatik II Übung 4 Gruppe 7 Leyna Sadamori leyna.sadamori@inf.ethz.ch Informatik II Übung 4 Leyna Sadamori 20. März 2014 1
Administratives Text Encoding: UTF-8 Informatik II Übung 4 Leyna Sadamori 20. März 2014 2
Debriefing Übung 3 Informatik II Übung 4 Leyna Sadamori 20. März 2014 3
U3A1a Ausgabe des Programms StringObject! Give me six! Give me six lines! Informatik II Übung 4 Leyna Sadamori 20. März 2014 4
U3A1b Objekte und Referenzen Markierung 1: Objekte (0, StringObject,...) (1, String, "Give ") (2, StringBuffer, "Give ") Referenzen (ref, 0) (mystring, 1) (mybuffer, 2) Informatik II Übung 4 Leyna Sadamori 20. März 2014 5
U3A1b Objekte und Referenzen Markierung 2: Objekte (0, StringObject,...) (1, String, "Give ") (2, StringBuffer, "Give me six ") (3, String, "me six ") (4, String, "Give me six ") Referenzen (ref, 0) (mystring, 4) (mybuffer, 2) Informatik II Übung 4 Leyna Sadamori 20. März 2014 6
U3A1b Objekte und Referenzen Markierung 3: Objekte (0, StringObject,...) (1, String, "Give ") (2, StringBuffer, "Give me six ") (3, String, "me six ") (4, String, "Give me six ") (5, String, "lines") (6, String,"Give me six lines") Referenzen (ref, 0) (mystring, 4) (mybuffer, 2) (s1, 6) (s2, 5) Informatik II Übung 4 Leyna Sadamori 20. März 2014 7
U3A1b Objekte und Referenzen Markierung 4: Objekte (0, StringObject,...) (1, String, "Give ") (2, StringBuffer, "Give me six lines") (3, String, "me six ") (4, String, "Give me six ") (5, String, "lines") (6, String,"Give me six lines") Referenzen (ref, 0) (mystring, 4) (mybuffer, 2) Informatik II Übung 4 Leyna Sadamori 20. März 2014 8
U3A2 Syntaxanalyse Informatik II Übung 4 Leyna Sadamori 20. März 2014 9
U3A3a - Syntaxchecker Erweiterung des Syntaxdiagramms für Bäume um den leeren (Teil-)Baum Informatik II Übung 4 Leyna Sadamori 20. März 2014 10
U3A3b - Syntaxchecker private static int parsetree(string kd, int offset) throws ParseException { if (offset >= kd.length()) { throw new ParseException("Unexpected end of string", offset); if (kd.charat(offset) == '-') { return offset + 1; else { offset = parsenode(kd, offset); if ((offset < kd.length()) && (kd.charat(offset) == '(')) { offset += 1; offset = parsesubtree(kd, offset); if ((offset < kd.length()) && (kd.charat(offset) == ')')) { offset += 1; else { throw new ParseException("expected ')'", offset); return offset; Informatik II Übung 4 Leyna Sadamori 20. März 2014 11
U3A3b - Syntaxchecker private static int parsesubtree(stringstring kd, int offset) throws ParseException { if (offset >= kd.length()) { throw new ParseException("unexpected end of string after '('", offset); offset = parsetree(kd, offset); while ((offset < kd.length()) && (kd.charat(offset) == ',')) { offset += 1; offset = parsetree(kd, offset); return offset; Informatik II Übung 4 Leyna Sadamori 20. März 2014 12
U3A3b - Syntaxchecker private static int parsenode(string kd, int offset) throws ParseException { if (offset >= kd.length()) { throw new ParseException("Expected a node", offset); if (Character.isUpperCase(kd.charAt(offset))) { return offset + 1; else { throw new ParseException(String.format("'%c' is not a valid node name", kd.charat(offset)), offset); Informatik II Übung 4 Leyna Sadamori 20. März 2014 13
U3A3b - Syntaxchecker public static void parse(string kd) throws ParseException { int offset = parsetree(kd, 0); if (offset!= kd.length()) { throw new ParseException("Garbage at the end of the tree", offset); Informatik II Übung 4 Leyna Sadamori 20. März 2014 14
Briefing Übung 4 Informatik II Übung 4 Leyna Sadamori 20. März 2014 15
U4A1 Stack U4A1a: Die Variable size gibt die aktuelle Größe des Stacks an, nicht seine Kapazität U4A1b: Konvertierung von int zu String mittels static String Integer.toString(int i) Verwendung von StringBuffer und der Methode append(string str) Informatik II Übung 4 Leyna Sadamori 20. März 2014 16
U4A1 Stack U4A1c: Einfache Variante:? Fortgeschrittene Variante: Verwendung von! Allgemeine Hinweise: static Funktion: Klassenfunktion, benötigt keine Erzeugung von Objekten Beachtet die Beschreibung in der Java API static int[] Arrays.copyOf(int[] original, int newlength)! Informatik II Übung 4 Leyna Sadamori 20. März 2014 17
U4A1d 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 Informatik II Übung 4 Leyna Sadamori 20. März 2014 18
U4A2 Ackermann Funktion Ackermann Funktion rekursive Definition wächst extrem schnell A(3,3) = 61 A(4, 2) hat bereits 19729 Dezimalstellen!! Wilhelm Ackermann (1986 1962, Deutchland) Informatik II Übung 4 Leyna Sadamori 20. März 2014 19
U4A2a Schreibt die Ackermann Funktion um: A(0, m) = m +1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) Schreibt die Aufrufe ausführlicher auf, als im Beispiel Schreibt anschließend nur die Aufrufe von A auf (wie im Beispiel) Beim Aufschreiben auf die Einrückung achten Informatik II Übung 4 Leyna Sadamori 20. März 2014 20
U4A2b-c Aufgabenteil b) kann zusammen mit c) gelöst werden Wenn die Implementierung von c) korrekt ist und ausreichend kommentiert ist, zählt b) auch als gelöst. Es muss nicht zusätzlich Pseudocode geschrieben werden. Wer Aufgabenteil c) nicht oder nur teilweise lösen kann, sollte den Pseudocode von Aufgabenteil b) schreiben. Pseudocode: Keine sprachspezifische Syntax Pseudocode ist selbsterklärend Grundlage für Kommentare Die Funktion hat die Eigenschaft, dass man nicht vorhersagen kann, wie tief die Rekursion wird anstatt for-loop benutze while! Informatik II Übung 4 Leyna Sadamori 20. März 2014 21
A(1,1) A(1,0) A(0, 1) <- 2 <- 2 A(0, 2) <- 3 <- 3 Start Iteration size > 2? n == 0? m == 0? A(1,1) m = 20 1 n = 01 m + 1 n - 1 1 Push Pop No. Push No. Push No. n - 1 m = 01 m n = 10 2 else n m - 1 Push m n = 01 3 Stack End A(1,1) = 3 Pop Informatik II Übung 4 Leyna Sadamori 20. März 2014 22
U4A3 Bytecode Bevor ihr den Code disassemliert, müsst ihr den Code erst kompilieren 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 Informatik II Übung 4 Leyna Sadamori 20. März 2014 23
U4A3 Bytecode Befehle iload_<n> lädt die lokale Variable aus Position <n> aus dem Speicher aload_<n> lädt eine Referenz aus Position <n> aus dem Speicher ifne <l> springt zu Zeile <l>, wenn der Vergleich mit Null negativ ausfällt invokevirtual ruft eine neue Instanz der Methode auf Beachtet die Dokumentation in http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5 Informatik II Übung 4 Leyna Sadamori 20. März 2014 24
Tipps und Tricks Informatik II Übung 4 Leyna Sadamori 20. März 2014 25
viel Spass! Informatik II Übung 4 Leyna Sadamori 20. März 2014 26