Informatik II Übung 5 Gruppe 2 Carina Fuss cfuss@student.ethz.ch 28.3.2018 Carina Fuss 28.3.2018 1
Übung 5 Administratives/Tipps zu Eclipse Nachbesprechung Übung 4 kurze Demo zu Stacks Java Pakete Call by Reference/Call by Value Vorbesprechung Übung 5 Listen: Funktionen, Sortieren von Listen, Stack mit Liste Carina Fuss 28.3.2018 2
Administratives Bonus-Übung ist online! bis 15. April falls unklar ist, was bestimmte Funktionen machen: in der API nachschlagen https://docs.oracle.com/javase/8/docs/api/ Carina Fuss 28.3.2018 3
Nachbesprechung Übung 4 Carina Fuss 28.3.2018 4
Übung 4 Aufgabe 1 Stack Konstruktor Carina Fuss 28.3.2018 5
Übung 4 Aufgabe 1 Stack tostring Carina Fuss 28.3.2018 6
Übung 4 Aufgabe 1 Stack grow Carina Fuss 28.3.2018 7
Übung 4 Aufgabe 1 Stack Carina Fuss 28.3.2018 8
Übung 4 Aufgabe 1 Stack Carina Fuss 28.3.2018 9
Übung 4 Aufgabe 2 Ackermann-Funktion Implementierung wie Animation mit Stack A(0, m) = m+1 A(n, 0) = A(n-1, 1) A(n, m) = A(n-1, A(n, m-1)) Carina Fuss 28.3.2018 10
Übung 4 Aufgabe 3 Bytecode if(n == 0) return m + 1 if(m == 0) Carina Fuss 28.3.2018 11
Übung 4 Aufgabe 3 Bytecode return A(n-1, 1) return A(n-1, A(n, m-1)) Carina Fuss 28.3.2018 12
Übung 4 Aufgabe 3 Bytecode Feststellung: Bytecode der rekursiven Implementierung gleicht der iterativen Implementierung Grund: Java arbeitet mit Stack und setzt alle Methoden damit um Werte auf dem Javastack entsprechen den Werten von unserem manuell verwalteten Stack aus der iterativen Implementierung Carina Fuss 28.3.2018 13
Call Stack Beispiel: Stack Stackoverflow Stack Trace Demo Carina Fuss 28.3.2018 14
Java Hintergrundinformationen Carina Fuss 28.3.2018 15
Pakete Funktionen aus Klassen benutzen, die in anderen Paketen sind? Klassen importieren import package1.class1; Bsp.: IterativeAckermann braucht Funktionen aus der Klasse Stack braucht ihr in Übung 5 Carina Fuss 28.3.2018 16
Datentypen Primitive Typen z.b. byte, int, float, char Referenz-Typen z.b. Arrays, Strings, Klassen Carina Fuss 28.3.2018 17
Call by Reference Call by Value Call by value an Funktion übergebenen Daten werden kopiert keine Verbindung mehr zwischen den Daten beim Aufrufer und den Daten in der Funktion Call by reference Anstatt Daten zu kopieren werden Referenzen auf die Daten übergeben Methodenaufrufe an einem so übergebenen Objekt arbeiten also auf demselben Objekt, das auch außerhalb sichtbar ist Carina Fuss 28.3.2018 18
Call by Reference Call by Value C++: beides möglich Call by value: Daten werden kopiert und übergeben //C++ void swap(a, b); Call by reference: Referenz auf die Daten wird übergeben //C++ void swap(&a, &b); Java ist IMMER call by value!! Bei Übergabe von einem primitiven Typ wird der Wert in eine lokale Variable kopiert. Und bei Übergabe von einem Referenz-Typ wird der Adressenwert in eine lokale Variable kopiert! Carina Fuss 28.3.2018 19
Call by Reference Call by Value Modifizieren ist möglich, Vertauschen aber nicht! Hauptprogramm erzeugt zwei Objekte main(){ } mypoint1 mypoint2 int x1; int y1; int x2; int y2; Hauptprogramm ruft swap(mypoint1, mypoint2); innerhalb Swap heisst das: swap(point p1, Point p2){ } mypoint1 p1 mypoint2 p2 int x1; int y1; int x2; int y2; Bemerkung: Modifizieren von Attributen ist möglich: p1.x1 = 5; aber im Hauptprogramm nach swap(...) mypoint1 p1 mypoint2 p2 int x1; int y1; int x2; int y2; Beachte: Die Referenzen p1 und p2 existieren eigentlich nicht mehr Carina Fuss 28.3.2018 20
int a = 5; Tier fido = new Tier( fido,m); Tier rex = new Hund( rex,m, braun); Tier (name, String, "fido") (geschlecht, char, 'm') Hund Tier (name, String, "rex") (geschlecht, char, 'm') (fellfarbe, String, "braun") STACK (rex, Tier, ) (fido, Tier, ) (a, int, 5) HEAP Carina Fuss 28.3.2018 21
foobar(rex, a); void foobar(tier t, int p) { t.name = "#@!&"; p = 42; t = new Tier( xena,w); } STACK Tier (name, String, "fido") (geschlecht, char, 'm') Hund Tier (name, String, "#@!&") "rex") (geschlecht, char, 'm') (fellfarbe, String, "braun") Tier (name, String, "xena") (geschlecht, char, 'w') (p, int, 42) 5) (t, Tier, ) (rex, Tier, ) (fido, Tier, ) (a, int, 5) HEAP Carina Fuss 28.3.2018 22
Vorbesprechung Übung 5 Carina Fuss 28.3.2018 23
Linked Lists verkettete Listen Dynamische Grösse keine Initialisierung (wie z. B. bei Arrays) mylist value 76 value 15 value 22 value 3 value 32 next next null next null next null next null null Durch die Liste iterieren? Woher weiss man, wann man beim letzten Element angekommen ist? Carina Fuss 28.3.2018 24
Linked Lists verkettete Listen Rekursive Implementierung von Methoden Idee: Eine Liste besteht immer aus einem Element und einer nachfolgenden Teil-Liste. Abbruchbedingung: keine nachfolgende Liste mehr vorhanden (letztes Element) Abbruchbedingung: arbeitet mit StringBuffer, da der String oft modifiziert werden muss u5a1.lists.tostring(mylist) rekursiver Aufruf mit restlicher Liste 76,15,22,3,34,null Carina Fuss 28.3.2018 25
Übung 5 Aufgabe 1 Methoden zur Verwendung von Listen (rekursiv implementieren!): add() size() sum() last() sublist() (Index fängt bei 0 an!) valueat() index() (Gesucht ist der Index des ersten Elements mit gegebenem Wert.) Carina Fuss 28.3.2018 26
Übung 5 Aufgabe 2 Methoden zur Veränderung von Listen: append() (Ein neues Element wird an das Ende einer Liste gehängt.) nicht rekursiv concat() (Eine Liste (Tail) wird an das Ende einer Liste (Head) gehängt.) nicht rekursiv insertat() (Füge ein Element/eine Liste an einem bestimmten Index ein 2 Mal implementieren! List.next Referenzen in sinnvoller Reihenfolge neu setzen.) rekursiv remove() (Entferne das Element an einem bestimmten Index.) rekursiv Methoden aus Lists verwenden! Carina Fuss 28.3.2018 27
Übung 5 Aufgabe 3 Methoden zum Sortieren von Listen insertsorted() (Füge ein Element in eine bereits (aufsteigend) sortierte Liste ein.) rekursiv sort() (Sortiere eine Liste aufsteigend.) Verwende insertsorted(). Carina Fuss 28.3.2018 28
Übung 5 Aufgabe 4 Stack mit verketteter Liste: push() (Erstes Element der Liste ist oberstes Element auf Stack.) pop() (Daran denken, die Referenzen auf next neu zu setzen.) peek() empty() size() Methoden aus Aufgabe 1 verwenden! Muss nicht kopiert werden, da er keine Kapazitätsgrenze hat, die er erreichen kann (wie der Stack aus Übung 4). Carina Fuss 28.3.2018 29
Fragen? Carina Fuss 28.3.2018 30