MINT lernen

Statische Datentypen

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu int, double, Umwandlungen und Ganzzahldivision.

Dein Fortschritt:
0 / 0 Aufgaben
1

Anmeldung zum Sportfest

AFB I–II

Für das Sportfest der Schule baut die Informatik-AG eine Java-App. Für Jonas soll sie speichern: Startnummer 17, Vorname Jonas, Weitsprung 4,35 m, Riege B (ein einzelner Buchstabe) und ob das Startgeld bezahlt ist (ja). Beim Programmieren sind der AG ein paar Zeilen misslungen (Material 1). Außerdem sollen 23 Kinder auf Staffelteams zu je 4 Kindern verteilt werden (Material 2).

Material 1: Deklarationen der AG
int runden = 3.5;
double zeit = 12;
boolean bezahlt = "ja";
char riege = "B";
String nummer = 17;
Fünf einzelne Zeilen aus der main-Methode
Material 2: Staffelteams einteilen
int teams = 23 / 4;
int rest = 23 % 4;
double schnitt = 23 / 4;
double genau = 23 / 4.0;
int gekuerzt = (int) genau;
23 Kinder, 4 Kinder pro Team
  1. Gib für jede der fünf Angaben zu Jonas eine passende Java-Deklaration mit Datentyp, Variablenname und Wert an.
  2. Überprüfe jede Zeile in Material 1: Übersetzt javac sie? Wenn nicht, nenne den Grund und eine Korrektur.
  3. Berechne die Werte aller fünf Variablen in Material 2 und deute sie für die Teameinteilung.

Hinweise

Hinweis zu Aufgabe a)
Ganze Zahl, Kommazahl, wahr/falsch, ein Zeichen oder Text? Einzelne Zeichen stehen in einfachen, Texte in doppelten Anführungszeichen. Im Java-Code steht ein Dezimalpunkt.
Hinweis zu Aufgabe b)
Java wandelt automatisch nur „verlustfrei“ um, also von int nach double. Alles andere muss vom Typ her passen.„Überprüfen“ heißt: jede Zeile an den Typregeln messen und Widersprüche benennen.
Hinweis zu Aufgabe c)
Sind beide Zahlen int, rechnet Java ganzzahlig – auch wenn das Ergebnis danach in einer double-Variablen landet. % liefert den Rest.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
int startnummer = 17;
String vorname = "Jonas";
double weitsprung = 4.35;
char riege = 'B';
boolean bezahlt = true;

Variablennamen dürfen abweichen. Die Startnummer darf auch als String gespeichert werden ("17"), wenn man mit ihr nicht rechnet.

Erwartungshorizont zu Aufgabe b)
ZeileErgebnisKorrektur
int runden = 3.5;Fehler: possible lossy conversion from double to int – die Nachkommastellen gingen verloren.double runden = 3.5;
double zeit = 12;übersetzt, int wird automatisch zu 12.0–
boolean bezahlt = "ja";Fehler: String cannot be converted to booleanboolean bezahlt = true;
char riege = "B";Fehler: String cannot be converted to charchar riege = 'B';
String nummer = 17;Fehler: int cannot be converted to StringString nummer = "17";
Erwartungshorizont zu Aufgabe c)

teams = 23 / 4 = 5 (ganzzahlig), rest = 23 % 4 = 3, denn 5 · 4 = 20 und 23 − 20 = 3. schnitt = 5.0: Erst wird ganzzahlig 5 gerechnet, dann in double umgewandelt. genau = 5.75, weil 4.0 eine Kommazahl ist. gekuerzt = 5, der Cast schneidet ab (rundet nicht).

Deutung: Es gibt 5 volle Teams, 3 Kinder bleiben übrig. Rechnerisch wären es 5,75 Teams.

2

Sparen für neue Kopfhörer

AFB II–III

Sophie möchte sich Kopfhörer für 180 € kaufen. Sie bekommt 25 € Taschengeld im Monat und legt alles zur Seite. Ihr Programm soll ausgeben, wie viele Monate sie sparen muss und wie viel Prozent des Preises sie pro Monat schafft. Das Programm läuft ohne Absturz, aber Sophie wundert sich über die Ausgabe. Ihr Bruder meint: „Statische Typen sind nur lästig. In Python wäre dir das nicht passiert.“

Material: Sparplan.java
public class Sparplan {
    public static void main(String[] args) {
        int taschengeld = 25;   // Euro pro Monat
        int ziel = 180;         // Preis der Kopfhörer in Euro
        int monate = ziel / taschengeld;
        System.out.println("Du brauchst " + monate + " Monate.");
        double anteil = taschengeld / ziel * 100;
        System.out.println("Pro Monat schaffst du " + anteil + " %.");
    }
}
Sophies erste Version
  1. Bestimme die Ausgabe des Programms Schritt für Schritt.
  2. Erläutere, warum beide Ausgaben für Sophie falsch sind und welche Typregel jeweils dahintersteckt.
  3. Implementiere eine verbesserte Version, die die richtige Anzahl Monate und den Prozentwert mit Nachkommastellen ausgibt. Taschengeld und Preis sollen sich nach dem Festlegen nicht mehr ändern lassen.
  4. Nimm Stellung zur Aussage von Sophies Bruder.

Hinweise

Hinweis zu Aufgabe a)
Rechne jeden Ausdruck von links nach rechts und achte darauf, ob int oder double gerechnet wird.
Hinweis zu Aufgabe b)
Hat Sophie nach 7 Monaten wirklich 180 €? Wann wird bei taschengeld / ziel abgeschnitten – vor oder nach dem * 100?
Hinweis zu Aufgabe c)
Aufrunden: Bleibt bei der Division ein Rest, braucht Sophie einen Monat mehr. Für den Prozentwert muss mindestens eine Zahl eine Kommazahl sein, bevor geteilt wird. Unveränderliche Werte markierst du mit final.
Hinweis zu Aufgabe d)
Was rechnet Python bei 25 / 180 und bei 180 / 25? Wäre damit die Monatszahl richtig? Welche Fehler findet der Java-Compiler, welche nicht?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

monate = 180 / 25 = 7 (ganzzahlig, Rest 5). taschengeld / ziel = 25 / 180 = 0 (ganzzahlig), 0 · 100 = 0, gespeichert als 0.0.

Du brauchst 7 Monate.
Pro Monat schaffst du 0.0 %.
Erwartungshorizont zu Aufgabe b)

Monate: Nach 7 Monaten hat Sophie erst 7 · 25 € = 175 €. Die Ganzzahldivision schneidet den Rest (5 €) einfach ab; richtig wären 8 Monate.

Prozent: Sind beide Operanden int, ist auch das Ergebnis int. 25 / 180 ergibt 0, erst danach wird mit 100 multipliziert. Dass das Ergebnis in einer double-Variablen landet, hilft nicht mehr: Die Umwandlung passiert erst nach der Rechnung. Richtig wären etwa 13,9 %.

Erwartungshorizont zu Aufgabe c)
public class Sparplan {
    public static void main(String[] args) {
        final int TASCHENGELD = 25;   // Euro pro Monat
        final int ZIEL = 180;         // Preis der Kopfhörer in Euro
        int monate = ZIEL / TASCHENGELD;
        if (ZIEL % TASCHENGELD != 0) {
            monate = monate + 1;
        }
        System.out.println("Du brauchst " + monate + " Monate.");
        double anteil = 100.0 * TASCHENGELD / ZIEL;
        System.out.println("Pro Monat schaffst du " + anteil + " %.");
    }
}

Ausgabe: Du brauchst 8 Monate. und Pro Monat schaffst du 13.88888888888889 %. Andere richtige Lösungen (z. B. (double) taschengeld / ziel * 100) sind gleichwertig. Die if-Abfrage darf nicht fehlen: Ohne sie wäre z. B. bei 200 € Preis die Rechnung richtig, bei 180 € aber falsch.

Erwartungshorizont zu Aufgabe d)

Teilweise richtig: In Python liefert / immer eine Kommazahl: 25 / 180 * 100 ergibt etwa 13,9. Der Prozentfehler wäre dort nicht passiert.

Aber: 180 / 25 ergibt in Python 7.2 – Sophie müsste auch dort selbst aufrunden. Der Monatsfehler ist ein Denkfehler, kein Typproblem. Außerdem helfen statische Typen: javac hätte z. B. int monate = 7.2; gar nicht erst übersetzt und so auf das Abschneiden aufmerksam gemacht.

Mögliche Position: Die Aussage stimmt nur für die Prozentrechnung. Statische Typen sind nicht nur lästig; man muss aber wissen, dass int / int ganzzahlig rechnet. Jede begründete Position, die beide Seiten abwägt, ist vollständig.