Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik LK · Haupttermin 2022

Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung LK · Haupttermin (2022)

Aufgabenstellung

Aufgabenstellung: Schulveranstaltungs-Buchung

An der Turing-Schule finden regelmäßig verschiedene Schulveranstaltungen statt (z. B. Schulmusical, Schultheater). Früher entstanden vor dem Einlass zu einer Veranstaltung zum Teil lange Warteschlangen.

Damit alle Beteiligten besser planen können, soll man die Sitzplätze für eine Veranstaltung künftig vorab reservieren können. Deshalb wollen die Schülerinnen und Schüler des Informatikprojektkurses ein Buchungssystem für diese Veranstaltungen entwickeln.

Bewährt hat sich, die Aula für jede Veranstaltung gesondert zu bestuhlen. Die Stühle stehen dabei stets in Sitzplatzreihen. Innerhalb einer Veranstaltung hat jede Sitzplatzreihe dieselbe Anzahl an Stühlen.

Für eine Veranstaltung darf eine Person auch mehrere Sitzplätze reservieren. Ist die Veranstaltung schon ausgebucht, kann sich eine Person auf die Warteliste eintragen lassen, bei mehreren Platzwünschen auch mehrfach. Die Telefonnummer einer Person wird ausschließlich gespeichert, um sie bei Absagen von Veranstaltungen schnell zu erreichen.

Das folgende Implementationsdiagramm zeigt einen ersten Modellierungsentwurf zur Verwaltung der Veranstaltungen. Die Klassendokumentationen stehen im Anhang.

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse Veranstaltungsverwaltung

Objekte der Klasse Veranstaltungsverwaltung verwalten Veranstaltungen.

Veranstaltungsverwaltung()

Ein Objekt der Klasse Veranstaltungsverwaltung wird initialisiert.

List<Veranstaltung> gibVeranstaltungen()

Eine Liste mit allen Veranstaltungen wird zurückgeliefert. Wenn keine Veranstaltung verwaltet wird, dann wird eine leere Liste zurückgegeben.

void fuegeHinzu(Veranstaltung pVeranstaltung)

Die im Parameter übergebene Veranstaltung wird hinzugefügt.

void reserviere(Veranstaltung pVeranstaltung, int pReihe, int pSitz, Person pPerson)

Für die Veranstaltung pVeranstaltung wird für den Platz (pReihe, pSitz) für die Person eine Reservierung vorgenommen. Falls für die entsprechende Veranstaltung an dem Platz bereits eine Reservierung vorliegt, dann wird diese überschrieben. Falls der Platz nicht existiert, pVeranstaltung null ist oder pPerson null ist, dann geschieht nichts.

void schreibeAufWarteliste(Veranstaltung pVeranstaltung, Person pPerson)

Das Personenobjekt pPerson wird an die Warteliste für die Veranstaltung pVeranstaltung angehängt. Falls pVeranstaltung null ist oder pPerson null ist, dann geschieht nichts.

Veranstaltung ermittleVeranstaltung(String pTermin, String pVeranstaltungsname)

Für den im Parameter übergebenen Termin und Veranstaltungsnamen wird das entsprechende Veranstaltungsobjekt zurückgeliefert. Falls es zu dem Termin keine Veranstaltung mit dem Namen gibt, wird null zurückgeliefert.

List<Veranstaltung> ermittleSortierte()

Die Methode soll eine neue Liste mit allen Veranstaltungsobjekten zurückliefern. Diese neue Liste soll nach der Anzahl der noch freien Plätze absteigend sortiert sein. Bei gleicher Anzahl der noch freien Plätze spielt die Reihenfolge dieser Veranstaltungen untereinander keine Rolle.

Die Klasse Veranstaltung

Objekte der Klasse Veranstaltung verwalten Termine, Veranstaltungsnamen und die Sitzplätze mit den entsprechenden Reservierungen der Personen.

Veranstaltung(String pTermin, String pVeranstaltungsname, int pAnzahlReihen, int pAnzahlPlaetzeProReihe)

Ein Objekt der Klasse Veranstaltung wird initialisiert mit dem Termin, dem Veranstaltungsnamen, der Anzahl der Sitzplatzreihen und der Anzahl der Plätze pro Reihe.

String gibTermin()

Der Termin der Veranstaltung wird zurückgeliefert.

String gibVeranstaltungsname()

Der Veranstaltungsname der Veranstaltung wird zurückgeliefert.

int gibAnzahlFreiePlaetze()

Die Anzahl der noch freien Plätze der Veranstaltung wird zurückgeliefert.

Person gibReservierung(int pReihe, int pSitz)

Das Personenobjekt mit einer Reservierung für den Platz (pReihe, pSitz) wird zurückgeliefert. Falls der Platz nicht reserviert ist, wird null zurückgeliefert.

void reserviere(int pReihe, int pSitz, Person pPerson)

Für die Veranstaltung wird für den Platz (pReihe, pSitz) für die Person eine Reservierung vorgenommen. Falls an dem Platz bereits eine Reservierung vorliegt, dann wird diese überschrieben. Falls der Platz nicht existiert oder pPerson null ist, dann geschieht nichts.

void loescheReservierung(int pReihe, int pSitz)

Für die Veranstaltung wird die Reservierung für den Platz (pReihe, pSitz) gelöscht. Falls der Platz nicht existiert, dann geschieht nichts.

void schreibeAufWarteliste(Person pPerson)

Das Personenobjekt pPerson wird an die Warteliste für die Veranstaltung angehängt. Falls pPerson null ist, dann geschieht nichts.

void macheEtwas(int pAnzahl)

Diese Methode ist Bestandteil der Teilaufgabe b).

Die Klasse Person

Objekte der Klasse Person verwalten einen Namen und eine Telefonnummer einer Person.

Person(String pName, String pTelefonnummer)

Ein Objekt der Klasse Person wird initialisiert mit dem Namen und der Telefonnummer.

String gibName()

Der Name der Person wird zurückgeliefert.

String gibTelefonnummer()

Die Telefonnummer der Person wird zurückgeliefert.

boolean istGleich(Person pPerson)

Wenn das Personenobjekt inhaltlich mit dem im Parameter übergebenen Personenobjekt pPerson gleich ist, dann wird true zurückgeliefert und sonst false. Für die Inhaltsgleichheit müssen die jeweiligen Namen und Telefonnummern übereinstimmen.

Die generische Klasse Queue

Objekte der generischen Klasse Queue (Warteschlange) verwalten beliebige Objekte vom Typ ContentType nach dem First-In-First-Out-Prinzip, d. h., das zuerst abgelegte Objekt wird als erstes wieder entnommen. Alle Methoden haben eine konstante Laufzeit, unabhängig von der Anzahl der verwalteten Objekte.

Queue()

Eine leere Schlange wird erzeugt. Objekte, die in dieser Schlange verwaltet werden, müssen vom Typ ContentType sein.

boolean isEmpty()

Die Anfrage liefert den Wert true, wenn die Schlange keine Objekte enthält, sonst liefert sie den Wert false.

void enqueue(ContentType pContent)

Das Objekt pContent wird an die Schlange angehängt. Falls pContent gleich null ist, bleibt die Schlange unverändert.

void dequeue()

Das erste Objekt wird aus der Schlange entfernt. Falls die Schlange leer ist, wird sie nicht verändert.

ContentType front()

Die Anfrage liefert das erste Objekt der Schlange. Die Schlange bleibt unverändert. Falls die Schlange leer ist, wird null zurückgegeben.

Die generische Klasse List

Objekte der generischen Klasse List verwalten beliebig viele, linear angeordnete Objekte vom Typ ContentType. Auf höchstens ein Listenobjekt, aktuelles Objekt genannt, kann jeweils zugegriffen werden. Wenn eine Liste leer ist, vollständig durchlaufen wurde oder das aktuelle Objekt am Ende der Liste gelöscht wurde, gibt es kein aktuelles Objekt. Das erste oder das letzte Objekt einer Liste kann durch einen Auftrag zum aktuellen Objekt gemacht werden. Außerdem kann das dem aktuellen Objekt folgende Listenobjekt zum neuen aktuellen Objekt werden. Das aktuelle Objekt kann gelesen, verändert oder gelöscht werden. Außerdem kann vor dem aktuellen Objekt ein Listenobjekt eingefügt werden.

List()

Eine leere Liste wird erzeugt.

boolean isEmpty()

Die Anfrage liefert den Wert true, wenn die Liste keine Objekte enthält, sonst liefert sie den Wert false.

boolean hasAccess()

Die Anfrage liefert den Wert true, wenn es ein aktuelles Objekt gibt, sonst liefert sie den Wert false.

void next()

Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses nicht das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in der Liste folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach Ausführung des Auftrags kein aktuelles Objekt, d. h., hasAccess() liefert den Wert false.

void toFirst()

Falls die Liste nicht leer ist, wird das erste Objekt der Liste aktuelles Objekt. Ist die Liste leer, geschieht nichts.

void toLast()

Falls die Liste nicht leer ist, wird das letzte Objekt der Liste aktuelles Objekt. Ist die Liste leer, geschieht nichts.

ContentType getContent()

Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das aktuelle Objekt zurückgegeben. Andernfalls (hasAccess() == false) gibt die Anfrage den Wert null zurück.

void setContent(ContentType pContent)

Falls es ein aktuelles Objekt gibt (hasAccess() == true) und pContent ungleich null ist, wird das aktuelle Objekt durch pContent ersetzt. Sonst bleibt die Liste unverändert.

void append(ContentType pContent)

Ein neues Objekt pContent wird am Ende der Liste eingefügt. Das aktuelle Objekt bleibt unverändert. Wenn die Liste leer ist, wird das Objekt pContent in die Liste eingefügt und es gibt weiterhin kein aktuelles Objekt (hasAccess() == false). Falls pContent gleich null ist, bleibt die Liste unverändert.

void insert(ContentType pContent)

Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird ein neues Objekt pContent vor dem aktuellen Objekt in die Liste eingefügt. Das aktuelle Objekt bleibt unverändert. Falls die Liste leer ist und es somit kein aktuelles Objekt gibt (hasAccess() == false), wird pContent in die Liste eingefügt und es gibt weiterhin kein aktuelles Objekt. Falls es kein aktuelles Objekt gibt (hasAccess() == false) und die Liste nicht leer ist oder pContent == null ist, bleibt die Liste unverändert.

void concat(List<ContentType> pList)

Die Liste pList wird an die Liste angehängt. Anschließend wird pList eine leere Liste. Das aktuelle Objekt bleibt unverändert. Falls es sich bei der Liste und pList um dasselbe Objekt handelt, pList == null oder eine leere Liste ist, bleibt die Liste unverändert.

void remove()

Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das aktuelle Objekt gelöscht und das Objekt hinter dem gelöschten Objekt wird zum aktuellen Objekt. Wird das Objekt, das am Ende der Liste steht, gelöscht, gibt es kein aktuelles Objekt mehr (hasAccess() == false). Wenn die Liste leer ist oder es kein aktuelles Objekt gibt (hasAccess() == false), bleibt die Liste unverändert.

Teilaufgabe a)

a.1

Beschreiben Sie, in welchen Beziehungen die Klassen der in Abbildung 2 dargestellten Teilmodellierung zueinander stehen.

[3 Punkte]

a.2

Begründen Sie unter Bezug auf den Sachkontext, weshalb sich eine Schlange (Queue) für die Umsetzung der Datensammlungen der Warteliste eignet.

[2 Punkte]

a.3

Begründen Sie unter Bezug auf den Sachkontext, weshalb es zweckmäßig ist, die Sitzplätze samt den zugehörigen Reservierungen der Personen als zweidimensionales Feld (Array) statt als dynamische Datenstruktur umzusetzen.

[2 Punkte]

Teilaufgabe d)

Nach Absprache mit der Schulleitung wollen die Schülerinnen und Schüler ihr Projekt ausbauen. Dabei sollen zusätzlich die folgenden Anforderungen realisiert werden:

i. Künftig soll die Schule für jede Veranstaltung einen einheitlichen Eintrittspreis je Sitzplatz festlegen können. Dieser Preis muss gespeichert werden. Außerdem sollen sowohl der Eintrittspreis als auch die anhand der Reservierungen berechnete Summe der Eintrittsgelder abfragbar sein.

ii. Pro Veranstaltung soll sich klären lassen, ob in einer bestimmten Sitzplatzreihe noch eine gewünschte Anzahl nebeneinander liegender Plätze frei ist. Ist das der Fall, soll die Nummer des ersten Sitzes dieser zusammenhängenden freien Plätze geliefert werden. Stehen in der gewählten Reihe nicht genügend nebeneinander liegende freie Plätze zur Verfügung, soll auch dies in passender Form zurückgemeldet werden.

iii. Jede Person soll die von ihr gebuchten Veranstaltungen ausgeben können.

d.1

Modellieren Sie die oben aufgeführten Anforderungen, indem Sie das Implementationsdiagramm aus Abbildung 2 erweitern.

[9 Punkte]

Hinweis: Klassen, Beziehungen, Methoden und Attribute aus Abbildung 2, die unverändert bleiben, brauchen nicht erneut aufgeführt zu werden. Laden Sie ein Foto Ihrer Diagrammerweiterung hoch oder beschreiben Sie die Änderungen an den Klassen genau.

d.2

Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm die zweite und die dritte Anforderung umsetzt.

[4 Punkte]

Aufgabenstellung: Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik LK · Haupttermin 2022

Lösung

Nach den offiziellen Korrekturhinweisen

a) Beschreiben Sie, in welchen Beziehungen die Klassen der in Abbildung 2 dargestellten Teilmodellierung zueinander stehen.

Lösung: Ein Objekt der Klasse Veranstaltungsverwaltung verwaltet im Attribut veranstaltungen seine Veranstaltungen in einer linearen Liste mit Objekten der Klasse Veranstaltung. Jedes Objekt der Klasse Veranstaltung verwaltet seine Sitzplätze in einem zweidimensionalen Array mit dem Bezeichner sitzplaetze, welches Objekte vom Typ Person verwaltet. Zusätzlich wird unter dem Bezeichner warteliste eine Schlange (Queue) mit Objekten vom Typ Person gespeichert.

a) Begründen Sie unter Bezug auf den Sachkontext, weshalb sich eine Schlange (Queue) für die Umsetzung der Datensammlungen der Warteliste eignet.

Lösung: Da vorab nicht bekannt ist, wie viele Personenobjekte in der Warteliste für eine Veranstaltung verwaltet werden müssen, ist es sinnvoll, eine dynamische Datenstruktur zu verwenden und nicht ein statisches Feld (Array). In diesem Anwendungsfall ist eine Schlange sinnvoll, da diese Datenstruktur die Verwaltung der Reihenfolge der Objekte durch das FIFO-Prinzip sicherstellt, ein faires Nachrücken nach Sitzplatzfreigabe garantiert und ein wahlfreier Zugriff auf jedes Objekt in der Warteliste nicht notwendig ist.

a) Begründen Sie unter Bezug auf den Sachkontext, weshalb es zweckmäßig ist, die Sitzplätze samt den zugehörigen Reservierungen der Personen als zweidimensionales Feld (Array) statt als dynamische Datenstruktur umzusetzen.

Lösung: Für eine Veranstaltung wird zunächst eine Bestuhlungsvorgabe (Sitzplatzreihen mit Sitzen) festgelegt, die sich grundsätzlich nicht verändern soll. Wenn alle Plätze reserviert sind, dann können sich Personen auf eine Warteliste setzen lassen. Der Zugriff auf ein Personenobjekt im zweidimensionalen Array über die Indizes lässt sich im Gegensatz zu einer dynamischen Datenstruktur effizienter umsetzen.

d) Modellieren Sie die oben aufgeführten Anforderungen, indem Sie das Implementationsdiagramm aus Abbildung 2 erweitern.

Lösung: Erweiterung der Klasse Veranstaltung: - Attribut: `-eintrittspreis: double` - Konstruktor: `+Veranstaltung(pTermin: String, pVeranstaltungsname: String, pAnzahlReihen: int, pAnzahlPlaetzeProReihe: int, pEintrittspreis: double)` - Methoden: - `+gibEintrittspreis(): double` - `+gibSummeEintrittsgelder(): double` - `+ermittleNebeneinanderLiegendePlaetze(pReihe: int, pAnzahl: int): int` Erweiterung der Klasse Person: - Assoziation auf `List<Veranstaltung>` mit Bezeichner `-meineVeranstaltungen` (Kardinalität bzw. Navigation von Person zur Liste) - Methoden: - `+fuegeHinzu(pVeranstaltung: Veranstaltung)` - `+loesche(pVeranstaltung: Veranstaltung)` - `+gibVeranstaltungen(): List<Veranstaltung>`

d) Spezifikation der neuen/geänderten Attribute und Methoden (Textuelle Ergänzung)

Lösung: Klasse Veranstaltung: -eintrittspreis: double +Veranstaltung(..., pEintrittspreis: double) +gibEintrittspreis(): double +gibSummeEintrittsgelder(): double +ermittleNebeneinanderLiegendePlaetze(pReihe: int, pAnzahl: int): int Klasse Person: -meineVeranstaltungen: List<Veranstaltung> +fuegeHinzu(pVeranstaltung: Veranstaltung) +loesche(pVeranstaltung: Veranstaltung) +gibVeranstaltungen(): List<Veranstaltung>

d) Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm die zweite und die dritte Anforderung umsetzt.

Lösung: Realisierung der zweiten Anforderung: Die Methode ermittleNebeneinanderLiegendePlaetze in der Klasse Veranstaltung bekommt die Nummer einer Sitzplatzreihe und die gewünschte Anzahl der nebeneinanderliegenden Plätze übergeben. Die Methode liefert einen Integerwert zurück, der die Nummer des ersten freien Sitzes der nebeneinanderliegenden Plätze in der gewünschten Reihe angibt. Falls keine nebeneinanderliegenden Plätze in der gewünschten Anzahl in der Reihe vorhanden sind, wird -1 zurückgegeben. Realisierung der dritten Anforderung: Ein Objekt der Klasse Person verwaltet eine Liste mit Veranstaltungsobjekten. Über die Methode fuegeHinzu kann eine Veranstaltung der genannten Liste hinzugefügt und über die Methode loesche aus ihr gelöscht werden. Die Methode gibVeranstaltungen der Klasse Person liefert alle Veranstaltungen für dieses Personenobjekt als Liste zurück.

Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium

Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.

‹ Aufgabe 2 - Modellierung · GK · Nachtermin 2022 · Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin 2022 ›

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen