Aufgabe 1 - Modellierung · Abitur NRW Informatik GK · Nachtermin 2022

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

Aufgabenstellung

Aufgabenstellung: Verpackungsstation

Auf einem Biobauernhof werden die geernteten Kartoffeln in einer hofeigenen Verpackungsstation abgepackt. Ein Förderband transportiert die Kartoffeln zu einer Sortieranlage, die jede Kartoffel danach über eine Rutsche zu einer passenden Packung leitet. Sobald eine Packung gefüllt ist, wird sie verladen und durch eine neue, leere Packung ersetzt. Abbildung 1 stellt die Verpackungsstation schematisch dar.

Die zentrale Schwierigkeit liegt darin, für jede als Nächstes auf dem Förderband ankommende Kartoffel eine passende Packung auszuwählen. Kartoffeln sind Naturprodukte und unterscheiden sich stark in ihrer Größe, sodass die Packungen nicht immer exakt gleich schwer sind.

Einerseits muss eine Packung ein festgelegtes Minimalgewicht erreichen, um als voll zu gelten. Andererseits soll dieses Minimalgewicht möglichst knapp überschritten werden, weil dem Bauernhof sonst unnötige Verluste entstehen.

Nachfolgend wird ein Programm betrachtet, das diese Verpackungsstation simuliert. Es setzt die in Abbildung 2 angegebene Teilmodellierung um.

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse Verpackungsstation

Ein Objekt dieser Klasse simuliert die Verpackung von Kartoffeln eines Biobauernhofes in einzelne Packungen sowie die Verladung dieser Packungen.

Konstruktor / Methode

Beschreibung

Verpackungsstation(int pAnzahlPackungen)

Ein Objekt der Klasse Verpackungsstation wird initialisiert. In dem vom Objekt verwalteten Versandlager sind keine fertig befüllten Packungen enthalten. Auf dem vom Objekt verwalteten Förderband sind keine Kartoffeln. Der Parameter pAnzahlPackungen gibt an, wie viele Packungen die Station gleichzeitig befüllen wird.

void ergaenzeKartoffeln(List<Kartoffel> pKartoffeln)

Das vom Objekt verwaltete Förderband wird mit den Kartoffel-Objekten der Liste pKartoffeln in beliebiger Reihenfolge gefüllt.

Packung verpackeKartoffel()

Die Methode wird in Aufgabenteil b) analysiert.

List<Packung> gibVersandlager()

Die Methode liefert die Liste der bereits gefüllten Packungen des Versandlagers zurück.

Die Klasse Kartoffel

Ein Objekt dieser Klasse repräsentiert eine einzelne Kartoffel in der Simulation der Verpackungsstation.

Konstruktor / Methode

Beschreibung

Kartoffel(int pGewicht)

Eine neue Kartoffel wird mit dem Gewicht pGewicht initialisiert.

int gibGewicht()

Das Gewicht der Kartoffel wird zurückgegeben.

Die Klasse Packung

Ein Objekt dieser Klasse repräsentiert eine einzelne Kartoffelpackung des Biobauernhofes, welche mit Kartoffeln befüllt werden kann.

Konstruktor / Methode

Beschreibung

Packung()

Eine leere Kartoffelpackung wird erzeugt, d. h., die von dem Objekt verwaltete Datensammlung der Kartoffel-Objekte ist leer.

void verpacke(Kartoffel pKartoffel)

Die Kartoffel pKartoffel wird in die Packung eingefüllt/verpackt, d. h., das Objekt pKartoffel wird der Datensammlung der Kartoffel-Objekte hinzugefügt.

List<Kartoffel> gibKartoffeln()

Die Methode liefert die Liste aller bereits verpackten Kartoffeln dieser Packung.

int ermittleGewicht()

Die Methode ermittelt das Gesamtgewicht der bereits verpackten Kartoffeln dieser Packung.

int gibMinimalgewicht()

Die Methode liefert das Minimalgewicht dieser Packung. Dieses legt fest, ab welchem Minimalgewicht diese Packung für den Versand vorbereitet werden kann.

Die generische Klasse Queue<ContentType>

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.

Konstruktor / Methode

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

Konstruktor / Methode

Beschreibung

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)

Erläutern Sie, in welchen Beziehungen die Klassen der Modellierung in Abbildung 2 zueinander stehen.

[4 Punkte]

a.2)

Begründen Sie, weshalb es zweckmäßig ist, dass Objekte vom Typ Packung die Objekte vom Typ Kartoffel in einer Liste verwalten.

[3 Punkte]

Teilaufgabe d)

Weil sich die Verpackungsstation bewährt hat, sollen die Algorithmen verbessert und zusätzlich neue Funktionen ergänzt werden. Hierfür ist die Modellierung in Abbildung 2 anzupassen.

Diese Anforderungen kommen hinzu:

i. Für jede Packung soll der Zeitpunkt gespeichert werden, wann sie fertig gepackt wurde. Dieser Zeitpunkt soll natürlich auch abrufbar sein.

ii. Neben normalen Packungen soll es nun auch noch sogenannte Premiumpackungen geben. Neben den normalen Funktionalitäten soll bei Premiumpackungen das Minimalgewicht individuell gesetzt werden können. Darüber hinaus soll das Durchschnittsgewicht der Kartoffeln abgefragt werden können.

d.1)

Modellieren Sie die oben genannten Anforderungen als Erweiterung der Modellierung aus Abbildung 2. Stellen Sie dabei ausschließlich die Änderungen und Ergänzungen als Implementationsdiagramm dar.

[6 Punkte]

d.2)

Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm jede der genannten Anforderungen umsetzt.

[6 Punkte]

Teilaufgabe e)

e)

Bei der Erweiterung des Programms hat ein Programmierer einen Einfall. Die Anzahl der Kartoffeln auf dem Förderband ist zwar nicht konstant, aber auf Grund der Größe des realen Förderbandes zumindest nach oben begrenzt. Es gibt also eine maximale Anzahl an Kartoffeln, die auf dem Förderband liegen können. In so einem Fall, so meint er sich zu erinnern, wählt man eigentlich eine statische Datenstruktur, z. B. ein Feld (Array).

Begründen Sie, weshalb das Förderband trotz des Einwands des Programmierers besser mit einer Schlange als mit einem Feld (Array) umgesetzt werden sollte.

[6 Punkte]

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

Lösung

Nach den offiziellen Korrekturhinweisen

a) Erläutern Sie, in welchen Beziehungen die Klassen der Modellierung in Abbildung 2 zueinander stehen.

Lösung: Ein Objekt der Klasse Verpackungsstation verwaltet Objekte der Klasse Packung und Objekte der Klasse Kartoffel. Die Objekte der Klasse Kartoffel werden in einer über das Attribut foerderband referenzierten Schlange über dem Datentyp Kartoffel verwaltet. Die Objekte der Klasse Packung werden einerseits in der über das Attribut versandlager referenzierten Liste über dem Datentyp Packung verwaltet. Andererseits verwaltet ein Objekt der Klasse Verpackungsstation auch ein Feld (Array) über dem Datentyp Packung. Ein Objekt der Klasse Packung verwaltet Objekte der Klasse Kartoffel in der durch das Attribut kartoffeln referenzierten Liste über dem Datentyp Kartoffel.

a) Begründen Sie, weshalb es zweckmäßig ist, dass Objekte vom Typ Packung die Objekte vom Typ Kartoffel in einer Liste verwalten.

Lösung: Im Einleitungstext ist erläutert, dass die Kartoffeln ein unterschiedliches Gewicht besitzen. Somit ist die Anzahl der Kartoffeln, welche in einer Packung verpackt werden, zum Zeitpunkt der Erzeugung des Objekts der Klasse Packung unbestimmt. Gleiches gilt auch für die maximale Anzahl an Kartoffeln, die in einer Packung Platz haben. Somit bietet sich die Verwaltung der Kartoffeln in einer Liste an.

d) Modellieren Sie die oben genannten Anforderungen als Erweiterung der Modellierung aus Abbildung 2. Stellen Sie dabei ausschließlich die Änderungen und Ergänzungen als Implementationsdiagramm dar.

Lösung: Erweiterung der Klasse `Packung`: - Attribut: `-zeitpunkt: String` - Methoden: `+setzeZeitpunkt(pZeitpunkt: String)`, `+gibZeitpunkt(): String` Neue Klasse `Premiumpackung` (erbt von `Packung` via Generalisierungspfeil): - Attribut: `-minimalgewicht: int` - Konstruktor: `+Premiumpackung(pMinimalgewicht: int)` - Methoden: `+ermittleDurchschnittsgewicht(): double`, `+gibMinimalgewicht()`

d) Erläutern Sie, auf welche Weise Ihr Implementationsdiagramm jede der genannten Anforderungen umsetzt.

Lösung: i. Der Zeitpunkt der endgültigen Verpackung wird in Form eines Strings gespeichert. Die Methoden setzeZeitpunkt und gibZeitpunkt ermöglichen das Lesen und Setzen des Zeitpunkts. ii. Die Klasse Premiumpackung erbt alle Attribute und Methoden der Klasse Packung und hat damit die gleiche Funktionalität wie eine normale Packung. Über das Attribut minimalgewicht, welches über den Aufruf des Konstruktors gesetzt wird, kann nun das individuelle Minimalgewicht gespeichert werden. Die alte Methode gibMinimalgewicht wird nun überschrieben und liefert so das individuelle Minimalgewicht zurück. Der Forderung, dass das Durchschnittsgewicht der Kartoffeln einer Packung abgefragt werden kann, wird durch eine weitere Methode ermittleDurchschnittsgewicht Rechnung getragen.

e) Begründen Sie, weshalb das Förderband trotz des Einwands des Programmierers besser mit einer Schlange als mit einem Feld (Array) umgesetzt werden sollte.

Lösung: Eine Verwaltung der Kartoffel-Objekte des Förderbandes in Form eines Feldes (Array) ist nicht sinnvoll. Die Verwendung der Datensammlung foerderband folgt der Idee einer Schlange, d. h., es werden stets auf der einen Seite der Datenstruktur Objekte entnommen und auf der anderen Seite der Datenstruktur Objekte hinzugefügt. Würde man die Datensammlung foerderband als Feld gestalten, so müsste man die Funktionalität einer Schlange erst nachbilden.

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 2022 · Aufgabe 2 - Modellierung · GK · Nachtermin 2022 ›

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen