Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik GK · Haupttermin 2023
Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung GK · Haupttermin (2023)
Aufgabenstellung
Aufgabenstellung: Sportturniere
Bei Sportturnieren sollen möglichst Teams mit ungefähr gleicher Spielstärke aufeinandertreffen, damit die Leistungsunterschiede berücksichtigt werden. Deshalb werden die Teams nach jeder Runde gemäß ihrem bisherigen Erfolg im Turnier in eine Reihenfolge gebracht. Auf Grundlage dieser Reihenfolgen werden die Paarungen nach diesem Prinzip bestimmt:
Bei Beginn des Turniers werden alle Teams in zufälliger Reihenfolge angeordnet.
Nach jeder Partie wird die Reihenfolge der Teams anhand ihrer Punktzahlen angepasst: Die Reihenfolge der Teams ist absteigend nach deren Punktzahl geordnet. Für einen Sieg erhält ein Team 1 Punkt, für eine Niederlage -1 Punkt. Bei einem Unentschieden erhalten beide Teams 0 Punkte.
Um für ein Team A einen Gegner zu bestimmen, wird das Team B als Gegner ausgewählt, das in der Reihenfolge möglichst nah beim Team A ist.
Um zu vermeiden, dass immer wieder die gleichen Teams gegeneinander spielen, wird eine Maximalzahl gleicher Begegnungen festgelegt: Zwei Teams sollen höchstens so häufig wie in dieser Zahl festgelegt gegeneinander spielen.
Das folgende Softwaremodell stellt einen ersten Entwurf zur Verwaltung eines solchen Turniers dar:
Anlage: Beispieldaten
Teams (in dieser Reihenfolge im Feld teams):
SF Forst
SG Heide
TV Feld
SSV Bergen
TuS Wiese
SV Wald Spiele:
Runde 1:
SF Forst – SG Heide: Sieger ist SF Forst
TV Feld – SSV Bergen: Sieger ist TV Feld
TuS Wiese – SV Wald: Unentschieden
Runde 2:
SF Forst – TV Feld: Unentschieden
TuS Wiese – SG Heide: Sieger ist TuS Wiese
SV Wald – SSV Bergen: Unentschieden
Runde 3:
SF Forst – TuS Wiese: noch nicht beendet
TV Feld – SV Wald: noch nicht beendet
SSV Bergen – SG Heide: noch nicht beendet
Aktueller Punktestand:
Platzierung · Team · Punkte
1. · SF Forst · 1
2. · TV Feld · 1
3. · TuS Wiese · 1
4. · SV Wald · 0
5. · SSV Bergen · -1
6. · SG Heide · -2
Anhang: Dokumentationen der verwendeten Klassen
Die Klasse Team
Objekte der Klasse Team repräsentieren die zu einem Team vorhandenen Daten. Zu jedem Team in einem Turnier soll immer nur genau ein Objekt existieren. Ein Objekt der Klasse verwaltet Referenzen auf die Spiel-Objekte, an denen das Team beteiligt ist.
Dokumentation der Klasse Team
Team(String pName)
Ein Objekt der Klasse wird initialisiert. Die übergebene Zeichenkette wird gespeichert. Das Team hat keine eigenen Spiele gespeichert.
String gibName()
Die Methode liefert den Namen des Teams zurück.
int berechnePunkte()
Die Methode liefert die Punkte des Teams auf Basis der eigenen Spiele, die bereits beendet sind. Die Rückgabe entspricht der Summe der Einzelbewertungen jedes beendeten Spiels für das Team. Wurde noch kein eigenes Spiel beendet, wird 0 zurückgegeben.
void fuegeHinzu(Spiel pSpiel)
Das durch den Parameter referenzierte Objekt der Klasse Spiel wird zu den eigenen Spielen hinzugefügt.
int zaehleSpieleGegen(Team pGegner)
Die Methode liefert die Anzahl der gespielten Spiele, die das als Parameter übergebene Team gegen dieses Team gespielt hat. Wird null für den Parameter übergeben, so wird -1 zurückgegeben.
Die Klasse Turnierverwaltung
Objekte der Klasse Turnierverwaltung verwaltet alle Teams und alle Spiele eines Turniers. Die Teams werden in der Reihenfolge verwaltet, in der sie sich für das Turnier angemeldet haben.
Dokumentation der Klasse Turnierverwaltung
Turnierverwaltung(Team[] pTeams)
Ein Objekt der Klasse wird initialisiert. Die im Feld übergebenen Teams werden in einer zufälligen Reihenfolge angeordnet. Es existieren keine Spiele.
Team[] berechnePlatzierungen()
Die Methode liefert alle im Turnier vorhanden Teams in einem Feld. Das Feld ist absteigend nach der Punktzahl der Teams sortiert. Sind zwei Teams punktgleich, ist die Reihenfolge zufällig.
void fuegeHinzu(Spiel pSpiel)
Das übergebene Spiel wird der Liste aller Spiele hinzugefügt. Außerdem wird beiden Teams das übergebene Spiel hinzugefügt. Dabei wird davon ausgegangen, dass die beiden im Spiel referenzierten Objekte der Klasse Team nicht identisch sind und von dem Objekt der Klasse Turnierverwaltung referenziert werden.
Team[] gibTeams()
Die Methode liefert die Teams in der Reihenfolge, in der sie sich zum Turnier angemeldet haben.
Dokumentation dieser privaten Methode der Klasse:
List<Team> filtereTeams(Team pTeam, int pGleicheBegegnungen)
Es wird eine Liste zurückgegeben, die alle Teams enthält, die bisher in dem Turnier höchstens den als Wert von pGleicheBegegnungen mal gegen das übergebene Team gespielt haben. Die übergebenen Parameter werden nicht geprüft, es wird davon ausgegangen, dass sinnvolle Werte übergeben werden.
Die Klasse Spiel
Ein Objekt der Klasse Spiel verwaltet die beteiligten Teams, ob das Spiel bereits beendet wurde und das siegende Team des Spiels, sofern es eins gibt.
Dokumentation der Klasse Spiel
Spiel(Team pTeamA, Team pTeamB)
Ein Objekt der Klasse wird initialisiert. Die beiden übergebenen Teams werden in dem Spiel gespeichert. Das Spiel gilt als nicht beendet. Es ist kein Sieger eingetragen.
Team gibTeamA()
Die Methode liefert das Team A des Spiels.
Team gibTeamB()
Die Methode liefert das Team B des Spiels.
boolean istBeendet()
Ist das Spiel beendet, wird true zurückgegeben, andernfalls wird false zurückgegeben.
int berechnePunkte(Team pTeam)
Ist das Spiel nicht beendet oder ist kein Sieger gespeichert (das Spiel also als unentschieden gewertet), so wird der Wert 0 zurückgegeben. Ist das im Parameter referenzierte Team nicht an dem Spiel beteiligt, wird der Wert -1 zurückgegeben.
void setzeSieger(Team pSieger)
Das Spiel wird als beendet gewertet. Das übergebene Team wird als Sieger gesetzt. Wird null übergeben, gilt das Spiel als unentschieden. Es wird davon ausgegangen, dass entweder null oder ein an dem Spiel beteiligtes Team übergeben wird.
Team gibSieger()
Die Methode liefert den Sieger des Spiels. Gibt es keinen Sieger, weil das Spiel unentschieden oder noch nicht beendet ist, wird null geliefert.
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.
a)
Analysieren Sie das Implementationsdiagramm und erläutern Sie, was die abgebildeten Assoziationen im Sachkontext bedeuten.
Erläutern Sie unter Verwendung des Implementationsdiagramms und der Dokumentation im Anhang, auf welche Weise das Modell das Hinzufügen eines Spiels und das Eintragen des Siegers vorsieht. (4 + 4 Punkte)
d)
Um die Software etwas flexibler zu gestalten, soll das Modell um folgende Punkte verändert werden:
1. Es soll für jedes Spiel das Datum und die Uhrzeit festgehalten werden, wann das Spiel beginnt.
2. Für jedes Team soll jeweils angefragt werden können, gegen welche Teams es bereits gespielt hat.
Erweitern Sie das Modell aus Abbildung 1 entsprechend den genannten Änderungswünschen.
Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.
Hinweis: Stellen Sie lediglich die Abweichungen des Modells gegenüber Abbildung 1 dar. (7 + 5 Punkte)

Lösung
Nach den offiziellen Korrekturhinweisen
a) Analysieren Sie das Implementationsdiagramm und erläutern Sie, was die abgebildeten Assoziationen im Sachkontext bedeuten.
Lösung: Im Diagramm sind die vier Assoziationen `alleSpiele`, `eigeneSpiele`, `teamA` und `teamB` dargestellt: - Die Assoziation `alleSpiele` modelliert den Sachverhalt, dass ein Objekt der Klasse `Turnierverwaltung` alle Spiele des Turniers in einer Liste (Datentyp `List` mit Inhaltstyp `Spiel`) verwaltet – unabhängig davon, ob ein Spiel beendet ist oder nicht. - Die Assoziationen `teamA` und `teamB` modellieren die Beteiligung der beiden Teams an einem bestimmten Spiel. Ein Objekt der Klasse `Spiel` verwaltet also über diese Referenzen zwei Objekte vom Typ `Team`. - Die Assoziation `eigeneSpiele` modelliert den Sachverhalt, dass ein Objekt der Klasse `Team` nur die Spiele verwaltet, an denen das Team beteiligt ist – entweder als Team A oder als Team B.
a) Erläutern Sie unter Verwendung des Implementationsdiagramms und der Dokumentation im Anhang, auf welche Weise das Modell das Hinzufügen eines Spiels und das Eintragen des Siegers vorsieht.
Lösung: Ein Spiel wird hinzugefügt, indem zunächst mit zwei Referenzen auf zwei Teams des Turniers ein Objekt der Klasse `Spiel` erzeugt wird. Dieses Objekt wird der Liste des Objekts der Klasse `Turnierverwaltung` mittels der Methode `fuegeHinzu` hinzugefügt. Außerdem wird über die Methode `fuegeHinzu` der Klasse `Team` beiden Objekten mit den Referenzen `teamA` und `teamB` das Spiel zu der Liste der eigenen Spiele mit dem Bezeichner `eigeneSpiele` hinzugefügt. Das siegende Team eines Spiels wird über den Parameter der Methode `setzeSieger` des Objekts der Klasse `Spiel` übergeben. Ist das Ergebnis eines Spiels ein Unentschieden, so wird `null` übergeben.
d) Erweitern Sie das Modell aus Abbildung 1 entsprechend den genannten Änderungswünschen (Datum/Uhrzeit eines Spiels und Abfrage bespielter Teams je Team).
Lösung: Erweiterung des Klassenmodells: - Klasse `Spiel`: Attribut `-startzeitpunkt: String` sowie Getter und Setter `+setzeStartzeitpunkt(pStartzeitpunkt: String)` und `+gibStartzeitpunkt(): String` (alternativ im Konstruktor `+Spiel(pTeamA: Team, pTeamB: Team, pStartzeitpunkt: String)`). - Klasse `Team`: Methode `+ermittleBespielteTeams(): List<Team>`.
d) Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.
Lösung: 1. Über die Methoden `setzeStartzeitpunkt` und `gibStartzeitpunkt` der Klasse `Spiel` kann der Startzeitpunkt als Zeichenkette im Attribut `startzeitpunkt` verändert und inspiziert werden. 2. Da jedes Objekt der Klasse `Team` die eigenen Spiele referenziert, müssen keine weiteren Daten gespeichert werden. Über die Methode `ermittleBespielteTeams` kann für jedes Objekt der Klasse `Team` ermittelt werden, gegen welche Teams bereits gespielt wurde.
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 - Objektorientierte Modellierung · GK · Haupttermin 2023 ›
Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen
- Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin 2023
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · GK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 2 - Objektorientierte Modellierung mit Im… · GK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 1 - Objektorientierte Modellierung · GK · Nachtermin 2023
- Aufgabe 2 - Objektorientierte Modellierung · GK · Nachtermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · LK · Haupttermin 2023
- Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2023