Matrikelnummer: Punkte: Testklausur 2 zur Vorlesung Modellierung und Programmierung I Dr. Monika Meiler Zeit: 60 Minuten Bemerkungen: Jedes Blatt ist mit der Matrikelnummer zu versehen. Jede Aufgabe ist auf dem vorgesehenen Blatt zu lösen. Reicht der dortige Platz nicht aus, so verwenden Sie ein mit der Matrikelnummer versehenes zusätzliches Blatt. Es sind außer Papier und Schreibzeug keine weiteren Hilfsmittel erlaubt (keine Taschenrechner, keine Unterlagen, . . . ). Es ist leserlich und nicht mit Bleistift zu schreiben. Beantworten Sie Fragen pro Pfeil „“ mit genau einem Sachverhalt. Schalten Sie Ihr Handy aus! Punkte 0 25 35 45 55 Note 5 4 3 2 1 Seite 1 von 8 Einige Methoden: Klasse java.util.Vector<E> Name add get size Parameteranzahl 1 1 0 Parametertyp E int ErgebnisTyp boolean E int Beschreibung fügt Objekt am Ende ein liefert Objekt an Position liefert Anzahl der Objekte Klasse java.util.Observable Name notifyObservers setChanged Parameter- Parameter- ErgebnisBeschreibung anzahl typ typ 0 teilt registrierten Observern Änderungen mit 0 Setzt Änderungsflag Interface java.util.Observer Name ParameterParameterErgebnisBeschreibung anzahl typ typ update 2 Observable, wird aufgerufen, wenn ein Objekt der überwachten Object Klasse geändert wurde Die folgende Klassenhierarchie zur Verwaltung von Prüfungen soll für eine Internatsschule benutzt werden. Matrikelnummer: Punkte: Klausuraufgabe 1. (20 Punkte) Implementieren Sie zu dem obigen Klassendiagramm: (a) Geben Sie, ausgehend von dem folgenden Konstruktor der Klasse Person, den Konstruktor der Klasse Schueler an. 3P Person.java public Person( String vorName, String nachName) { this.vorName = vorName; this.nachName = nachName; } Schueler.java public Schueler( String vorName, String nachName, int matrikel) { } (b) Gegeben seien die folgenden toString-Methoden: 2P Person.java public String toString() { return vorName + " " + nachName; } Dozent.java public String toString() { return titel + " " + super.toString(); } Pruefung.java public String toString() { return dozent.toString() + ": " + thema + "(" + leistungsPunkte + ") Note " + note; } Welcher String wird für eine Prüfung des Prof. Severus Snape zum Thema Zaubertränke mit 5 Leistungspunkten und einer Prüfungsnote 3 zurückgegeben (Verwenden Sie das Zeichen ⌴ als Leerzeichen)? Seite 3 von 8 (c) Überschreiben Sie die toString-Methode der Klassen Schueler so, dass für jeden Schüler ein String mit dem vollständigen Namen, Matrikelnummer und allen seinen Prüfungsergebnissen erzeugt wird1. 5P Schueler.java public String toString() { } (d) Schreiben Sie ein Testprogramm main mit dem folgenden Inhalt: 10P Harry Potter (Matrikelnummer: 4334) hat die Prüfung Verteidigung gegen dunkle Künste (10 Leistungspunkte) beim Dozenten Prof. Quirin Quirrell mit der Note 2 erfolgreich abgeschlossen. Initialisieren Sie die notwendigen Objekte der entsprechenden Klassen und geben Sie auf der Konsole Harrys Prüfungsstand aus. Schueler.java public static void main( String[] args) { } 1 Einige Methoden der Klasse Vector finden Sie auf der 2. Seite. Matrikelnummer: Klausuraufgabe 2. Punkte: (20 Punkte) Im Verlauf des Schuljahres werden bei besonderen Leistungen oder bei Verstößen gegen die Schulordnung Punkte für jeden Schüler vergeben bzw. abgezogen. Ein Attribut punkte in der Klasse Schueler speichert den Punktestand. Eine Methode addPunkte in der Klasse Schueler aktualisiert diesen. Vervollständigen Sie die folgenden vier Methoden: (a) Für Prüfungen gibt es Punkte. Diese werden in Abhängigkeit von der Prüfungsnote bestimmt. 4P Pruefung.java private int berechnePunkte() { return 3 * leistungsPunkte - note * leistungsPunkte; } Wie viele Punkte erreicht Harry Porter nach dem Abschluss folgender Prüfungen: Rolanda Hooch: Besenflug 5 Leistungspunkte Note 1 Prof. Quirin Quirrell: Verteidigung gegen dunkle Künste 10 Leistungspunkte Note 2 Prof. Severus Snape: Zaubertränke 5 Leistungspunkte Note 3 (b) Implementieren Sie die Methode addPunkte: 4P In dieser Methode sollen erreichte Punkte zu den bereits vorhandenen addiert werden. Schueler.java public void addPunkte( int punkte) { } Seite 5 von 8 (c) Vervollständigen Sie den javadoc-Kommentar der Methode setNote: Erläutern Sie die Funktionalität der Methode und geben Sie die Parameter und den Rückgabewert in entsprechender Form an. 4P Pruefung.java /** * * * * * * * * * * * * * * * */ public int setNote( int note) { this.note = note; return berechnePunkte(); } (d) Implementieren Sie die Methode neuePruefung: 8P Die Methode neuePruefung der Klasse Schueler soll mit jeder bestandenen Prüfung (Note besser als 5) eines Schülers seine erreichte Note in die Prüfung eintragen, die Prüfung in seine Prüfungsliste aufnehmen und seinen Punktestand aktualisieren. Schueler.java public void neuePruefung( Pruefung pruefung, int note ) { } Matrikelnummer: Punkte: Klausuraufgabe 3. (20 Punkte) Jeder Schüler erhält Punkte. Eine Internatsschule besteht aus mehreren Häusern. Jedes Schulhaus registriert die Summe aller Punkte der dort wohnenden Schüler als Hauspunkte. Die Schulhäuser stehen ständig im Wettbewerb. Am Schuljahresende ist das Haus mit den meisten Punkten der Sieger. Erweitern Sie die UML-Klassenhierarchie: (a) Modellieren Sie als UML-Klassenhierarchie Internatsschule, bestehend aus mehreren Häusern. (ohne Funktionalitäten) eine 10P ⇨ Eine Schule verfügt über einen Schulnamen, einen Schuldirektor, einen Stellvertreter, eine Lehrerschaft und mehreren miteinander konkurrierende Schulhäuser, geordnet nach den Hauspunkten. ⇨ Jedes Schulhaus besitzt einen Hausnamen, einen Hauslehrer, Schüler und Hauspunkte (Summe aller Punkte der dort wohnenden Schüler). ⇨ Schuldirektor, Stellvertreter und Lehrerschaft sind in der Schule als Dozenten tätig. Erweitern Sie das hier etwas vereinfachte UML-Diagramm um die neuen Klassen. Achten Sie dabei auf kleine, übersichtliche Klassen und Wiederverwendbarkeit dieser bei ähnlichen Problemen. Geben Sie die Instanzvariablen, Datentypen und Beziehungen der verwendeten Klassen an. Seite 7 von 8 (b) Jede Punktänderung eines Schülers soll automatisch sowohl die Hauspunkte als auch die Ordnung zwischen den Häusern der Internatsschule aktualisieren. Wie würden Sie einen Überwachungsmechanismus2 aufbauen, der diese Aufgabe erfüllt: 10P Java stellt für solche Überwachungsmechanismen zwei spezielle Klassen Observer und Observable zur Verfügung. Welche Aufgaben übernehmen diese? Geben Sie im konkreten Fall an, wer von wem überwacht werden soll. Geben Sie für die überwachenden und für die zu überwachenden Klassen der Internatsschule jeweils die Kopfzeilen Ihrer Klassendefinition an. In welchen der Klassen ist eine update-Methode zu implementieren? In welchen Methoden welcher Klassen ist die Änderung von Daten anzuzeigen (setChanged, notifyObservers)? 2 Einige Hinweise finden Sie auf der 2. Seite.