Informatik II Übung 7 Gian Ulli [email protected] 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
© Copyright 2024