Slides

Informatik II
Übung 7
Gian Ulli
ug@student.ethz.ch
n.ethz.ch/~ug/
Folien z.T. von Gábor Sörös übernommen
Gian Ulli |
15.04.15
|
1
Aufgabe 6.1
Instanziiert werden können:
Nicht abstrakte Klassen (D, E, F)
A
B
E
C
D
F
Gian Ulli |
15.04.15
|
2
Aufgabe 6.1
Type casts
§  Statisch (implicit cast):
T t = obj;
Geht nur von Kinderklasse zu Elternklasse/-Interface
§ 
Dynamisch (explicit cast):
T t = (T) obj;
Geht, falls das tatsächliche Objekt an der Referenz obj
vom Typ T ist.
Gian Ulli |
15.04.15
|
3
Aufgabe 6.1 – Static Casting
C
A
B
D
F
c
a
b
d
f
=
=
=
=
=
A
new F();
c;
c;
c;
c;
Typ
Name
C
c
A
a
B
b
D
d
F
f
B
E
Wert
C
D
F
F
C
A
Gian Ulli |
15.04.15
|
4
Aufgabe 6.1 – Dynamic Casting
C
A
B
F
D
c
a
b
f
d
=
=
=
=
=
new
(A)
(B)
(F)
(D)
A
D();
D
B
c;
c;
c;
c;
Typ
Name
C
c
A
a
B
b
F
f
D
d
D
E
Wert
C
F
D
B
A
C
A
Gian Ulli |
15.04.15
|
5
Aufgabe 6.2
public interface IStack {
// ...
/**
* Checks if the stack is empty.
*
* @return true if the stack is empty, false otherwise
*/
public boolean empty();
}
Gian Ulli |
15.04.15
|
6
Aufgabe 6.2
public class ListStack implements IStack {
// ...
@Override
public boolean empty() {
return size == 0;
}
}
Gian Ulli |
15.04.15
|
7
Aufgabe 6.3
private GenericList insertSorted(GenericList list, Comparable value) {
if (list == null || value.smallerThan((Comparable) list.value))
return new GenericList(value, list);
list.next = insertSorted(list.next, value);
return list;
}
@Override
public GenericList sort(GenericList list) {
if (list == null)
return null;
return insertSorted(sort(list.next), (Comparable) list.value);
}
Gian Ulli |
15.04.15
|
8
Aufgabe 6.4
private boolean
Helfermethode
filter(Student student)
{
return student.getPoints() >=
(IFilter.criteria * IFilter.maxNumberofPoints / 100);
}
Gian Ulli |
15.04.15
|
9
Aufgabe 6.4
Beispiellösung – filterRaw
public ArrayList filterRaw(ArrayList groups) {
ArrayList result = new ArrayList();
for (int i = 0; i < groups.size(); i++) {
ArrayList group = (ArrayList) groups.get(i);
for (int j = 0; j < group.size(); j++) {
Student student = (Student) group.get(j);
if (filter(student))
result.add(student);
}
}
return result;
}
dynamic
cast
Gian Ulli |
15.04.15
| 10
Aufgabe 6.4
Beispiellösung – filterRaw
public ArrayList filterRaw(ArrayList groups)
ArrayList result = new ArrayList();
for (Object group : groups) {
{
for (Object student : (ArrayList) group) {
if (filter((Student) student))
result.add(student);
}
}
return result;
}
Gian Ulli |
15.04.15
| 11
Aufgabe 6.4
Beispiellösung – filterGeneric
public ArrayList filterRaw(ArrayList<ArrayList<Student>> groups)
ArrayList result = new ArrayList();
for (ArrayList<Student> group : groups) {
{
for (Student student : group) {
if (filter(student))
result.add(student);
}
}
return result;
}
Gian Ulli |
15.04.15
| 12
for-each Schleife
for-each loop
for (type var : arr) {
//body of loop
}
Equivalent for loop
=
for (type var : coll) {
//body of loop
=
}
for (int i = 0; i < arr.length; i++) {
type var = arr[i];
//body of loop
}
for (Iterator<type> iter =
coll.iterator(); iter.hasNext(); ) {
type var = iter.next();
//body of loop
}
leer!
Gian Ulli |
15.04.15
| 13
for-each Schleife
Obwohl die verbesserte for-Schleife den Code übersichtlicher macht,
kann sie nicht in jeder Situation benutzt werden.
§  Nur Zugriff. Elemente können nicht gesetzt werden, z.B. kann man
nicht jedes Element inkrementieren.
§  Nur eine Datenstruktur. Es ist nicht möglich, zwei Datenstrukturen
gleichzeitig zu durchlaufen.
§  Nur ein Element. Es kann nur auf ein Element gleichzeitig
zugegriffen werden.
§  Nur vorwärts. Man kann nur elementweise vorwärts durch die Liste
iterieren.
§  Mindestens Java 5. Man braucht mindestens Java 5 Kompatibilität.
Gian Ulli |
15.04.15
| 14
Aufgabe 7.1 – Tic-Tac-Toe
§  Überlegungen zu
Spielbäumen
§  Wie wird der Wert eines
Knotens aus den Werten der
Nachfolger berechnet?
(Achtung: Unterschied
zwischen euch und dem
Gegner)
Gian Ulli |
15.04.15
| 15
Erinnerung: Aufgabe 5.2
public static List remove(List list, int index)
throws IndexOutOfBoundsException {
if (list == null)
throw new IndexOutOfBoundsException();
if (index == 0)
return list.next;
list.next = remove(list.next, index - 1);
return list;
}
Gian Ulli |
15.04.15
| 16
Aufgabe 7.2
Binäre Bäume
§  Jeder Knoten enthält Zeiger auf:
§  Linker Nachfolger
§  Rechter Nachfolger
§  (Vater) ß in dieser Aufgabe nicht!
W
L
R
§  Rekursive Traversierung:
§  Pre-order: W-L-R
§  In-order: L-W-R
§  Post-order: L-R-W
Gian Ulli |
15.04.15
| 17
Aufgabe 7.2 – Warum nur Binäre Bäume?
Allgemeine Bäume können auch als Binärbaume representiert werden:
„The binary tree can be thought of as the original tree tilted sideways,
with the black left edges representing first child and the blue right edges
representing next sibling. ... This is called left-child-right-sibling binary
tree (LCRS tree)”
http://en.wikipedia.org/wiki/Binary_tree
Gian Ulli |
15.04.15
| 18
8
Aufgabe 7.2 – Binäre Suchbäume
10
3
§  Struktur:
1
§  Die Knoten enthalten Datenelemente,
oder Zeigers auf Datenelemente (record, thing)
4
§  Jeder Knoten hat auch ein Schlüsselattribut (key)
§  Die Menge der Schlüsselattribute ist total geordnet (a≤b)
§  Suchen erfolgt durch Schlüsselvergleich
14
6
7
13
§  Für jeden Knoten mit Schlüsselattribut s gilt:
§  Alle Schlüssel im linken Unterbaum sind kleiner als s
§  Alle Schlüssel im rechten Unterbaum sind grösser als s
§  Die Unterbäume sind auch binäre Suchbäume
§  Elementare Methoden in den Vorlesungsfolien!
Was passiert wenn
mehrere Objekte mit
dem selben Schlüssel
existieren?
Gian Ulli |
15.04.15
| 19
Aufgabe 7.2
Teilaufgabe a (von Hand)
Löschen, ersetzen durch kleinstes Element des rechten Teilbaums
Teilaufgabe b
Implementation eines binären Suchbaums
IBinarySearchTreeUtils<T>
UtilsFactory.create() soll ein Utils für den Typ String
erzeugen à new MyTreeUtils<String>()
UnlinkSmallestResult<T> enthält das Resultat aus
unlinkSmallest(): das kleinste Element und den Restbaum (also
ein Paar)
Gian Ulli |
15.04.15
| 20
Aufgabe 7.2
Zu implementierende Methoden:
§  height, isLeaf, hasOneChild
§  preOrder, inOrder, postOrder
§  insert
§  find
§  unlinkSmallest & remove
Gian Ulli |
15.04.15
| 21
Aufgabe 7.3 – Reversi
§  Mit dieser Aufgabe startet eine Serie, die zum Ziel hat, einen
Reversispieler zu implementieren.
§  Spielregeln und weitere Infos:
§  http://www.vs.inf.ethz.ch/edu/FS2015/I2/reversi
§  Login für reversi-papers:
§  Username: i2bib
§  Password: reversi
Gian Ulli |
15.04.15
| 22
Aufgabe 7.3 – Reversi
§  Reversi-Turnier am Ende des Semesters
§  Super Preise! (in den letzten Jahren)
§  Im Falle von Problemen mit dem Framework:
1.  Dokumentation
2.  Ich
3.  Leyna Sadamori (s. Reversi-Webseite)
Gian Ulli |
15.04.15
| 23
Aufgabe 7.3 – Reversi
§  Bibliothek auf Reversi-Webseite
§  Beachtet die Installationsanleitung (Eclipse >3.2)
§  Zuerst Framework mit HumanPlayer ausprobieren
§  Dann sollt ihr euren ersten eigenen Spieler programmieren.
§  Design-Trick:
§  Macht euch erst eine abstrakte Klasse (PlayerBase o.ä.)
§  Implementiert darin eure allgemein nützliche Helferfunktionen für
eure verschiedenen Player
Gian Ulli |
15.04.15
| 24
Aufgabe 7.3 – Designvorschlag
package reversi;
public interface ReversiPlayer
{
void initialize(int myColor, long timeLimit);
Coordinates nextMove(GameBoard gb);
}
package randoomTeam;
public abstract class PlayerBase implements ReversiPlayer
{
private int color = 0;
private long timeout = 0;
protected final int getColor() { return color; }
protected final long getTimout() { return timeout; }
protected final static ArrayList<Coordinates>
getAllPossibleMoves(GameBoard gb, Player p) { … }
}
package randoomTeam;
public class RandomPlayer extends PlayerBase {
public Coordinates nextMove(GameBoard gb) { … }
…
}
Gian Ulli |
15.04.15
| 25
Aufgabe 7.3 – RandomPlayer
§  Programmiert einen Computerspieler, der zufällig einen gültigen Zug
auswählt
§  1. mögliche Strategie
§  Zug wird erst zufällig gewählt
§  Dann wird überprüft, ob er gültig ist oder nicht
§  wenn ja à return
§  wenn nein à wieder von vorne
GameBoard.checkMove()
§  2. mögliche Strategie
§  In einem Array alle möglichen Züge markieren
§  Zufällig einen Zug aus diesem Array wählen
§  extrem viel effizienter
§  Standardansatz für später → Züge bewerten
Gian Ulli |
15.04.15
| 26