TECHNISCHE UNIVERSITÄT DRESDEN Fakultät Informatik Institut für Softwareund Multimediatechnik Lehrgebiet Softwaretechnologie Prof. Dr. rer . nat . habil. Heinrich Technische Hußmann Tel.: (+49 )351/463-38464 Fax .: (+49)351/463-38459 Universität Dresden * 01062 Dresden e-mail: [email protected] Dresden, den 04.02.2003 Leistungskontrolle "Softwaretechnologie" (Gruppe A) Name: Vorname: Immatrikulationsnummer: Aufgabe 1 Maximale Punktanzahl 21 2 24 3 45 Gesamt Erreichte Punktanzahl 90 Zum Bestehen der Leistungskontrolle müssen mindestens 40 Punkte (entspricht 45%) erreicht werden. Hinweise: ¾ Die Klammerung der Aufgabenblätter darf nicht entfernt werden. ¾ Tragen Sie bitte die Lösungen auf den Aufgabenblättern ein! ¾ Verwenden Sie keine roten Stifte! ¾ Es ist kein eigenes Papier zu verwenden! Bei Bedarf ist zusätzliches Papier bei der Aufsicht erhältlich. Bitte jedes zusätzliche Blatt mit Name, Vorname und Immatrikulationsnummer beschriften. ¾ Es sind alle Aufgabenblätter abzugeben! ¾ Ergänzen Sie das Deckblatt mit Name, Vorname und Immatrikulationsnummer! ¾ Halten Sie Ihren Studentenausweis und einen Lichtbildausweis zur Identitätsprüfung bereit. ¾ Achtung! Das Zeichen # am linken Seitenrand heißt : Java-Text ist einzufügen! Aufgabe l: Universität Eine Universität besteht aus Fakultäten, die durch einen Namen und eine laufende Nummer bezeichnet sind. Jede Fakultät besteht aus Instituten, zu denen je ein Name und ein Buchstabencode festgelegt ist. Für jeden Professor ist sein Name und sein Ernennungsdatum bekannt. Jeder Professor gehört zu einem Institut. Ein Institut kann mehrere Professoren haben. Jedes Institut hat einen Professor zum Direktor. Jede Fakultät hat einen Professor zum Dekan. Die Fakultät bietet Lehrveranstaltungen an, die durch einen Veranstaltungstitel eine Studentenzahl und die vorgesehenen Semesterwochenstundenzahl beschrieben sind und jeweils einem Professor zugeordnet sind. Vorlesungen sowie Übungen sind Lehrveranstaltungen. Jede Übung ist einer Vorlesung zugeordnet. Für jeden Professor kann die Gesamtzahl der von ihm betreuten Semesterwochenstunden bestimmt werden. Entwickeln Sie aus der Anwendungsbeschreibung ein statisches Analysemodell Notation für UML-Klassendiagramme! Achten Sie dabei insbesondere auf: • • • • • • Klassen Operationen und Attribute in Klassen Vererbung Aggregationen Assoziationen mit deren Benennung und Angabe der Leserichtung oder mit Assoziationsenden Multiplizitäten in der Aufgabe 2: Bankautomat Nachfolgend wird das dynamische Verhalten eines Bankautomaten beschrieben: Nach seiner Inbetriebnahme ist der Bankautomat im Grundzustand. Er wartet auf Benutzung. Wird eine Karte eingeführt, prüft er diese auf ihre Gültigkeit. Ist sie ungültig, wird der Grundzustand wieder eingenommen. Ist die Karte gültig, wartet der Automat auf den Geheimcode. Bei ungültigem Geheimcode wird der Grundzustand wieder eingenommen. Ist der Code gültig, bietet der Automat die Auswahl von Dienstleistungen (Kontoanzeige, Auszahlung) an. Bei Auswahl der Kontoanzeige wird der Kontostand angezeigt. Nach Ende der Anzeige (durch Knopfdruck) befindet sich der Automat wieder im Zustand der Auswahl der Dienstleistungen. Wird als Dienstleistung die Auszahlung gewählt, besteht die Möglichkeit, einen Auszahlungsbetrag zu wählen. Nach dieser Angabe prüft der Automat das Konto, ob der geforderte Betrag zur Verfügung steht. Ist dies nicht der Fall, wird der Vorgang abgebrochen und der Automat geht in den Grundzustand. Verfügt das Konto über den geforderten Betrag, geht der Automat nach der Auszahlung in den Grundzustand. Es ist möglich, jeden Vorgang in jedem möglichen Zustand abzubrechen. Ein Abbruch führt in den Grundzustand. Leiten Sie aus dem beschriebenen Verhalten des Bankautomaten ein Zustandsmodell ab! Stellen Sie dieses Modell in einem Zustandsdiagramm (der Analysephase) als Protokollmaschine dar! Aufgabe 3: Geordnete Mengen und Warteschlangen (45 Punkte) Gegeben ist das folgende Analysemodell einer Warteschlange (Queue): Eine Warteschlange (Queue) besteht aus einer geordneten Reihenfolge von Objekten (Object). Objekte werden nach dem FIFO-Prinzip („first-in, first out“) in eine Warteschlange • als letztes Element aufgenommen (add()) und • als erstes Element entfernt (remove()). • front() stellt das erste Element der Warteschlange bereit. • isEmpty() testet, ob die Warteschlange leer ist. • size() ermittelt die Anzahl der Objekte in der Warteschlange. Auf der folgenden Seite ist ein Entwurfsmodell sowohl für die Implementation einer Warteschlange als auch für die dafür benötigten Datenstrukturen gegeben. Es können zwei Arten von Warteschlangen erzeugt werden: 1. Warteschlangen ohne duplizierte Objekte (d.h., ein Objekt kann sich nur genau einmal in der Warteschlange „anstellen“ Æ withDuplicates = false) 2. Warteschlangen mit duplizierten Objekten (d.h., ein Objekt kann sich mehrfach in der Warteschlange „anstellen“ Æ withDuplicates = true) Dementsprechend wird zur Implementation entweder • eine Liste ohne duplizierte Objekte („geordnete Menge“ Æ OrderedSet, nicht im Java2-Collection-Framework enthalten, erbt von java.util.List und java.util.Set ) oder • eine „herkömmliche“ Liste (hier java.util.LinkedList) benutzt. ______________________________________________________________ Lösen Sie folgende Aufgaben: a) Warum wird für eine Implementation einer Warteschlange mit duplizierten Objekten java.util.LinkedList statt java.util.ArrayList verwendet? _____________________________________________________________________ _____________________________________________________________________ b) Um die Warteschlange entsprechend dem gegebenen Modell zu implementieren, brauchen Sie (wie zuvor erklärt) eine geordnete Menge. Da im Java2-CollectionFramework eine solche Datenstruktur nicht verfügbar ist, müssen Sie diese zunächst selbst implementieren (Klasse OrderedSetImpl). Vervollständigen Sie die Implementierung von OrderedSetImpl! import java.util.*; # public class OrderedSetImpl { public OrderedSetImpl() { super(); } public OrderedSetImpl(int initialCapacity) { super(initialCapacity); } public boolean add(Object obj) { if(obj==null){ throw new NullPointerException(); } int previousIndex = indexOf(obj); if (previousIndex!=-1) return false; else{ super.add(obj); return true; } } public boolean addAll(Collection collection) { throw new UnsupportedOperationException(); } public boolean addAll(int i, Collection collection) { throw new UnsupportedOperationException(); } public Object set(int i, Object obj) { /* * Ersetzt das Element an Position i genau dann durch das Element * obj, falls in dieser geordneten Menge nicht bereits das * gleiche Element enthalten ist. Der Wert null ist für obj nicht * zulässig und führt zu einer Exception. * Gibt das Element zurück, das zuvor an Position i war oder * null, falls obj zuvor bereits enthalten war */ # } public void add(int i, Object obj) { ** * Fügt ein Element obj genau dann an Position i ein, falls in * dieser geordneten Menge nicht bereits das gleiche Element * enthalten ist. Der Wert null ist für obj nicht zulässig und * führt zu einer Exception. */ # } } c) Jetzt können Sie mit Hilfe der Datenstruktur „geordnete Menge“ eine Warteschlange implementieren. Vervollständigen Sie nun die Implementierung der Klasse QueueImpl! import java.util.*; # public class QueueImpl { private List myObjects; public QueueImpl(boolean withDuplicates){ # } public boolean add(Object o){ //Rückgabe analog der Methode add(Object o) von java.util.Set # } public Object remove(){ //Rückgabe analog der Methode remove(int index) von java.util.List # } public Object front(){ # } public boolean isEmpty(){ # } public int size(){ # } public String toString(){ return myObjects.toString(); } } d) Welche (drei) Entwurfmuster erkennen Sie im Entwurfsmodell? Zeichnen Sie diese in das Klassendiagramm ein! e) Welche Ausgabe erzeugt die im folgenden angegebene Methode main()? public static void main(String args[]){ myQueue = new QueueImpl(false); myQueue.add("Frank"); myQueue.add("Susi"); myQueue.remove(); myQueue.add("Susi"); myQueue.remove(); myQueue.add("Anne"); System.out.println(myQueue); } Ausgabe auf der Konsole: [ ]