MINT üben

Programmieren mit Java

Zehn Aufgaben, bei denen du nicht nur programmierst, sondern Entscheidungen begründest — warum dieser Typ, diese Klasse, diese Liste?

Dein Fortschritt:
0 / 0 Aufgaben
3

Aufgabenblock — AFB III

Begründen statt nur ausführen: Behauptungen widerlegen, Entwürfe beurteilen, Klassen selbst planen und erweitern. Formuliere deine Antwort erst selbst in ganzen Sätzen oder als Code, bevor du die Musterlösung aufklappst — sie zählt dann als erledigt.

A1
Kompiliert heißt fehlerfrei? Mensaplan
AFB III

Tom behauptet: „Java prüft alles vorab mit javac. Ein Programm, das sich ohne Fehlermeldung übersetzen lässt, kann beim Ausführen nicht mehr abstürzen — anders als Python.“

Widerlege Toms Aussage mit einem kurzen, vollständigen Java-Programm zum Mensaplan der Woche. Ordne dann ein, was an seiner Aussage trotzdem stimmt.

Hinweis: Überlege, welche Informationen javac hat und welche erst beim Ausführen feststehen.

Strategie: Ein einziges Gegenbeispiel genügt. Suche einen Fehler, bei dem alle Typen stimmen, aber ein Wert „nicht passt“.Warum so? Der Compiler prüft Syntax und Typen, nicht den Ablauf mit echten Werten.
Lösungsskizze: Array mit 5 Tagen, Schleife mit <= → Index 5 → ArrayIndexOutOfBoundsException. Richtig an Toms Aussage: Typ- und Syntaxfehler findet Java früher als Python.
Musterlösung anzeigen (zählt als erledigt)
public class Mensaplan {
    public static void main(String[] args) {
        String[] tage = {"Mo", "Di", "Mi", "Do", "Fr"};
        for (int i = 0; i <= tage.length; i++) {
            System.out.println(tage[i]);
        }
    }
}

Musterlösung: Das Programm lässt sich ohne Meldung übersetzen, denn Syntax und Typen stimmen. Beim Ausführen gibt es zuerst Mo bis Fr aus und bricht dann ab: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5. Welcher Index tatsächlich benutzt wird, steht erst zur Laufzeit fest — das kann javac nicht wissen. Toms Aussage ist also falsch.

Richtig ist: Java findet eine ganze Fehlergruppe schon vor dem Start, etwa int x = "drei"; oder ein fehlendes Semikolon. In Python fällt so etwas oft erst auf, wenn die betreffende Zeile läuft. Laufzeitfehler (Index zu groß, null-Zugriff) und Logikfehler bleiben aber in beiden Sprachen möglich — deshalb muss man auch in Java testen.

A2
Den passenden Typ wählen: Schulkiosk
AFB III

Die Schülerfirma baut ein Kassenprogramm für den Kiosk. Gespeichert werden sollen: der Preis eines Artikels in Euro mit Cent (z. B. 1,80), die Anzahl verkaufter Brezeln, ob auf eine Flasche Pfand kommt, der Artikelcode wie 0042 und die Größe eines Bechers (S, M oder L). Ein erster Test zeigt, was mit dem Code passiert:

int codeAlsZahl = 42;
System.out.println(codeAlsZahl);    // 42
String codeAlsText = "0042";
System.out.println(codeAlsText);    // 0042

Lege für jede der fünf Angaben einen Java-Typ fest und begründe deine Wahl, beim Artikelcode mithilfe der Testausgabe.

Strategie: Frage bei jeder Angabe: Wird damit gerechnet? Gibt es Nachkommastellen? Kommt es auf jedes Zeichen an?Warum so? Der Typ legt fest, welche Werte und Rechnungen möglich sind — und der Compiler prüft ihn für das ganze Programm.
Lösungsskizze: Preis double · Anzahl int · Pfand boolean · Code String · Größe char.
Musterlösung anzeigen (zählt als erledigt)

Preis: double preis — ein Preis wie 1,80 € hat Nachkommastellen, und mit dem Preis wird gerechnet (Summe, Rabatt). In int würde die Kommazahl nicht passen.

Anzahl Brezeln: int — es gibt nur ganze Brezeln. Pfand: boolean — nur ja oder nein. Größe: char — genau ein Zeichen ('S', 'M', 'L'); String ginge auch, erlaubt aber beliebig lange Texte.

Artikelcode: String code = "0042"; Mit dem Code wird nicht gerechnet, und die führenden Nullen gehören dazu. Als int gingen sie verloren: Die Testausgabe zeigt 42 statt 0042.

A3
Trickaufgabe — Die Schleife ohne Ende
AFB III

Für ein Brettspiel soll eine Figur in Zweierschritten auf Feld 0 zurücklaufen:

for (int feld = 15; feld != 0; feld -= 2) {
    System.out.println("Figur auf Feld " + feld);
}

Das Programm hört nicht mehr auf. Beweise, dass die Schleife mit Startwert 15 nie endet, und verallgemeinere: Für welche Startwerte endet sie? Gib an, für wie viele Startwerte von 1 bis 30 die Schleife endet.

Strategie: Suche eine Eigenschaft von feld, die sich bei feld -= 2 nie ändert.Warum so? Bleibt eine Eigenschaft immer gleich, die 0 aber nicht hat, kann feld nie 0 werden — ganz ohne alle Durchläufe aufzuschreiben.
Lösungsskizze: ungerade − 2 = ungerade; 0 ist gerade → nie erreicht. Gerade Startwerte ≥ 0 erreichen 0. Von 1 bis 30 sind das 2, 4, …, 30.
Musterlösung anzeigen (zählt als erledigt)

Beweis: Der Startwert 15 ist ungerade. Zieht man von einer ungeraden Zahl 2 ab, ist das Ergebnis wieder ungerade. Also ist feld nach jedem Durchlauf ungerade: 15, 13, …, 1, −1, −3, … Die 0 ist gerade und wird daher nie angenommen. Die Bedingung feld != 0 bleibt immer wahr — die Schleife endet nie.

Verallgemeinerung: Die Schleife endet genau dann, wenn der Startwert gerade und nicht negativ ist; dann läuft sie Startwert / 2 Mal. Von 1 bis 30 sind das die 15 geraden Zahlen 2, 4, …, 30.

Der Trick: Die Schleife sieht aus wie ein harmloser Countdown. Robuster ist feld > 0 statt feld != 0 — dann endet sie für jeden Startwert.