IT 2 – WS 2012/2013 – Übungsblatt 2 Abgabe: 26.10.2012 Die folgenden Beispiele beziehen sich auf ein Projekt Aufgabenverwaltung. In dem Projekt geht es um die Verwaltung und das Planen von Aufgaben, die bis zu ihrem Endtermin von unterschiedlichen Personen (z.B. in einer Firma) erledigt werden müssen. Zur Vereinfachung werden alle Arbeitstage durchnummeriert und durch ganze Zahlen dargestellt. Die Arbeitstage einer bestimmten Person werden dann durch eine Liste der entsprechenden Nummern angegeben. Der Aufwand für die Erledigung einer Aufgabe wird in ganzen Arbeitstagen angegeben. Der Endtermin ist durch die Nummer des entsprechenden Tages gegeben (an diesem Tag kann noch an der Fertigstellung der Aufgabe gearbeitet werden). Nur die in der Angabe als public definierten Methoden dürfen public und damit außerhalb des jeweiligen Pakets sichtbar sein. Beispiel 2.1 [Person.java, Aufgabe.java, Firma.java] a) Implementieren Sie die public Klasse aufgabenverwaltung.simulation.Person mit den folgenden Eigenschaften: • Es gibt einen Konstruktor public Person(String name, List<Integer> arbeitstage), der eine Person mit dem entsprechenden Namen und den angegebenen Arbeitstagen erzeugt. • Die Methode public String toString(), liefert den Namen der Person zurück. • Es gibt eine Methode public List<Integer> getArbeitstage(), die die Arbeitstage der Person zurückliefert. Die Methode soll nur eine Kopie der Arbeitstagsliste zurückliefern, sodass Veränderungen der zurückgelieferten Liste die Arbeitstage der Person nicht verändern. b) Implementieren Sie die public Klasse aufgabenverwaltung.simulation.Aufgabe mit den folgenden Eigenschaften: • Es gibt einen Konstruktor public Aufgabe(String name, List<Person> bearbeiter, int aufwand, int endtermin), der den Namen der Aufgabe angibt, weiters die Liste der Personen die immer gleichzeitig die Aufgabe bearbeiten müssen, sowie die Anzahl der notwendigen Arbeitstage (=Aufwand) und den Endtermin. • Die Methoden public String toString(), public List<Person> getBearbeiter(), public int getAufwand(), public int getEndtermin(), liefern jeweils den Namen, die Liste der Bearbeiter (als Kopie der Originalliste), den Aufwand und den Endtermin der Aufgabe zurück. -1- IT 2 – WS 2012/2013 – Übungsblatt 2 c) Implementieren Sie die public Klasse aufgabenverwaltung.simulation.Firma mit den folgenden Eigenschaften: • Es gibt einen Konstruktor public Firma(String name, List<Aufgabe> aufgaben, Map<Aufgabe,List<Aufgabe>> benoetigt), der den Namen der Firma angibt und die Liste der Aufgaben, die zu erledigen sind. Die Map benoetigt gibt für jede Aufgabe an, welche anderen Aufgaben abgeschlossen sein müssen, bevor diese Aufgabe begonnen werden kann. • Die Methoden public String toString(), public List<Aufgabe> getAufgaben(), liefern den Namen der Firma bzw. die Liste der Aufgaben (als Kopie) zurück. • Die Methode public List<Aufgabe> getBenoetigteAufgaben(Aufgabe eineAufgabe), liefert die Liste der Aufgaben (als Kopie) zurück, die vor Beginn der Aufgabe eineAufgabe beendet sein müssen. Beispiel 2.2 [Person.java, Aufgabe.java, Firma.java] a) Ergänzen Sie die Klasse Aufgabe um folgende Methoden: • Die Methode void setBenoetigteAufgaben(List<Aufgabe> benoetigteAufgaben), die angibt, welche Aufgaben beendet sein müssen, bevor diese Aufgabe begonnen werden kann. Beachten Sie, dass diese Methode nicht public ist. • Die Methode public List<Aufgabe> getBenoetigteAufgaben(), liefert die Liste der Aufgaben (als Kopie) zurück, die vor Beginn dieser Aufgabe beendet sein müssen. b) Verändern Sie den Konstruktor von Firma so, dass er für jede Aufgabe die Methode setBenoetigteAufgaben() mit der entsprechenden Liste der benötigten Aufgaben aufruft. Nach Aufruf des Konstruktors Firma soll für jede der beteiligten Aufgaben die Methode getBenoetigteAufgaben() (in Aufgabe) die korrekte Antwort liefern. c) Definieren Sie im Paket aufgabenverwaltung.simulation BearbeitungsException als Unterklasse von Exception. die public Klasse d) Ergänzen Sie die Klasse Aufgabe um folgende weitere Methoden: • Mit der Methode public void bearbeite(int tag) throws BearbeitungsException, wird die Bearbeitung einer Aufgabe an einem bestimmten Tag veranlasst. Die Methode wirft die BearbeitungsException, wenn die Bearbeitung nicht möglich ist: o die Bearbeitung der Aufgabe ist schon abgeschlossen, o der angegebene Tag liegt nach der Endtermin der Aufgabe, o einer der Bearbeiter der Aufgabe arbeitet an diesem Tag nicht oder bearbeitet an diesem Tag schon eine andere Aufgabe, o eine der benötigten Aufgaben wurde vor diesem Tag noch nicht abgeschlossen. Zur Implementierung dieser Methode können (und sollten) Sie in den beteiligten Klassen zusätzliche Attribute und Methoden definieren -2- IT 2 – WS 2012/2013 – Übungsblatt 2 Beispiel 2.3 Ergänzen Sie die Klasse Firma um die folgenden Methoden: • Die Methode public writeToFile(String filename) throws IOException, speichert alle Informationen zur Firma in das durch filename angegebene File. Falls das Speichern nicht möglich ist, soll eine IOException geworfen werden. • Die Methode public static Firma readFromFile(String filename) throws IOException, liest die Daten einer mittels writeToFile() gespeicherten Firma wieder ein und liefert die entsprechende Firma zurück. Wenn das Einlesen nicht möglich ist, soll eine IOException geworfen werden. (Beachten Sie, dass andere mögliche Exceptions, z.B. die ClassNotFoundException, innerhalb der Methode behandelt und evt. durch eine IOException ersetzt werden müssen.) -3- IT 2 – WS 2012/2013 – Übungsblatt 2 Beispiel 2.4 Legen Sie ein Paket routenplanung mit einer Klasse routenplanung.Routenplaner und einer Klasse routenplanung.Ort an. Die Orte werden von 0 beginnend durchnummeriert. Die Klasse Ort soll folgende Eigenschaften haben: • Es gibt einen Konstruktor Ort(double[]direkteEntfernung), der einen Ort anlegt. Das Array direkteEntfernung enthält für alle Orte die direkten Entfernungen zu diesen Orten, d.h. direkteEntfernung[ortsNr] ist die direkte Entfernung zum Ort ortsNr. • Es gibt eine Methode double getDirekteEntfernungZu(int ortsNr), die die direkte Entfernung vom befragten Ort zum Ort ortsNr zurückliefert. Beispiel 2.5 [Routenplaner.java] Die Klasse Routenplaner soll folgende Eigenschaften haben: • Es gibt einen Konstruktor Routenplaner(Ort[]ortsliste), das den Routenplaner für diese Liste von Orten anlegt. (Für die Klasse Ort siehe Beispiel 3.1.) • Es gibt eine Methode double getKuerzesteEntfernung(int start, int ziel), die die Länge des kürzesten Weges von start nach ziel über höchstens eine Zwischenstation zurückliefert. Beachten Sie, dass der Weg über eine Zwischenstation kürzer sein kann als der direkte Weg. Beispiel 2.6 Testen Sie die Klasse Routenplaner, indem Sie eine Klasse TestKlasse mit einer Methode testen() implementieren, die Orte und den Routenplaner erzeugt und die Methoden des Routenplaners testet. Z.B. könnten Sie folgende Strassen mit den entsprechenden Längen zwischen den Orten 0,1,2,3,4 vorsehen: 0-1 : 7 0-2 : 5 1-2 : 1 1-3 : 3 3-4 : 4 Wenn es keine direkte Verbindung zwischen zwei Orten gibt, könnten Sie die Entfernung auf Double.POSITIVE_INFINITY setzen. -4-