Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Lennart Kolbe Geändert vor über 6 Jahren
1
Raphael Fischer fischrap@student.ethz.ch 23.03.2014
Informatik II - Übung 04 Raphael Fischer
2
Besprechung Übungsblatt 3
Raphael Fischer
3
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
4
U3.A2 – String vs StringBuffer
Raphael Fischer
5
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
6
U3.A2 b) Starting encryption (using Strings) Done - Duration: 2927 ms. Starting decryption (using StringBuffers) Done - Duration: 54 ms. Decryption successful :-) Raphael Fischer
7
U3.A3 – Was ist erzeugbar und was nicht?
Raphael Fischer
8
U3.A4 a) - Raphael Fischer
9
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) Raphael Fischer
10
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
11
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
12
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
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
14
Ausblick: Übungsblatt 4
Raphael Fischer
15
U4.A1 - Stack Datenstruktur: Nur oberstes Element zugreifbar
Last-in-first-out Anwendungen Parameterübergabe bei Programmiersprachen Postfixnotation Peek Raphael Fischer
16
Implementation aus der Vorlesung
Raphael Fischer
17
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
18
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
19
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
20
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
21
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
22
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
23
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
24
U4.A2 a&b a): A(2,1) „von Hand“ berechnen
In Baumstruktur Interessant: 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
25
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
26
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
27
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
28
…viel Spass! Informatik II - Übung 02
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.