Der Fahrradverleih
AFB I–IIEin Fahrradverleih entwickelt eine App. Für jedes Leihrad sollen gespeichert werden: die Radnummer, der Kilometerstand mit einer Nachkommastelle, der Akkustand in ganzen Prozent, ob das Rad gerade ausgeliehen ist, ein Kennbuchstabe für die Kategorie (E für E-Bike, C für Cityrad) und der Name der Station, an der das Rad steht.
Das Rad Nummer 214 ist ein E-Bike, hat 1532,4 km gefahren, einen Akkustand von 87 %, ist nicht ausgeliehen und steht an der Station „Bahnhof“.
- Ordnen Sie jeder der sechs Angaben begründet einen geeigneten Java-Datentyp zu.
- Geben Sie Java-Anweisungen an, die sechs Variablen für das Rad 214 deklarieren und mit den genannten Werten initialisieren. Geben Sie außerdem Anweisungen an, die eine Ausleihe mit 12,5 km Fahrt und 9 Prozentpunkten Akkuverbrauch verbuchen.
- Erläutern Sie, warum die Anweisung
akku = 87.5;nicht übersetzt wird, währendkm = 1532;funktioniert.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Radnummer: int (fortlaufende ganze Zahl); Kilometerstand: double (Nachkommastelle); Akkustand: int (ganze Prozent); ausgeliehen: boolean (nur ja/nein); Kategorie: char (genau ein Zeichen); Station: String (beliebiger Text).
Erwartungshorizont zu Aufgabe b)
int nummer = 214; double km = 1532.4; int akku = 87; boolean ausgeliehen = false; char kategorie = 'E'; String station = "Bahnhof"; // Ausleihe verbuchen ausgeliehen = true; km = km + 12.5; // jetzt 1544.9 akku = akku - 9; // jetzt 78 ausgeliehen = false;
Wichtig: Dezimalpunkt statt Komma, char in einfachen, String in doppelten Anführungszeichen. Die Zuweisung km = km + 12.5 überschreibt den alten Kilometerstand.
Erwartungshorizont zu Aufgabe c)
akku hat den Typ int. Der Wert 87.5 ist ein double; beim Speichern in einer ganzzahligen Variable ginge die Nachkommastelle verloren. Java lässt diese einschränkende Umwandlung nur mit ausdrücklichem Cast zu, etwa akku = (int) 87.5; — und der schneidet ab (87). Umgekehrt ist km = 1532; erlaubt: Ein int passt ohne Informationsverlust in ein double und wird automatisch zu 1532.0 erweitert.
Der Kassenbon
AFB II–IIIEine Bäckerei druckt auf ihren Kassenbons den Betrag in ganzen Euro groß und die Cent klein darunter. Eine Auszubildende hat dafür folgenden Java-Ausschnitt geschrieben:
int anzahl = 3; double einzelpreis = 2.25; double summe = anzahl * einzelpreis; int euro = (int) summe; boolean gross = summe > 7; summe = summe - euro; String bon = "Summe: " + euro;
- Ermitteln Sie die Werte aller Variablen nach Ausführung des Ausschnitts — mithilfe einer Tracetabelle mit einer Spalte je Variable.
- Beurteilen Sie die Aussage eines Kollegen: „
(int)rundet den Betrag kaufmännisch, deshalb stimmt der Euro-Betrag auf dem Bon immer.“ Schlagen Sie gegebenenfalls eine Korrektur für positive Beträge vor. - Vergleichen Sie, wie Java und Python mit den Datentypen der Variablen umgehen, wenn am Ende zusätzlich
summe = "bezahlt";(Python:summe = "bezahlt") ausgeführt werden soll.
Hinweise
Hinweis zu Aufgabe a)
summe in Zeile 6 überschrieben wird und Zeile 5 den alten Wert benutzt.Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| Zeile | anzahl | einzelpreis | summe | euro | gross | bon |
|---|---|---|---|---|---|---|
| 1 | 3 | |||||
| 2 | 2.25 | |||||
| 3 | 6.75 | |||||
| 4 | 6 | |||||
| 5 | false | |||||
| 6 | 0.75 | |||||
| 7 | "Summe: 6" |
Endwerte: anzahl = 3, einzelpreis = 2.25, summe = 0.75, euro = 6, gross = false (6.75 ist nicht größer als 7), bon = "Summe: 6". int mal double ergibt ein double; summe enthält am Ende nur noch den Cent-Anteil.
Erwartungshorizont zu Aufgabe b)
Die Aussage ist falsch. (int) schneidet die Nachkommastellen ab: Aus 6.75 wird 6, kaufmännisch gerundet wäre es 7. Für den Bon ist das Abschneiden hier jedoch gerade gewollt: Groß steht der ganze Euro-Betrag (6), klein darunter der Rest (0.75). Der Bon ist also korrekt, die Begründung des Kollegen nicht. Wollte man tatsächlich auf ganze Euro runden, müsste man für positive Beträge vorher 0.5 addieren: int gerundet = (int) (summe + 0.5); — 6.75 + 0.5 = 7.25 wird zu 7, 6.25 + 0.5 = 6.75 wird zu 6.
Erwartungshorizont zu Aufgabe c)
Java ist statisch typisiert: summe wurde als double deklariert und darf nur Zahlen speichern. summe = "bezahlt"; ist ein Typfehler, das Programm wird nicht übersetzt. Python ist dynamisch typisiert: Der Typ gehört zum gespeicherten Wert, nicht zur Variable. Die Zuweisung ist erlaubt, summe enthält danach einen Text. Gemeinsam ist beiden, dass die Zuweisung den alten Wert überschreibt. Javas Strenge fängt Fehler früh ab; in Python fällt ein versehentlicher Typwechsel erst auf, wenn später mit summe gerechnet werden soll.
