Informatik II Übung 5 Florian Scheidegger florsche@student.ethz.ch Folien mit freundlicher Genehmigung adaptiert von Gábor Sörös und Simon Mayer gabor.soros@inf.ethz.ch, simon.mayer@inf.ethz.ch 27.03.2013 Informatik II 1
Ablauf Nachbesprechung Übung 4 Stack (Implementierung mit Array) Ackermannfunktion Java-Bytecode Übungsbezogene Themen: Call by Value vs Call by Reference Verkettete Listen Stack (Implementierung mit verketteter Liste) Informatik II
Nachtrag: Testat Insgesamt mindestens 75% der Aufgaben bearbeitet Und mindestens 50% der Punkte erreicht Gesamtpunktzahl ist die Summe von Übung 1 bis 11 Übung 12 wird als Bonus gewertet
L4.A2 Ackermann-Funktion Rekursive Definition der Ackermann Funktion 28.03.2012 4
more Java insights 5
Datentypen Primitive Typen z.b. byte, int, float, char Referenz-Typen z.b. Arrays, Strings, Klassen Bsp: String s = new String(); Bsp: Date d = new Date(); s und d sind Referenzen auf Instanzen der Klasse String respektive Date. 6
Call-by-... 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 7
Call by value vs. Call by reference In C++ beide sind möglich Call by value: Daten werden kopiert und übergeben //C++ void swap(a, b); Call by reference: Referenz auf die Daten wird übergeben Java ist IMMER call by value! Das heisst, dass auch die bei Übergabe von einem Referenz-Typ wird der Adressenwert in eine lokale Variable kopiert! Die Referenz zeigt jedoch noch aufs gleiche Objekt, wodurch natütlich dieses bearbeitet wird. //C++ Bei Übergabe von einem Primitiven Typ wird der Wert in eine lokale Variable kopiert void swap(&a, &b); 8
Call by value vs. Call by reference // Situation in main() Point mypoint = new Point(3,4); mypoint int x; int y; // Aufruf von dosomething(...) dosomething(point methodpoint) mypoint methodpoint int x; int y;
Call by value vs. Call by reference in Java Was heisst das für uns? Ist das Modifizieren von übergebenen Werten möglich? Wie / Warum nicht? Ist das Vertauschen von übergebenen Werten möglich? Wie / Warum nicht? 10
Call by value vs. Call by reference in Java Modifizieren ist möglich, Vertauschen aber nicht! Methode: Public static void swap(point arg1, Point arg2) mypoint1 mypoint2 main(...) int x1; int y1; int x2; int y2; Hauptprogramm ruft irgendwo swap(mypoint1,mypoint2) mypoint1 arg1 mypoint2 arg2 int x1; int y1; int x2; int y2; Nach swap(...) mypoint1 arg2 mypoint2 arg1 int x1; int y1; int x2; int y2; Gute Referenz:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 11
Allocation of primitives and objects 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 12
Allocation of primitives and objects 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 13
Hinweise zu U05 14
Ü5 Listen Die gesamte Übungsserie 5 betrachtet das Konzept von rekursiv definierten Listen Umgehen mit Referenzen ('Pointer') Klasse list.list (als rekursive Definition) Entweder die Leere Liste oder eine Verkettung einer Ganzzahl und einer Liste Funktionale Definition: List := null int List hier: null ist die Leere Liste null ist als Parameter immer zu erwarten! 15
Ü5 Verkettete Listen Verkettete Liste Dynamische Datenstruktur Singly-linked, Doubly-linked,... Felder einer (nicht-leeren) Liste Wertefeld + Referenz(en) Für eine einfach verkettete Liste: Wert + Zeiger auf das nächste Element der Liste Das nächste Element ist wiederum eine Liste Felder der Leeren Liste (null) zu betrachten als: Wert: (nicht vorhanden: Zugriff wirft Exception) Next: null 16
Ü5.A1/A2/A3 Statische, rekursive Methoden vervollständigen Es sollen keine neuen Listen erzeugt, sondern die übergebenen Listen verändert werden alles Rekursiv lösen, ohne Schleifen! Test-Cases zum Überprüfen der Implementation 17
Ü5.A1/A2/A3 public static String tostring(list list) List add(list list, int value) Aufgabe 1 int size(list list) int sum(list list) List sublist(list list, int index) throws... List last(list list) int valueat(list list, int index) throws... int index(list list, int value) throws... void append(list list, int value) throws... Aufgabe 2 void concat(list head, List tail) throws... void insertat(list list, int i, int value) throws... void insertat(list list, int i, List nl) throws... List remove(list list, int index) throws... List insertsorted(list list, int value) throws Aufgabe... 3 List sort(list list) throws... 18
Ü5.A1 tostring(list list) public static String tostring(list list) { if (list == null) return "null"; } return list.value + "," + tostring(list.next); mylist value value value value value 76 15 22 3 32 next next next next next 76,15,22,3,34,null u5a1.lists.tostring(mylist) 19
Ü5.A4 Stack mit List implementieren Liste (Implementierung) ist von aussen unsichtbar Alle Stack-Operationen können direkt in Operationen auf Listen übersetzt werden Leere Liste: der einzige Spezialfall, der von der Klasse Stack selber beachtet werden muss! 20
viel Spass! 21