Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik LK · Haupttermin · Weiterbildungskolleg 2023
Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung LK · Haupttermin · Weiterbildungskolleg (2023)
Aufgabenstellung
Aufgabenstellung: Turnierverwaltung
Bei Sportturnieren sollen nach Möglichkeit Teams mit ähnlicher Spielstärke aufeinandertreffen, damit die Leistungsunterschiede berücksichtigt werden. Deshalb werden die Teams nach jeder Runde gemäß ihrem bisherigen Turniererfolg 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
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
Ergebnis von filtere(pTeam, pX), wobei es sich bei dem Team um SF Forst handelt und pX den Wert 0 besitzt:
SSV Bergen
TuS Wiese
SV Wald
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.
List<Team> filtereTeams(Team pTeam, int pGleicheBegegnungen) (private Methode)
Es wird eine Liste zurückgegeben, die alle Teams enthält, die bisher in dem Turnier höchstens den als den Wert von pGleicheBegegnungen mal gegen das übergebene Team gespielt haben. Referenziert der Parameter pTeam null oder ist der Wert des Parameters pGleicheBegegnungen kleiner als 0, so wird eine leere Liste zurückgegeben.
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 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.
Teilaufgabe a)
a.1)
Analysieren Sie das Implementationsdiagramm und erläutern Sie die darin abgebildeten Assoziationen bezogen auf den Sachkontext.
a.2)
Erläutern Sie unter Heranziehung des Implementationsdiagramms und der Dokumentation im Anhang, auf welche Weise das Modell das Hinzufügen eines Spiels und das Eintragen des Siegers vorsieht.
Teilaufgabe d)
Damit die Software u. a. für unterschiedliche Sportarten genutzt werden kann, soll sie flexibler ausgelegt werden. Dazu soll das Modell in folgenden Punkten angepasst werden:
1. Je nach Sportart werden Sieg, Unentschieden und Niederlage unterschiedlich mit Punkten bewertet. Diese Punktwerte sollen für jedes Turnier zu dessen Beginn festgelegt werden können.
2. Zu jedem Team soll abgefragt werden können, gegen welche Teams es schon gespielt hat.
d.1)
Erweitern Sie das Modell aus Abbildung 1 entsprechend den genannten Änderungen. Hinweis: Stellen Sie lediglich die Abweichungen gegenüber Abbildung 1 dar. Zeichnen oder skizzieren Sie das erweiterte Klassendiagramm und laden Sie ein Foto davon hoch.
d.2)
Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.

Lösung
Nach den offiziellen Korrekturhinweisen
a) Analysieren Sie das Implementationsdiagramm und erläutern Sie die darin abgebildeten Assoziationen bezogen auf den Sachkontext.
Lösung: Im Diagramm sind die vier Assoziationen alleSpiele, eigeneSpiele, teamA und teamB dargestellt: - alleSpiele: Ein Objekt der Klasse Turnierverwaltung verwaltet alle Spiele des Turniers in einer Liste (Datentyp List mit Inhaltstyp Spiel) – unabhängig davon, ob ein Spiel beendet ist oder nicht. - 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. - eigeneSpiele: Ein Objekt der Klasse Team verwaltet nur die Spiele, an denen das Team beteiligt ist – entweder als Team A oder als Team B.
a) Erläutern Sie unter Heranziehung 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 (Hinweis: Stellen Sie lediglich die Abweichungen gegenüber Abbildung 1 dar).
Lösung: Erweiterungen im Klassendiagramm: - Klasse Turnierverwaltung: * Attribute: -siegpunkte: int, -unentschiedenPunkte: int, -niederlagePunkte: int * Konstruktor: +Turnierverwaltung(pTeams: Team[], pSiegpunkte: int, pUnentschiedenPunkte: int, pNiederlagePunkte: int) * Methoden: +gibSiegpunkte(): int, +gibUnentschiedenPunkte(): int, +gibNiederlagePunkte(): int - Assoziation: Gerichtete Assoziation von Spiel zu Turnierverwaltung mit Bezeichner -verwaltung. - Klasse Spiel: * Angepasster Konstruktor: +Spiel(pTeamA: Team, pTeamB: Team, pTurnierverwaltung: Turnierverwaltung) - Klasse Team: * Neue Methode: +ermittleBespielteTeams(): List<Team>
d) Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen erfüllt.
Lösung: 1. Für ein Turnier kann beim Erzeugen eines Objekts der Klasse Turnierverwaltung über die entsprechenden Parameter der Wert der Attribute siegpunkte, unentschiedenPunkte und niederlagePunkte einmalig festgelegt werden und über die entsprechenden Methoden gibSiegpunkte, gibUnentschiedenPunkte und gibNiederlagePunkte angefragt werden. Da die Punktauswertung für die Teams in der Klasse Spiel vorgenommen wird, wird beim Erzeugen eines Objekts der Klasse Spiel eine Referenz auf die Turnierverwaltung übergeben. 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 · LK · Haupttermin 2023 · Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023 ›
Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen
- 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 2 - Objektorientierte Modellierung · LK · Haupttermin · Weiterbildungskolleg 2023
- Aufgabe 1 - Objektorientierte Modellierung mit Im… · LK · Nachtermin 2023
- Aufgabe 1 - Objektorientierte Modellierung · GK · Haupttermin 2022
- Aufgabe 2 - Objektorientierte Modellierung · GK · Haupttermin 2022
- Aufgabe 1 - Modellierung · GK · Nachtermin 2022