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

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

Aufgabenstellung

Aufgabenstellung: Buchungssystem für Schulveranstaltungen

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, sollen Sitzplätze für eine Veranstaltung künftig vorab reservierbar sein. Deshalb wollen die Schülerinnen und Schüler des Informatikprojektkurses ein Buchungssystem für diese Veranstaltungen entwickeln.

Die Aula wird bewährterweise für jede Veranstaltung eigens bestuhlt. Die Stühle stehen dabei stets in Sitzplatzreihen, und innerhalb einer Veranstaltung hat jede Sitzplatzreihe dieselbe Anzahl an Stühlen.

Eine Person darf für eine Veranstaltung mehrere Sitzplätze reservieren. Ist eine Veranstaltung ausgebucht, kann sich die Person auf die Warteliste eintragen lassen, bei mehreren Platzwünschen auch mehrmals. Zu jeder Person wird die Telefonnummer gespeichert, allerdings nur, damit sie bei Absagen von Veranstaltungen schnell erreichbar ist.

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.

Auszug aus der Dokumentation der Klasse Veranstaltungsverwaltung

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> ermittleVeranstaltungen(int pMinFreiePlaetze)

Die Methode liefert eine Liste mit den Veranstaltungen zurück, bei denen mindestens so viele Plätze frei sind, wie es durch den im Parameter übergebenen Wert pMinFreiePlaetze vorgegeben wird. Wenn es keine Veranstaltung mit der Mindestzahl an freien Plätzen gibt, dann wird eine leere Liste zurückgegeben.

Die Klasse Veranstaltung

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

Auszug aus der Dokumentation der Klasse Veranstaltung

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(Person pPerson)

Diese Methode ist Bestandteil der Teilaufgabe b).

Die Klasse Person

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

Auszug aus der Dokumentation der Klasse 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.

Dokumentation der Klasse Queue<ContentType>

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.

Dokumentation der Klasse List<ContentType>

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, wie die Klassen der in Abbildung 2 dargestellten Teilmodellierung miteinander in Beziehung stehen.

a.2

Begründen Sie anhand des Sachkontexts, weshalb die Datensammlungen der Warteliste sinnvollerweise als Schlange (Queue) umgesetzt werden.

a.3

Begründen Sie anhand des Sachkontexts, weshalb es sinnvoll ist, die Sitzplätze samt den zugehörigen Reservierungen der Personen als zweidimensionales Feld (Array) statt als dynamische Datenstruktur umzusetzen.

Teilaufgabe d)

Nach Absprache mit der Schulleitung wollen die Schülerinnen und Schüler ihr Projekt ausbauen. Zusätzlich sollen die folgenden Anforderungen erfüllt werden:

Zu jeder Veranstaltung soll eine E-Mail-Adresse für eventuelle Rückfragen hinterlegt sein. Diese Angabe soll ebenfalls abrufbar sein.

Künftig soll die Schule für jede Veranstaltung einen einheitlichen Eintrittspreis je Sitzplatz verlangen können. Dieser Preis soll hinterlegt werden. Sowohl der Eintrittspreis als auch die Summe der Eintrittsgelder, berechnet aus den Reservierungen, sollen ebenfalls abrufbar sein.

Zu jeder Person sollen die von ihr gebuchten Veranstaltungen hinterlegt sein. Diese Angabe soll ebenfalls abrufbar sein.

d.1

Modellieren Sie die zuvor genannten Anforderungen als Erweiterung des Implementationsdiagramms aus Abbildung 2.

Hinweis: Klassen, Klassenbeziehungen, Methoden und Attribute des Implementationsdiagramms aus Abbildung 2, die unverändert bleiben, brauchen nicht erneut aufgeführt zu werden. Zeichnen Sie Ihre Erweiterung des Modells und laden Sie ein Foto davon hoch.

d.2

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

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

Lösung

Nach den offiziellen Korrekturhinweisen

a) Beschreiben Sie, wie die Klassen der in Abbildung 2 dargestellten Teilmodellierung miteinander in Beziehung 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 anhand des Sachkontexts, weshalb die Datensammlungen der Warteliste sinnvollerweise als Schlange (Queue) umgesetzt werden.

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 anhand des Sachkontexts, weshalb es sinnvoll 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 zuvor genannten Anforderungen als Erweiterung des Implementationsdiagramms aus Abbildung 2.

Lösung: Modellierung der Anforderungen: - Klasse Veranstaltung: - Neue Attribute: `-verantwortlicherEMailAdresse: String`, `-eintrittspreis: double` - Erweiterter Konstruktor: `+Veranstaltung(pTermin: String, pVeranstaltungsname: String, pAnzahlReihen: int, pAnzahlPlaetzeProReihe: int, pEintrittspreis: double, pVerantwortlicherEMailAdresse: String)` - Neue Methoden: `+gibEintrittspreis(): double`, `+gibSummeEintrittsgelder(): double`, `+gibVerantwortlicherEMailAdresse(): String` - Klasse Person: - Assoziation auf `List<Veranstaltung>` mit Bezeichner `-meineVeranstaltungen` - Neue Methoden: `+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: Ein Objekt der Klasse Veranstaltung verwaltet zusätzlich das Attribut eintrittspreis vom Typ double, welches über einen zusätzlichen Parameter im Konstruktor gesetzt und über die entsprechende Getter-Methode abgerufen werden kann. Die Methode gibSummeEintrittsgelder ermittelt die Summe der Eintrittsgelder für die Veranstaltung. 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 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2023 · Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin 2022 ›

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen