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

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

Aufgabenstellung

Aufgabenstellung:

Bei Sportturnieren sollen nach Möglichkeit Teams mit ähnlicher Spielstärke aufeinandertreffen, damit die verschiedenen Leistungsniveaus berücksichtigt werden. Deshalb wird nach jeder Runde eine Reihenfolge der Teams gebildet, die ihren bisherigen Erfolg im Turnier widerspiegelt. Auf Grundlage dieser Reihenfolgen werden die Begegnungen 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.

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.

Über die öffentlichen Methoden hinaus verfügt die Klasse über folgende private Methode:

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 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.

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 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.

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 Sachzusammenhang bedeuten.

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. [8 Punkte]

d)

Damit die Software unter anderem für unterschiedliche Sportarten verwendbar ist, soll sie flexibler werden. Dazu soll das Modell um die folgenden Punkte angepasst werden:

1. Je nach Sportart gibt es für Sieg, Unentschieden und Niederlage unterschiedliche Punkte. Diese Punkte sollen für jedes Turnier zu Beginn festgelegt werden können.

2. Zu jedem Team soll abgefragt werden können, gegen welche Teams es schon gespielt hat.

Ergänzen Sie das Modell aus Abbildung 1 um die genannten Erweiterungen.

Erläutern Sie, auf welche Weise Ihr Modell die Anforderungen realisiert. [11 Punkte]

Hinweis: Stellen Sie lediglich die Abweichungen des Modells gegenüber Abbildung 1 dar.

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

Lösung

Nach den offiziellen Korrekturhinweisen

a) Analysieren Sie das Implementationsdiagramm und erläutern Sie, was die abgebildeten Assoziationen im Sachzusammenhang bedeuten. 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: 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. 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 um die angegebenen Erweiterungen (Hinweis: Stellen Sie lediglich die Abweichungen des Modells gegenüber Abbildung 1 dar).

Lösung: Erweiterungen im Implementationsdiagramm: - Klasse `Turnierverwaltung`: - Neue Attribute: `-siegpunkte: int`, `-unentschiedenPunkte: int`, `-niederlagePunkte: int` - Geänderter Konstruktor: `+Turnierverwaltung(pTeams: Team[], pSiegpunkte: int, pUnentschiedenPunkte: int, pNiederlagePunkte: int)` - Neue get-Methoden: `+gibSiegpunkte(): int`, `+gibUnentschiedenPunkte(): int`, `+gibNiederlagePunkte(): int` - Klasse `Spiel`: - Neue gerichtete Assoziation zur `Turnierverwaltung`: `-verwaltung` - Geänderter 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 realisiert.

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 · GK · Nachtermin 2023 · Aufgabe 2 - Objektorientierte Modellierung · LK · Haupttermin 2023 ›

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen