Aufgabe 2 - Objektorientierte Modellierung · Abitur NRW Informatik GK · Haupttermin 2023

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

Aufgabenstellung

Aufgabenstellung: Sachkontext Wohnungsankauf der Firma Besserwohnen

Die Firma Besserwohnen handelt in einer ländlichen Region mit Wohnungen und vermietet sie auch. Sie möchte ausschließlich Wohnungen erwerben, bei denen ein Wertzuwachs zu erwarten ist.

Als Entscheidungshilfe für die Beschäftigten beim Ankauf neuer Wohnungen hat eine Expertengruppe der Firma, gestützt auf Erfahrungen aus früheren Käufen, ein Einschätzungsverfahren auf Basis eines Binärbaums entwickelt. Es liefert anhand der folgenden drei nummerierten Kriterien für eine neue Wohnung entweder eine Kaufempfehlung oder keine.

Zimmeranzahl (Kriteriumnummer 0)

Quadratmeterpreis: Preis für je einen Quadratmeter in Euro (Kriteriumnummer 1)

Größe: Wohnungsgröße in Quadratmetern 1 (Kriteriumnummer 2)

1 Die Einheit „Quadratmeter“ wird in dieser Klausur mit qm abgekürzt.

Abbildung 1 stellt den Binärbaum dar, den die Firma Besserwohnen derzeit verwendet. Solch ein Baum heißt im Folgenden Einschätzungsbaum.

Man startet an der Wurzel und beantwortet für eine neue Wohnung die dort enthaltenen Fragen. Schon in jedem Knoten liegt eine Einschätzung vor, ob der Kauf empfohlen wird oder nicht (AKTUELLE KAUFEMPFEHLUNG). Enthält ein Knoten eine weitere Frage, ist die Einschätzung vermutlich besser, wenn man auch diese für die betrachtete Wohnung beantwortet und bei Ja in den linken, bei Nein in den rechten Teilbaum wechselt.

Die Einschätzung einer neuen Wohnung mithilfe des Baums endet erst, wenn ein Blatt erreicht ist oder der in einem Knoten zu vergleichende Kriterienwert wegen unvollständiger Angaben zur Wohnung fehlt.

Abbildung 2: Die Daten zu zwei Wohnungen · Wohnung 1 · Wohnung 2

Zimmeranzahl · 3 · 5

Quadratmeterpreis · 25 € · 30 €

Größe · 70 qm · unbekannt

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse Einschaetzungsprogramm

Objekte der Klasse Einschaetzungsprogramm dienen der Einschätzung von neuen Wohnungen hinsichtlich der Frage, ob sie zur weiteren Vermarktung angekauft werden sollten.

Auszug aus der Dokumentation der Klasse Einschaetzungsprogramm

Einschaetzungsprogramm()

Ein Objekt der Klasse Einschaetzungsprogramm wird initialisiert.

boolean ermittleKaufempfehlung(Wohnung pWohnung)

Die Anfrage liefert true, falls eine Kaufempfehlung für die übergebene Wohnung pWohnung gegeben wird. Sonst liefert sie false.

public void macheEtwas(List<Boolean> pPfad, Frage pFrage, boolean pKaufempfehlungBeiJa)

Die Methode wird in Aufgabenteil d) untersucht.

Die Klasse Wohnung

Ein Objekt der Klasse Wohnung repräsentiert eine Wohnung und verwaltet ihre Eigenschaften.

Auszug aus der Dokumentation der Klasse Wohnung

Wohnung(Integer pZimmeranzahl, Integer pQuadratmeterpreis, Integer pGroesse)

Ein Objekt der Klasse Wohnung wird initialisiert. Die als Parameter übergebenen Werte werden übernommen. Für Werte, die für die zugehörige Wohnung nicht vorliegen, soll dabei null übergeben werden.

Integer gibWert(int pKriteriumnummer)

Die Anfrage liefert den eingetragenen Wert des Kriteriums mit der als Parameter übergebenen Nummer pKriteriumnummer. Hierbei steht die Nummer 0 für die Zimmeranzahl, die Nummer 1 für den Quadratmeterpreis und die Nummer 2 für die Größe. Bei allen anderen Werten von pKriteriumnummer wird null zurückgeliefert. Wurde bei Erstellung des Wohnung-Objekts für ein Kriterium der Wert null übergeben, so wird entsprechend null als Wert von diesem Kriterium zurückgegeben.

Die Klasse Inhalt

Ein Objekt der Klasse Inhalt repräsentiert den einem Knoten eines Einschätzungsbaums zugewiesenen Inhalt. Mit einem Objekt der Klasse Inhalt kann daher sowohl die Einschätzung bzgl. einer Kaufempfehlung gemäß der Position im Baum gespeichert werden als auch eine präzisierende Frage in Form eines Objekts der Klasse Frage verwaltet werden.

Auszug aus der Dokumentation der Klasse Inhalt

Inhalt(boolean pKaufempfehlung)

Ein Objekt der Klasse Inhalt wird initialisiert und speichert den als Parameter übergebenen Wert pKaufempfehlung. Es wird zu Beginn kein Objekt der Klasse Frage verwaltet.

boolean gibKaufempfehlung()

Die Anfrage liefert den gespeicherten Wert für eine Kaufempfehlung.

Frage gibFrage()

Falls ein Objekt der Klasse Frage von diesem Inhalt-Objekt verwaltet wird, so wird es zurückgegeben. Sonst wird null zurückgegeben.

void setzeFrage(Frage pFrage)

Das als Parameter übergebene Objekt wird gespeichert. Wird null übergeben, so verwaltet dieses Inhaltsobjekt nach Ausführung kein Objekt der Klasse Frage.

Die Klasse Frage

Ein Objekt der Klasse Frage repräsentiert eine Frage, bei der der Wert eines Kriteriums einer Wohnung mit einem Schwellenwert verglichen wird. Hierfür verwaltet ein Objekt der Klasse Frage die Nummer eines Kriteriums und den Schwellenwert.

Auszug aus der Dokumentation der Klasse Frage

Frage(int pKriteriumnummer, int pSchwellenwert)

Ein Objekt der Klasse Frage wird mit den als Parameter übergebenen Werten initialisiert.

String gibAntwort(Wohnung pWohnung)

Wenn bei der übergebenen Wohnung pWohnung kein Wert für das Kriterium mit der von der Frage verwalteten Kriteriumnummer eingetragen ist, sondern dort null eingetragen ist, dann ist kein Vergleich mit dem Schwellenwert möglich und die Methode liefert den Wert null. Sonst vergleicht die Methode den betreffenden Kriterienwert der Wohnung mit dem von der Frage verwalteten Schwellenwert und gibt die Zeichenkette (den String) "Ja" zurück, falls der betreffende Kriterienwert der Wohnung kleiner gleich dem Schwellenwert ist, und gibt andernfalls die Zeichenkette (den String) "Nein" zurück.

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.

Die generische Klasse BinaryTree<ContentType>

Mithilfe der generischen Klasse BinaryTree können beliebig viele Objekte vom Typ ContentType in einem Binärbaum verwaltet werden. Ein Objekt der Klasse stellt entweder einen leeren Baum dar oder verwaltet ein Inhaltsobjekt sowie einen linken und einen rechten Teilbaum, die ebenfalls Objekte der generischen Klasse BinaryTree sind.

Dokumentation der Klasse BinaryTree<ContentType>

BinaryTree()

Nach dem Aufruf des Konstruktors existiert ein leerer Binärbaum.

BinaryTree(ContentType pContent)

Wenn der Parameter pContent ungleich null ist, existiert nach dem Aufruf des Konstruktors der Binärbaum und hat pContent als Inhaltsobjekt und zwei leere Teilbäume. Falls der Parameter null ist, wird ein leerer Binärbaum erzeugt.

BinaryTree(ContentType pContent, BinaryTree<ContentType> pLeftTree, BinaryTree<ContentType> pRightTree)

Wenn der Parameter pContent ungleich null ist, wird ein Binärbaum mit pContent als Inhaltsobjekt und den beiden Teilbäume pLeftTree und pRightTree erzeugt. Sind pLeftTree oder pRightTree gleich null, wird der entsprechende Teilbaum als leerer Binärbaum eingefügt. Wenn der Parameter pContent gleich null ist, wird ein leerer Binärbaum erzeugt.

boolean isEmpty()

Diese Anfrage liefert den Wahrheitswert true, wenn der Binärbaum leer ist, sonst liefert sie den Wert false.

void setContent(ContentType pContent)

Wenn der Binärbaum leer ist, wird der Parameter pContent als Inhaltsobjekt sowie ein leerer linker und rechter Teilbaum eingefügt. Ist der Binärbaum nicht leer, wird das Inhaltsobjekt durch pContent ersetzt. Die Teilbäume werden nicht geändert. Wenn pContent null ist, bleibt der Binärbaum unverändert.

ContentType getContent()

Diese Anfrage liefert das Inhaltsobjekt des Binärbaums. Wenn der Binärbaum leer ist, wird null zurückgegeben.

void setLeftTree(BinaryTree<ContentType> pTree)

Wenn der Binärbaum leer ist, wird pTree nicht angehängt. Andernfalls erhält der Binärbaum den übergebenen Baum als linken Teilbaum. Falls der Parameter null ist, ändert sich nichts.

void setRightTree(BinaryTree<ContentType> pTree)

Wenn der Binärbaum leer ist, wird pTree nicht angehängt. Andernfalls erhält der Binärbaum den übergebenen Baum als rechten Teilbaum. Falls der Parameter null ist, ändert sich nichts.

BinaryTree<ContentType> getLeftTree()

Diese Anfrage liefert den linken Teilbaum des Binärbaumes. Der Binärbaum ändert sich nicht. Wenn der Binärbaum leer ist, wird null zurückgegeben.

BinaryTree<ContentType> getRightTree()

Diese Anfrage liefert den rechten Teilbaum des Binärbaumes. Der Binärbaum ändert sich nicht. Wenn der Binärbaum leer ist, wird null zurückgegeben.

Das Ermitteln von Einschätzungen soll mit einem Programm automatisiert werden. Abbildung 3 zeigt einen Ausschnitt aus dem Implementationsdiagramm des Einschätzungsprogramms der Firma Besserwohnen.

b)

Aufgabenstellung: Aufgabe 2 - Objektorientierte Modellierung · Abitur NRW Informatik GK · Haupttermin 2023

Lösung

Nach den offiziellen Korrekturhinweisen

Beschreiben Sie, welche Beziehungen das Diagramm in Abbildung 3 zwischen den Klassen Einschaetzungsprogramm, BinaryTree, Inhalt und Frage darstellt.

Lösung: Ein Objekt der Klasse Einschaetzungsprogramm speichert Objekte vom Typ Inhalt in einem Binärbaum vom Typ BinaryTree. Dieses BinaryTree-Objekt wird dabei mit dem Attribut einschaetzungsbaum verwaltet. Ein Objekt der Klasse Inhalt kann ein Objekt der Klasse Frage verwalten.

Erläutern Sie, weshalb sich in der Klasse Wohnung die Werte der drei Kriterien Zimmeranzahl, Quadratmeterpreis und Größe mithilfe eines Feldes (Array) leichter verwalten lassen als mit einem Objekt der Klasse List.

Lösung: Der wahlfreie Zugriff auf die Kriterienwerte über die Kriteriennummer als Index ist einfacher zu realisieren als das Durchlaufen der Liste bis zum zugehörigen Kriterienwert. Da im Falle fehlender Kriterienwerte in ein Objekt der Klasse List im Gegensatz zum Feld nicht der Wert null eingetragen werden kann, müsste bei der Verwaltung mit einem Objekt der Klasse List auch hierfür eine Lösung überlegt werden.

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

Mehr Aufgaben zu Objektorientierte Modellierung mit Implementationsdiagrammen