Raphael Fischer fischrap@inf.ethz.ch 15.03.2014 Informatik II - Übung 03 Raphael Fischer fischrap@inf.ethz.ch 15.03.2014
Besprechung Übungsblatt 2 Raphael Fischer 27.11.2018
U2.A1 S R H P V F A N O Q J K G Können Sie aus den obigen Linksklammerdarstellungen den dazugehörigen Baum eindeutig rekonstruieren? S(R(H(K)),P(A(N,O),Q,T),V(J,F(G))) Ja, falls Position der Knoten unwichtig (linker oder rechter Nachfolger?) Nein, da Position der Knoten in Binary tree nicht eindeutig bestimmbar bei einzelnem Kind (linker oder rechter Nachfolger?) S R H P V F A N O Q J K G Raphael Fischer 27.11.2018
U2.A2 – Coding style: Effizienz Objektinstanzierung ist teuer! void initialize() { for (int i=0; i<a.length; i++) { Random r = new Random(); a[i] = r.nextInt(1000); } void initialize() { Random r = new Random(); for (int i=0; i<a.length; i++) { a[i] = r.nextInt(1000); } Raphael Fischer 27.11.2018
Aufgabe 2c Raphael Fischer 27.11.2018
[ 5 1 9 2 ] [ 9 1 5 2 ] [ 9 5 1 2 ] [ 9 5 2 1 ] recursiveSort(4) Kein swap mehr noetig... recursiveSort(3) 2 <- findLargest(2,3) Swap recursiveSort(2) 5 <- findLargest(1,3) Swap recursiveSort(1) 9 <- findLargest(0,3) Swap recursiveSort(0) Ist sortiert! Animation von Simon Mayer Liste absteigend sortiert! Raphael Fischer 27.11.2018
U2.A3 Wurzel an Index 0 Direkte Nachfolger von i an (2i + 1) und (2i + 2) int leftChild( node ){ return 2 * node + 1; } int rightChild( node ){ return 2 * node + 2; int father( node ){ return (node – 1) / 2; (father(0) = -1 / 2 = 0) Raphael Fischer 27.11.2018
U2.A3 b Prüfen des übergebenen Arrays: Teste: Jedes Element braucht einen Vater ("The root is its own father.”) Was passiert mit leeren Knoten? (Brauchen keinen Vater) private static void checkTree(char[] array) { if(array.length == 0) throw new IllegalArgumentException("Empty array is invalid tree!"); for(int i = 1; i < array.length; i++) if(array[father(i)] == ' ' && array[i] != ' ') throw new IllegalArgumentException("Node " + array[i] + " has no father"); } Raphael Fischer 27.11.2018
Überladung (gleicher Funktions- name, andere Argumente) U2.A3 c Überladung (gleicher Funktions- name, andere Argumente) public String toString() { return toString(0, ""); } private String toString(int node, String intendation) if(node >= tree.length || tree[node] == ' ') return ""; return intendation + tree[node] + "\n" + toString(leftChild(node), intendation + " ") + toString(rightChild(node), intendation + " "); Raphael Fischer 27.11.2018
Ausblick: Übungsblatt 3 Raphael Fischer 27.11.2018
Schleifeninvarianten 🙄 Mathematischer Ausdruck, der immer am Anfang (oder am Ende) der Schleife korrekt ist. Beispiel: int add(int a, int b) { int i = b; int e = a; while(i != 0){ e++; i--; } return e; e+b = a+b b+i = a+b e+i = a+b a+i = a+b i = 0 Raphael Fischer 27.11.2018
Schleifeninvarianten 🙄 Leider kein Patentrezept. -> Code verstehen 1c) Trickaufgabe. -> Wichtiges Detail Raphael Fischer 27.11.2018
U3.A2: String und StringBuffer Klasse String (immutable) Operationen können gut optimiert werden Aber: Modifikationen nur durch Kopie! Klasse StringBuffer (mutable) Veränderbar ohne Kopie Aber: Gewisse Operationen sind teuer! Demo: Immutable und Mutable Strings Raphael Fischer 27.11.2018
U3.A2 – String vs. StringBuffer Speicher "hello" " world" String myString = "hello"; myString = myString + " world"; "hello world" String-Konkatenation in Java StringBuffer myStringBuffer = "hello"; myStringBuffer.append(" world"); "hello" "hello world" " world" Methode von StringBuffer Raphael Fischer 27.11.2018
U3.A2 – String vs. StringBuffer Speicher "hello" " world" "hello world" " how" Garbage Collector "hello world how" String myString = "hello"; myString = myString+" world"; myString = myString+" how"; myString = myString+" are"; myString = myString+" you"; myString = myString+" today"; " are" "hello world how are" " you" "hello world how are you" Garbage Collector " today" "hello world how are you today" Animation von Beat Saurenmann Raphael Fischer 27.11.2018
U3.A2 Fehler im Code: Ändere import von Main.java: import u3a1.util.RandomString; import u3a2.util.RandomString; Raphael Fischer 27.11.2018
Syntaxdiagramme Was stellt das dar? Wie ändern, so dass Pinoccio mit bel. Nasenlänge darstellbar ist? Z.B. :--) oder ;------( oder ;) oder :-----------------------) Raphael Fischer 27.11.2018
Syntaxdiagramme Verzweigung: if() {…} else if (…) Oder if(… || …) {…} Pfeil zurück: Irgendeinen loop Raphael Fischer 27.11.2018
U3.A3 – Syntaxchecker für Bäume Implementierung eines Syntaxcheckers für Bäume Zuerst: Erweiterung der Baumsyntax auf leere Teilbäume Syntaxchecker: Je eigene Methode für Baum, Nachfolger und Knoten Lösungsansatz: public static int f(String str, int offset){...} Gebt jeweils den neuen Offset an die übergeordnete Funktion zurück. Überlegt euch, wie gross der Offset am Schluss sein muss und was passiert ist, falls er nicht genau diese Grösse hat. Hinweis: Lösung von 3a) muss mit eingebaut werden Mögliche Probleme und dazugehörige Lösungsansätze/Erklärungen: StringIndexOutOfBoundsException – ihr versucht auf den character n des Strings zuzugreifen, der Array ist aber weniger lang als n Informatik II - Übung 02 07.03.2012
…viel Spass! Informatik II - Übung 02 06.03.2013