IT 2 – WS 2015/2016 – Übungsblatt 3 Abgabe: 20.11.2015 Beispiel 3.1 [Swap.java] Implementieren Sie die Klasse ue41.Swap mit der statischen Methode static void arrange(SwapList list ), die die Elemente von list so umordnet, dass alle Elemente mit einer gewissen Eigenschaft vor den Elementen ohne dieser Eigenschaft angeordnet sind. Die vordefinierte Klasse ue41.SwapList beschreibt eine Liste von Elementen mit einer Boole’schen Eigenschaft. Auf eine SwapList können folgenden Methoden angewandt werden: public class SwapList { /** * Returns the number of elements in the list. * The smallest index in the list is 0. */ public int size(); /** Swaps the i-th and j-th element. */ public void swap(int i, int j); /** Returns true if the i-th Element has the property. */ public boolean hasProperty(int i); } Um Ihre Methode arrange() zu testen, wird es notwendig sein, auch die Klasse SwapList zu implementieren. Beispiel 3.2 [freiwillig: Routenplaner.java] Gegeben ist die Klasse Ort im Paket routenplanung. Die Orte sind von 0 beginnend durchnummeriert. Die Methode double getDirekteEntfernungZu(Ort andererOrt) in der Klasse Ort liefert die direkte Entfernung vom befragten Ort zum Ort andererOrt. Schreiben Sie eine Klasse routenplanung.Routenplaner mit folgenden Eigenschaften: • Es gibt einen Konstruktor Routenplaner(Ort[]ortsliste), der den Routenplaner für diese Liste von Orten anlegt. • Es gibt eine Methode double getKuerzesteEntfernung(Ort start, Ort ziel), die die Länge des kürzesten Weges von start nach ziel über höchstens einen Ort als Zwischenstation zurückliefert. Beachten Sie, dass der Weg über eine Zwischenstation kürzer sein kann als der direkte Weg. -1- IT 2 – WS 2015/2016 – Übungsblatt 3 Beispiel 3.3 Gegeben sind die Klassen Webseite und Suchmaschine. Die Klasse Suchmaschine verfügt über den Konstruktor public Suchmaschine(ArrayList<Webseite> dieWebseiten) sowie über die Methode public ArrayList<Webseite> finde(String wort), die eine Liste von allen (durch den Konstruktor bekannten) Webseiten zurückgibt, die wort enthalten. Schreiben Sie eine Klasse ErweiterteSuchmaschine, die von Suchmaschine erbt und das folgende Interface ErweiterteSuche implementiert: interface ErweiterteSuche { /** * Gibt eine Liste von allen Webseiten zurück, * die posWort enthalten und negWort nicht enthalten. */ public ArrayList<Webseite> findeMitOhne(String posWort, String negWort); } Die Klasse ErweiterteSuchmaschine soll auch über den Konstruktor public ErweiterteSuchmaschine(ArrayList<Webseite> dieWebseiten) verfügen. Beispiel 3.4 Gegeben ist eine Klasse Ort mit der Methode double getDistanzZu(Ort andererOrt), die die Distanz zu dem anderen Ort zurückliefert. Weiters ist die Unterklasse Tankstelle der Klasse Ort gegeben. Schreiben Sie eine Klasse LKW mit dem Konstruktor LKW(double reichweite), dem die Reichweite des LKWs bei vollem Tank übergeben wird. Die Klasse LKW soll weiters die Methode ArrayList<Tankstelle> berechneTankstops(Ort[] route) enthalten, die berechnet, an welchen Orten der angegebenen Route der LKW aufgetankt werden muss, um sein Ziel zu erreichen. Die Auswahl der Tankstops soll so erfolgen, dass ihre Anzahl möglichst gering ist. Sie können annehmen, dass die Route aus zumindest zwei Orten besteht, und dass die Fahrt des LKWs voll getankt im Ort route[0] beginnt. Natürlich kann der LKW nur an Orten betankt werden, die Tankstellen sind. Dies kann z.B. mittels (route[i] instanceof Tankstelle) überprüft werden. Liegen die Tankstellen soweit auseinander, dass der LKW die Route nicht abfahren kann, dann soll die Methode null zurückliefern. -2- IT 2 – WS 2015/2016 – Übungsblatt 3 Beispiel 3.5 [Hanoi.java] In dieser Aufgabe soll der Lösungsweg für das Problem der „Türme von Hanoi“ berechnet werden. Dieses Problem besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden können, welche alle unterschiedlich groß sind (siehe Abb. unten). Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der größten Scheibe unten und der kleinsten oben. Ziel des Spiels ist es, den kompletten Scheiben-Stapel von A nach C zu versetzen. Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe. Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Stab der Größe nach geordnet. Implementieren Sie die Klasse ue51.Hanoi mit der statischen Methode public static ArrayList<String> getHanoiSequence(int n), die den Lösungsweg für ein Problem der Größe n (=Anzahl der Scheiben auf Stab A) berechnet und die notwendigen Bewegungen der Scheiben (in der richtigen Reihenfolge) als ArrayList ausgibt. Dabei werden die Bewegungen durch folgende Strings bezeichnet: "AB" … lege die oberste Scheibe von A auf B "AC" … lege die oberste Scheibe von A auf C "BA" … lege die oberste Scheibe von B auf A usw. Stab A Stab B Abb. „Türme von Hanoi“ -3- Stab C IT 2 – WS 2015/2016 – Übungsblatt 3 Beispiel 3.6 [* LoeseFormel.java] Gegeben ist folgendes Java Interface: interface Formula { int length(); boolean evaluate(boolean[] v); } Dabei gibt length() die Länge der Arrays an, die an evaluate() übergeben werden können. Schreiben Sie die Klasse LoeseFormel mit einem parameterlosen Konstruktor und der Methode public boolean[] findSolution(Formula f), die ein boolean-Array solution der Länge f.length() zurückliefert, sodass f.evaluate(solution) den Wert true ergibt. Existiert ein solches Array solution nicht, soll null zurückgeliefert werden. Hinweis: Es müssen alle möglichen Inhalte des boolean-Arrays ausprobiert werden, bis ein passender gefunden ist. -4-