Aufgabe 1 - Objektorientierte Modellierung mit Im… · Abitur NRW Informatik GK · Haupttermin · Weiterbildungskolleg 2023
Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung GK · Haupttermin · Weiterbildungskolleg (2023)
Aufgabenstellung
Aufgabenstellung: Sportturniere
Bei Sportturnieren sollen nach Möglichkeit Teams mit annähernd gleicher Leistungsstärke aufeinandertreffen. Deshalb werden die Teams nach jeder Runde gemäß ihrem bisherigen Erfolg im Turnier in eine Reihenfolge gebracht. Auf Grundlage dieser Reihenfolgen werden die Partien nach diesem Prinzip festgelegt:
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 derartigen 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.
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.
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 der privaten Methode:
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.
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<ContentType>
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.
a)
Analysieren Sie das Implementationsdiagramm und erläutern Sie, welche Bedeutung die darin abgebildeten Assoziationen im Sachzusammenhang haben.
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:
Zu jedem Spiel sollen Datum und Uhrzeit des Spielbeginns gespeichert werden.
Zu jedem Team soll abgefragt werden können, gegen welche Teams es schon gespielt hat.
Erweitern Sie das Modell aus Abbildung 1 entsprechend den genannten Änderungen.
Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.
Hinweis: Stellen Sie ausschließlich 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, welche Bedeutung die darin abgebildeten Assoziationen im Sachzusammenhang haben.
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 Änderungen (1. Datum/Uhrzeit Spielbeginn; 2. Abfrage bespielter Teams).
Lösung: Erweiterungen im Modell: - Klasse `Spiel` erhält das Attribut `-startzeitpunkt: String` sowie die Methoden `+setzeStartzeitpunkt(pStartzeitpunkt: String)` und `+gibStartzeitpunkt(): String`. - Klasse `Team` erhält die Methode `+ermittleBespielteTeams(): List<Team>`.
d) Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.
Lösung: 1. Über die 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 · Aufgabe 2 - Objektorientierte Modellierung mit Im… · GK · Haupttermin · Weiterbildungskolleg 2023 ›
Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen
- Aufgabe 1 - Objektorientierte Modellierung · GK · Haupttermin 2023
- Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin 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