MINT lernen

Abituraufgaben: Variablen und Datentypen

Zwei Abituraufgaben zu Variablen und Datentypen — mit Hinweisen und Erwartungshorizont.

Dein Fortschritt:
0 / 0 Aufgaben
1

Der Fahrradverleih

AFB I–II

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

  1. Ordnen Sie jeder der sechs Angaben begründet einen geeigneten Java-Datentyp zu.
  2. 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.
  3. Erläutern Sie, warum die Anweisung akku = 87.5; nicht übersetzt wird, während km = 1532; funktioniert.

Hinweise

Hinweis zu Aufgabe a)
Was wird gezählt, was gemessen, was ist ja/nein, was ein einzelnes Zeichen, was ein Text?
Hinweis zu Aufgabe b)
Deklaration und Initialisierung lassen sich in einer Zeile schreiben. Für das Verbuchen: Welche Variablen ändern sich — und wie schreibt man „erhöhe um“ als Zuweisung?
Hinweis zu Aufgabe c)
Welche Umwandlung macht Java automatisch, welche nur mit einem Cast — und was ginge dabei verloren?

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

2

Der Kassenbon

AFB II–III

Eine 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:

Java
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;
  1. Ermitteln Sie die Werte aller Variablen nach Ausführung des Ausschnitts — mithilfe einer Tracetabelle mit einer Spalte je Variable.
  2. 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.
  3. 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)
Rechne Zeile für Zeile. Beachte, dass summe in Zeile 6 überschrieben wird und Zeile 5 den alten Wert benutzt.
Hinweis zu Aufgabe b)
Probiere den Cast mit einem Betrag aus, dessen Nachkommateil größer als 0,5 ist. Was müsste man vor dem Abschneiden addieren?
Hinweis zu Aufgabe c)
Wann legt Java den Datentyp einer Variable fest — und wann Python?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
Zeileanzahleinzelpreissummeeurogrossbon
13
22.25
36.75
46
5false
60.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.