Anmeldung zum Sportfest
AFB I–IIFü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).
int runden = 3.5; double zeit = 12; boolean bezahlt = "ja"; char riege = "B"; String nummer = 17;
main-Methodeint teams = 23 / 4; int rest = 23 % 4; double schnitt = 23 / 4; double genau = 23 / 4.0; int gekuerzt = (int) genau;
- Gib für jede der fünf Angaben zu Jonas eine passende Java-Deklaration mit Datentyp, Variablenname und Wert an.
- Überprüfe jede Zeile in Material 1: Übersetzt
javacsie? Wenn nicht, nenne den Grund und eine Korrektur. - Berechne die Werte aller fünf Variablen in Material 2 und deute sie für die Teameinteilung.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
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)
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)
| Zeile | Ergebnis | Korrektur |
|---|---|---|
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 boolean | boolean bezahlt = true; |
char riege = "B"; | Fehler: String cannot be converted to char | char riege = 'B'; |
String nummer = 17; | Fehler: int cannot be converted to String | String 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.
Sparen für neue Kopfhörer
AFB II–IIISophie 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.“
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 + " %.");
}
}
- Bestimme die Ausgabe des Programms Schritt für Schritt.
- Erläutere, warum beide Ausgaben für Sophie falsch sind und welche Typregel jeweils dahintersteckt.
- 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.
- Nimm Stellung zur Aussage von Sophies Bruder.
Hinweise
Hinweis zu Aufgabe a)
int oder double gerechnet wird.Hinweis zu Aufgabe b)
taschengeld / ziel abgeschnitten – vor oder nach dem * 100?Hinweis zu Aufgabe c)
final.Hinweis zu Aufgabe d)
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.
