Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik GK · Nachtermin 2023

Thema: Objektorientierte Modellierung mit Implementationsdiagrammen · Aus der Prüfung GK · Nachtermin (2023)

Aufgabenstellung

Aufgabenstellung: Digitales Glücksrad

Auf einem Stadtfest will ein Büroartikelmarkt Gäste kleine Büroartikel gewinnen lassen. Der Inhaber hat dazu die Idee eines besonderen „digitalen Glücksrads“ entwickelt und den Informatik-Grundkurs des örtlichen Schulzentrums mit der Programmierung beauftragt.

Das Besondere an diesem digitalen Glücksrad ist, dass auf jedem Sektor des Glücksrads ein ganzer Stapel von Gewinnen liegt. Bleibt der Pfeil des Glücksrads auf einem Sektor stehen, auf dem ein ganzer Stapel von Gewinnen liegt, so wird der oberste Gewinn des Stapels auf den im Uhrzeigersinn nächsten Glücksradsektor verschoben, d. h. auf den Stapel des nächsten Glücksradsektors gelegt, und die Spielerin bzw. der Spieler darf erneut den Pfeil des Glücksrads drehen. Andernfalls steht der Pfeil auf einem Sektor, auf dem lediglich ein einziger Gewinn liegt. Die Spielerin bzw. der Spieler bekommt diesen Gewinn und der nun leere Glücksradsektor wird aus dem Glücksrad entfernt.

Eine Spielerin dreht den Pfeil des links in Abbildung 1 gezeigten Glücksrads zweimal im Uhrzeigersinn. Beim ersten Dreh wird der Pfeil um einen Sektor weitergedreht und bleibt auf dem Sektor mit dem Bleistift stehen, welcher deshalb einen Sektor weiter auf den Locher verschoben wird. Beim zweiten Dreh wird der Pfeil dann noch weitere fünf Sektoren weitergedreht und bleibt auf dem Radierer stehen. Dieser wird mitsamt dem ganzen Glücksradsektor entfernt und die Spielerin gewinnt den Radierer. Nach diesen beiden Drehungen sieht das aktuelle Glücksrad aus wie das in Abbildung 1 rechts dargestellte Glücksrad. Da der Sektor mit dem Radierer entfernt wurde, steht der Pfeil des Glücksrads nun auf dem im Uhrzeigersinn nächsten Sektor mit dem Klebstoff obenauf.

Ein Glücksrad kann kurz durch eine Zeichenkette dargestellt werden, wobei die Gewinnstapel jeweils von unten nach oben angegeben sind und die Glücksradsektoren jeweils durch das Trennsymbol " / " voneinander getrennt sind.

Abbildung 2 zeigt die Zeichenkette zum Glücksrad, welches nach dem zweimaligen Dreh des Pfeils resultiert (siehe rechtes Glücksrad aus Abbildung 1). Der Pfeil des Glücksrads steht dabei auf dem ersten angegebenen Glücksradsektor (hier der Sektor mit dem Gewinnstapel "Tacker, Klebstoff").

Das folgende Implementationsdiagramm liegt vor.

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse Gewinn

Objekte der Klasse Gewinn verwalten einen einzelnen Gewinn des Glücksrads.

Methode / Konstruktor · Beschreibung

Gewinn(String pName, double pWert) · Ein neuer Gewinn mit der Bezeichnung pName und dem Gewinnwert pWert wird erstellt.

String gibName() · Die Anfrage liefert die Bezeichnung des Gewinns.

double gibWert() · Die Anfrage liefert den Gewinnwert des Gewinns.

Die Klasse Sektor

Objekte der Klasse Sektor verwalten alle Gewinne eines einzelnen Glücksradsektors in Form eines Gewinnstapels.

Methode / Konstruktor · Beschreibung

Sektor() · Ein neuer, leerer Glücksradsektor wird erstellt.

Gewinn gibOberstenGewinn() · Die Anfrage liefert den Gewinn, der oben auf dem Gewinnstapel des Sektors liegt. Sollte der Glücksradsektor leer sein, so wird null zurückgeliefert.

void entferneOberstenGewinn() · Der Gewinn, der auf dem Gewinnstapel des Sektors obenauf liegt, wird entfernt. Sollte der Glücksradsektor leer sein, so geschieht nichts.

void legeGewinnObenauf(Gewinn pGewinn) · Das Objekt pGewinn wird auf den Gewinnstapel des Sektors gelegt. Ist der Parameter pGewinn gleich null, so geschieht nichts.

boolean istLeer() · Die Anfrage liefert den Wert true, wenn der Gewinnstapel keine Objekte enthält, sonst liefert sie den Wert false.

int ermittleAnzahlGewinne() · Die Anfrage ermittelt die Anzahl der Objekte auf dem Gewinnstapel. Der Stapel der Gewinne ist nach Ablauf der Methode unverändert. Sollte der Glücksradsektor leer sein, so wird der Wert 0 zurückgeliefert.

Die Klasse Gluecksrad

Objekte der Klasse Gluecksrad verwalten ein digitales Glücksrad. Sollte das Glücksrad mindestens einen Sektor besitzen, so gibt es immer einen aktuell ausgewählten Sektor, auf den der Pfeil des Glücksrads zeigt. Andernfalls bleibt der Pfeil des Glücksrads unverändert.

Methode / Konstruktor · Beschreibung

Gluecksrad() · Ein neues, leeres Glücksrad ohne Sektoren wird erstellt.

void fuegeSektorHinzu(Stack<Gewinn> pGewinne) · Ein neuer Glücksradsektor mit dem Gewinnstapel pGewinne wird in das Glücksrad eingefügt. Sollte der Sektor der erste eingefügte Sektor sein, so wird dieser Sektor der aktuell ausgewählte Glücksradsektor, auf den der Pfeil des Glücksrads zeigt. Andernfalls bleibt der aktuell ausgewählte Sektor unverändert und der neue Sektor wird vor dem aktuellen Sektor (also gegen den Uhrzeigersinn) eingefügt. Sollte der Stapel pGewinne leer oder der Parameter pGewinne gleich null sein, so geschieht nichts.

int gibAnzahlSektoren() · Die Anfrage ermittelt die Anzahl der Sektoren des Glücksrads. Das Glücksrad ist nach Ablauf der Methode unverändert.

int ermittleAnzahlGewinne() · Die Anfrage ermittelt die Anzahl der Gewinne auf dem gesamten Glücksrad. Das Glücksrad ist nach Ablauf der Methode unverändert.

void verschiebeGewinn() · Der Gewinn, der auf dem Gewinnstapel des aktuellen Sektors obenauf liegt, wird auf den Gewinnstapel des im Uhrzeigersinn nächsten Sektors verschoben. Der aktuell ausgewählte Glücksradsektor bleibt weiterhin ausgewählt.

Gewinn simuliereZufaelligeDrehung() · Die Methode simuliert das einmalige Drehen des Pfeils des Glücksrads um eine zufällige Anzahl Sektoren im Uhrzeigersinn inklusive der Entfernung/Verschiebung eines Gewinns und einer eventuellen Entfernung eines Glücksradsektors. Zurückgeliefert wird der so gewonnene Gewinn bzw. null, falls gemäß den Spielregeln kein Gewinn erzielt wurde.

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.

Methode / Konstruktor · Beschreibung

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 Stack

Objekte der generischen Klasse Stack (Keller, Stapel) verwalten beliebige Objekte vom Typ ContentType nach dem Last-In-First-Out-Prinzip, d. h., das zuletzt abgelegte Objekt wird als erstes wieder entnommen. Alle Methoden haben eine konstante Laufzeit, unabhängig von der Anzahl der verwalteten Objekte.

Methode / Konstruktor · Beschreibung

Stack() · Ein leerer Stapel wird erzeugt. Objekte, die in diesem Stapel verwaltet werden, müssen vom Typ ContentType sein.

boolean isEmpty() · Die Anfrage liefert den Wert true, wenn der Stapel keine Objekte enthält, sonst liefert sie den Wert false.

void push(ContentType pContent) · Das Objekt pContent wird oben auf den Stapel gelegt. Falls pContent gleich null ist, bleibt der Stapel unverändert.

void pop() · Das zuletzt eingefügte Objekt wird von dem Stapel entfernt. Falls der Stapel leer ist, bleibt er unverändert.

ContentType top() · Die Anfrage liefert das oberste Stapelobjekt. Der Stapel bleibt unverändert. Falls der Stapel leer ist, wird null zurückgegeben.

Das folgende Implementationsdiagramm liegt vor:

b)

Beschreiben Sie, wie die Klassen Gluecksrad, Gewinn, Sektor, Queue und Stack in der in Abbildung 3 dargestellten Teilmodellierung zueinander in Beziehung stehen.

Begründen Sie bezogen auf den Sachkontext, weshalb es zweckmäßig ist, die Gewinne in einem Stapel und die Sektoren in einer Schlange zu verwalten.

Aufgabenstellung: Aufgabe 1 - Objektorientierte Modellierung · Abitur NRW Informatik GK · Nachtermin 2023

Lösung

Nach den offiziellen Korrekturhinweisen

Beschreiben Sie, wie die Klassen Gluecksrad, Gewinn, Sektor, Queue und Stack in der in Abbildung 3 dargestellten Teilmodellierung zueinander in Beziehung stehen.

Lösung: Die Klasse Sektor verwaltet im Attribut gewinne die einzelnen Gewinne in einem Objekt der Klasse Stack, welche mit der Klasse Gewinn parametrisiert ist. Die Klasse Gluecksrad verwaltet im Attribut sektoren die einzelnen Sektoren des Rads in einem Objekt der Klasse Queue, die mit der Klasse Sektor parametrisiert ist.

Begründen Sie bezogen auf den Sachkontext, weshalb es zweckmäßig ist, die Gewinne in einem Stapel und die Sektoren in einer Schlange zu verwalten.

Lösung: Im Sachkontext ist die Verwaltung der Gewinne in Form eines Stapels sinnvoll, da die Gewinne auch im Sachkontext aufeinandergestapelt werden und diese verwendete Datenstruktur genau diesen Sachverhalt widerspiegelt (Zugriff nur auf das oberste Element: LIFO). Die Verwaltung der Sektoren des Glücksrads in Form einer Schlange ist sinnvoll, da es immer einen aktuellen Glücksradsektor gibt (erstes Objekt der Schlange) und das Drehen des Glücksrads um einen Sektor so simuliert werden kann, dass das vorderste Objekt der Schlange vorne gelöscht und hinten wieder eingefügt wird. Ein wahlfreier Zugriff auf die einzelnen Sektoren wird in diesem Sachkontext nicht benötigt.

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 mit Im… · GK · Haupttermin · Weiterbildungskolleg 2023 · Aufgabe 2 - Objektorientierte Modellierung · GK · Nachtermin 2023 ›

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen