MINT lernen

Abituraufgaben: Klassendiagramme lesen

Zwei Abituraufgaben mit Hinweisen und Erwartungshorizont: Klassenkarten lesen und Aufrufe prüfen – Konzertkasse und Fitnesstracker.

Dein Fortschritt:
0 / 0 Aufgaben
1

Ticketverkauf für Konzerte

AFB I–II

Eine Veranstaltungsagentur verkauft Tickets für Konzerte in der Stadthalle über eine eigene Software. Jedes Konzert wird mit Künstlerin oder Band, Datum, Kapazität der Halle und Ticketpreis angelegt. Die Software verkauft Tickets nur, solange genügend Plätze frei sind, und kann ein Konzert absagen. Den Entwurf der zentralen Klasse zeigt Material 1.

Material 1: Klassenkarte Konzert
Konzert
  • - kuenstler: Zeichenkette
  • - datum: Zeichenkette
  • - kapazitaet: Ganzzahl
  • - verkauft: Ganzzahl
  • - preis: Fließkommazahl
  • - abgesagt: Wahrheitswert
  • c Konzert(kuenstler: Zeichenkette, datum: Zeichenkette, kapazitaet: Ganzzahl, preis: Fließkommazahl)
  • + ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswert
  • + absagen()
  • + getRestplaetze(): Ganzzahl
  • + istAusverkauft(): Wahrheitswert
  • + getUmsatz(): Fließkommazahl
  • + setPreis(neuerPreis: Fließkommazahl)
Entwurf der Agentur (Ausschnitt)
Material 2: Notizen des Mitarbeiters

(1) Die Anzahl der verkauften Tickets wird beim Anlegen eines Konzerts als Parameter übergeben.
(2) Ein anderes Programmteil kann den Wert von verkauft direkt auf 500 setzen.
(3) getUmsatz() liefert eine Kommazahl zurück.
(4) absagen() meldet mit wahr zurück, ob die Absage geklappt hat.
(5) Der Preis eines Konzerts lässt sich nach dem Anlegen ändern, der Name der Künstlerin nicht.

Handschriftliche Notizen, abgetippt
  1. Beschreiben Sie die Bedeutung der drei Einträge - verkauft: Ganzzahl, c Konzert(…) und + ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswert unter Verwendung der Fachsprache.
  2. Ordnen Sie jede der sechs Methoden begründet den Kategorien Anfrage und Auftrag zu. Gehen Sie dabei auf eine Methode ein, bei der die Zuordnung nicht eindeutig ist.
  3. Ein Mitarbeiter der Agentur hat sich zum Entwurf Notizen gemacht (Material 2). Überprüfen Sie jede Aussage anhand der Klassenkarte und korrigieren Sie falsche Aussagen.

Hinweise

Hinweis zu Aufgabe a)
Achte bei jedem Eintrag auf alle Bestandteile: Zeichen am Anfang (-, +, c), Name, Parameterliste in Klammern und Angabe nach dem Doppelpunkt.„Beschreiben“ heißt: in eigenen Worten und mit Fachbegriffen (Sichtbarkeit, Datentyp, Parameter, Rückgabetyp) wiedergeben.
Hinweis zu Aufgabe b)
Eine Anfrage liefert einen Wert und lässt den Zustand unverändert; ein Auftrag verändert den Zustand. Was tut eine Methode, die Tickets verkauft und einen Wahrheitswert zurückgibt?
Hinweis zu Aufgabe c)
Schau für (1) in die Parameterliste des Konstruktors, für (2) auf die Sichtbarkeit, für (4) auf den Rückgabetyp, für (5) auf die vorhandenen set-Methoden.„Überprüfen“ heißt: jede Aussage an der Klassenkarte messen und Widersprüche aufdecken – mit Beleg aus dem Diagramm.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

- verkauft: Ganzzahl ist ein privates Attribut (Minuszeichen) mit dem Datentyp Ganzzahl. Es speichert, wie viele Tickets bereits verkauft wurden, und ist nur innerhalb der Klasse direkt zugänglich.

c Konzert(…) ist der Konstruktor (Kennzeichen c). Er wird beim Erzeugen eines neuen Konzert-Objekts aufgerufen und erhält vier Parameter (Künstler, Datum, Kapazität, Preis), mit denen die Attribute initialisiert werden. Ein Konstruktor hat keinen Rückgabetyp.

+ ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswert ist eine öffentliche Methode (Pluszeichen) mit einem Parameter anzahl vom Typ Ganzzahl. Sie liefert einen Wahrheitswert zurück – vermutlich wahr, wenn der Verkauf möglich war.

Erwartungshorizont zu Aufgabe b)

Anfragen (Rückgabetyp, Zustand bleibt unverändert): getRestplaetze(), istAusverkauft(), getUmsatz().

Aufträge (kein Rückgabetyp, verändern den Zustand): absagen() setzt abgesagt, setPreis(…) ändert preis.

Nicht eindeutig: ticketsVerkaufen(…) verändert den Zustand (erhöht verkauft) und ist damit ein Auftrag, liefert aber zusätzlich einen Wert als Rückmeldung, ob der Verkauf geklappt hat. Es handelt sich um einen Auftrag mit Rückmeldung; die Zuordnung „Auftrag“ ist mit dieser Begründung zu erwarten.

Erwartungshorizont zu Aufgabe c)

(1) Falsch. Der Konstruktor hat nur die Parameter kuenstler, datum, kapazitaet und preis; verkauft wird intern mit einem Startwert (sinnvoll: 0) belegt.

(2) Falsch. verkauft ist privat und kann von außen weder gelesen noch gesetzt werden. Es gibt auch keine Methode setVerkauft; der Wert ändert sich nur über ticketsVerkaufen.

(3) Richtig. Der Rückgabetyp ist Fließkommazahl.

(4) Falsch. absagen() hat keinen Rückgabetyp und liefert daher nichts zurück; ob abgesagt ist, lässt sich mit den vorhandenen Methoden gar nicht abfragen.

(5) Richtig. Es gibt setPreis, aber keine Methode, die kuenstler verändert. (Streng genommen lässt sich der Name auch nicht abfragen, weil getKuenstler() fehlt.)

2

Schrittzähler eines Fitnesstrackers

AFB II–III

Ein Start-up entwickelt die Software für ein Fitnessarmband. Der Tracker zählt Schritte, rechnet sie mithilfe der hinterlegten Schrittlänge (in Metern) in eine Strecke in Kilometern um und zeigt an, ob das persönliche Tagesziel erreicht ist. Um Mitternacht beginnt ein neuer Tag, dann wird der Schrittzähler zurückgesetzt. Der Akku wird über eine Ladeschale geladen. Die Firmware-Entwicklerin hat das Klassendiagramm aus Material 3 vorgegeben.

Ein Praktikant hat mit dieser Klasse einen ersten Programmausschnitt für die Handy-App geschrieben (Material 4). Die Entwicklerin vermutet, dass sich darin mehrere Aufrufe finden, die nicht zum Klassendiagramm passen.

Material 3: Klassenkarte Fitnesstracker
Fitnesstracker
  • - besitzer: Zeichenkette
  • - schritte: Ganzzahl
  • - schrittlaenge: Fließkommazahl
  • - tagesziel: Ganzzahl
  • - akkustand: Ganzzahl
  • c Fitnesstracker(besitzer: Zeichenkette, schrittlaenge: Fließkommazahl)
  • + schrittZaehlen()
  • + neuerTag()
  • + getSchritte(): Ganzzahl
  • + getStrecke(): Fließkommazahl
  • + setTagesziel(ziel: Ganzzahl)
  • + istZielErreicht(): Wahrheitswert
  • + laden(prozent: Ganzzahl)
  • + getAkkustand(): Ganzzahl
Stand der Firmware-Version 0.9
Material 4: Programmausschnitt des Praktikanten
Fitnesstracker t = new Fitnesstracker("Lena", 0.7);   // Zeile 1
t.setTagesziel(8000);                                 // Zeile 2
int s = t.schrittZaehlen();                           // Zeile 3
t.schritte = 0;                                       // Zeile 4
boolean ok = t.istZielErreicht();                     // Zeile 5
t.laden();                                            // Zeile 6
double km = t.getStrecke();                           // Zeile 7
Fitnesstracker u = new Fitnesstracker("Tom");         // Zeile 8
double l = t.getSchrittlaenge();                      // Zeile 9
Die Zeilennummern sind als Kommentare angegeben.
  1. Untersuchen Sie jede Zeile von Material 4 darauf, ob der Aufruf zum Klassendiagramm passt. Begründen Sie für jede unpassende Zeile, gegen welche Angabe der Klassenkarte sie verstößt.
  2. Im Diagramm ist das Attribut schritte privat, und es gibt keine Methode setSchritte. Begründen Sie diese Entwurfsentscheidung und beschreiben Sie, wie der Schrittstand trotzdem verändert und abgefragt werden kann.
  3. Der Tracker soll zusätzlich den Puls messen. Gespeichert werden soll der zuletzt gemessene Puls sowie das Alter der tragenden Person, aus dem sich der Maximalpuls (220 − Alter) ergibt. Die App soll abfragen können, ob der aktuelle Puls über 90 % des Maximalpulses liegt. Erweitern Sie die Klassenkarte aus Material 3 entsprechend.
  4. Ein Entwickler schlägt vor, die Methode getStrecke() durch ein zusätzliches Attribut - strecke: Fließkommazahl mit einer Methode getStrecke() zu ersetzen, das bei jedem Aufruf von schrittZaehlen() um die Schrittlänge erhöht wird. Bewerten Sie diesen Vorschlag.

Hinweise

Hinweis zu Aufgabe a)
Prüfe pro Zeile vier Dinge: Gibt es die Methode oder den Konstruktor überhaupt? Stimmen Anzahl und Typen der Parameter? Wird ein Rückgabewert verwendet, obwohl es keinen gibt (oder er den falschen Typ hat)? Wird von außen auf etwas Privates zugegriffen?„Untersuchen“ heißt: unter der Leitfrage „passt der Aufruf?“ Zeile für Zeile prüfen und das Ergebnis darstellen.
Hinweis zu Aufgabe b)
Was könnte passieren, wenn jeder Programmteil die Schrittzahl beliebig setzen dürfte – etwa auf einen negativen Wert oder auf 50 000 vor einem Wettbewerb? Welche Methoden ändern den Wert kontrolliert?
Hinweis zu Aufgabe c)
Zwei neue Attribute, eine Möglichkeit, sie zu setzen (Messung, Alter), und Anfragen. Muss der Maximalpuls gespeichert werden?
Hinweis zu Aufgabe d)
Mögliche Kriterien: doppelt gespeicherte Information (Redundanz), Gefahr widersprüchlicher Werte (z. B. bei neuerTag()), Rechenaufwand auf dem Armband, Speicherbedarf, Rundungsfehler durch wiederholtes Addieren.„Bewerten“ heißt: den Vorschlag an Kriterien messen und ein begründetes Werturteil abgeben.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Passend: Zeile 1 (Konstruktor mit Zeichenkette und Fließkommazahl), Zeile 2 (Ganzzahl-Parameter), Zeile 5 (Rückgabe Wahrheitswert), Zeile 7 (Rückgabe Fließkommazahl).

Zeile 3: schrittZaehlen() hat keinen Rückgabetyp; das Ergebnis kann keiner Variablen zugewiesen werden.

Zeile 4: schritte ist privat; ein Zugriff von außen ist nicht erlaubt. Zum Zurücksetzen ist neuerTag() vorgesehen.

Zeile 6: laden erwartet einen Parameter prozent vom Typ Ganzzahl; er fehlt.

Zeile 8: Es gibt keinen Konstruktor mit nur einem Parameter; die Schrittlänge muss mit übergeben werden.

Zeile 9: Die Methode getSchrittlaenge() ist in der Klassenkarte nicht vorhanden; das Attribut ist privat.

Erwartungshorizont zu Aufgabe b)

Die Schrittzahl soll nur durch tatsächlich gezählte Schritte entstehen. Wäre schritte öffentlich oder gäbe es einen Setter, könnte jeder Programmteil beliebige (auch negative) Werte eintragen; die Daten wären unzuverlässig, z. B. bei Schrittwettbewerben. Durch die private Sichtbarkeit bleibt der Zustand in der Verantwortung des Objekts (Datenkapselung).

Verändert wird der Wert nur kontrolliert über die Aufträge schrittZaehlen() (um eins erhöhen) und neuerTag() (auf 0 setzen); abgefragt wird er über die Anfrage getSchritte().

Erwartungshorizont zu Aufgabe c)
Fitnesstracker (Ergänzung)
  • - puls: Ganzzahl
  • - alter: Ganzzahl
  • c Fitnesstracker(besitzer: Zeichenkette, schrittlaenge: Fließkommazahl, alter: Ganzzahl)
  • + pulsMessen(wert: Ganzzahl)
  • + getPuls(): Ganzzahl
  • + setAlter(alter: Ganzzahl)
  • + getMaximalpuls(): Ganzzahl
  • + istPulsZuHoch(): Wahrheitswert

Der Maximalpuls wird nicht gespeichert, sondern aus dem Alter berechnet. Das Alter kann über den Konstruktor oder setAlter festgelegt werden; beides (oder eines von beiden) ist zu akzeptieren. istPulsZuHoch() ist eine Anfrage mit Rückgabetyp Wahrheitswert. Die übrigen Einträge aus Material 3 bleiben erhalten.

Erwartungshorizont zu Aufgabe d)

Für den Vorschlag: Die Strecke muss beim Abfragen nicht berechnet werden. Dieser Vorteil ist jedoch sehr gering, da nur eine Multiplikation anfällt.

Gegen den Vorschlag: Die Strecke ergibt sich vollständig aus schritte und schrittlaenge; ein zusätzliches Attribut speichert dieselbe Information doppelt (Redundanz). Jede Methode, die schritte ändert, muss nun auch strecke anpassen – wird das z. B. in neuerTag() vergessen, entstehen widersprüchliche Zustände. Durch zehntausendfaches Addieren von 0.7 summieren sich außerdem Rundungsfehler. Das Diagramm wird größer, ohne dass die Klasse mehr kann.

Mögliches Urteil: Der Vorschlag ist abzulehnen; eine abgeleitete Größe sollte über eine Anfrage berechnet werden. Erwartet werden mindestens zwei Kriterien und ein daraus abgeleitetes, eindeutiges Urteil.