Aufgabenblock — AFB II
Zehn Sachaufgaben aus Alltag und Schule: Fahrplan, Kasse, Passwortprüfung, Notenverwaltung, Wetterstation. Jede Aufgabe verbindet mehrere Themen des Kapitels — etwa Schleife und mod, Operation und globale Variable, Zeichenkette und ASCII. Übersetze zuerst die Situation, simuliere dann Schritt für Schritt (am besten mit Tracetabelle) und trage beide Ergebnisse ein. Wenn es hakt, helfen dir die drei gestuften Tipps.
Eine Fahrplan-App speichert Uhrzeiten als Minuten seit Mitternacht (0 bis 1439). Der Nachtbus fährt um 23:38 Uhr ab und ist 107 Minuten unterwegs. Die App rechnet:
start ← 23 · 60 + 38 t ← (start + 107) mod 1440 h ← t / 60 m ← t mod 60 Ausgabe: h, ":", m
a) Welche Stunde h zeigt die App als Ankunftszeit an? b) Welche Minute m?
Vollständige Lösung
start = 23 · 60 + 38 = 1418 Minuten. Mit Fahrzeit: 1418 + 107 = 1525. Ein Tag hat 24 · 60 = 1440 Minuten, also t = 1525 mod 1440 = 85 (der Bus kommt nach Mitternacht an). h = 85 / 60 = 1, m = 85 mod 60 = 25.
Antwort: Der Bus kommt um 1:25 Uhr an. Hinweis: Ohne mod 1440 käme h = 25 heraus — eine Uhrzeit, die es nicht gibt.
Ein Kassenautomat in der Mensa soll 4,68 € Rückgeld mit möglichst wenigen Münzen auszahlen. Er rechnet in Cent und geht die Münzwerte vom größten zum kleinsten durch:
rest ← 468 muenzen ← 0 für jeden wert in [200, 100, 50, 20, 10, 5, 2, 1] wiederhole anzahl ← rest / wert muenzen ← muenzen + anzahl rest ← rest mod wert ende für Ausgabe: muenzen
a) Wie viele Münzen gibt der Automat insgesamt aus? b) Welchen Wert hat rest direkt nach dem Durchlauf mit dem Münzwert 50?
Vollständige Lösung
| wert | anzahl | rest |
|---|---|---|
| 200 | 2 | 68 |
| 100 | 0 | 68 |
| 50 | 1 | 18 |
| 20 | 0 | 18 |
| 10 | 1 | 8 |
| 5 | 1 | 3 |
| 2 | 1 | 1 |
| 1 | 1 | 0 |
Summe der Spalte anzahl: 2 + 0 + 1 + 0 + 1 + 1 + 1 + 1 = 7 Münzen (2 × 2 €, 50 ct, 10 ct, 5 ct, 2 ct, 1 ct). Nach dem 50-ct-Durchlauf ist rest = 18.
Hinweis: Wer in Euro mit Kommazahlen rechnet, bekommt Rundungsfehler — deshalb rechnen Kassen intern in ganzen Cent.
Ein Anmeldeformular bewertet Passwörter mit der folgenden Operation. ascii(z) liefert den ASCII-Wert eines Zeichens.
Operation staerke(pw) z ← 0 g ← 0 für i von 0 bis länge(pw) − 1 wiederhole a ← ascii(pw[i]) wenn a ≥ 48 und a ≤ 57 dann z ← z + 1 ende wenn wenn a ≥ 65 und a ≤ 90 dann g ← g + 1 ende wenn ende für zurück länge(pw) + 2 · z + 3 · g
Ein Nutzer gibt das Passwort "Kiwi7Saft2023" ein. a) Welchen Wert hat z am Ende der Schleife? b) Welchen Wert liefert staerke zurück?
Vollständige Lösung
Das Passwort hat 13 Zeichen (Positionen 0 bis 12). Ziffern (ASCII 48–57): 7, 2, 0, 2, 3 → z = 5. Großbuchstaben (ASCII 65–90): K, S → g = 2. Kleinbuchstaben (97–122) zählen in keiner der beiden Bedingungen.
Rückgabe: 13 + 2 · 5 + 3 · 2 = 13 + 10 + 6 = 29.
Hinweis: Die zwei getrennten einseitigen Verzweigungen sind hier richtig — ein Zeichen kann nie gleichzeitig Ziffer und Großbuchstabe sein.
Eine Notenverwaltung speichert Punkte (0 bis 15) als int. Lina hat in Informatik die Klausur- und Mitarbeitsnoten 11, 8, 13, 9 und 12 Punkte. Das Programm rechnet:
int summe = 11 + 8 + 13 + 9 + 12; int anzahl = 5; int schnitt = summe / anzahl; int gerundet = (2 * summe + anzahl) / (2 * anzahl);
a) Welcher Wert steht in schnitt? b) Welcher Wert steht in gerundet?
Vollständige Lösung
summe = 53, der echte Durchschnitt ist 10,6. 53 / 5 schneidet ab: schnitt = 10. Die zweite Formel addiert vor dem Teilen die halbe Anzahl (in doppelter Genauigkeit): (2 · 53 + 5) / (2 · 5) = 111 / 10 = 11 — das ist korrekt gerundet.
Hinweis: Lina hätte durch die Ganzzahldivision einen Punkt verloren. In Python liefert 53 / 5 dagegen 10.6; ganzzahlig teilt dort nur //.
Bei einer Schul-Tombola gewinnt jedes Los, dessen Nummer rückwärts gelesen gleich bleibt. Das Prüfprogramm dreht die Losnummer mit / und mod um:
Eingabe: n r ← 0 solange n > 0 wiederhole r ← r · 10 + n mod 10 n ← n / 10 ende solange Ausgabe: r
Geprüft wird das Los mit der Nummer 4718. a) Welchen Wert hat r nach dem zweiten Schleifendurchlauf? b) Welcher Wert wird ausgegeben?
Vollständige Lösung
| Durchlauf | r | n |
|---|---|---|
| Start | 0 | 4718 |
| 1 | 8 | 471 |
| 2 | 81 | 47 |
| 3 | 817 | 4 |
| 4 | 8174 | 0 |
Nach vier Durchläufen ist n = 0, die Bedingung n > 0 ist falsch. Ausgabe: 8174. Da 8174 ≠ 4718, ist das Los keine Gewinnnummer.
Hinweis: Weil n in der Schleife verändert wird, muss sich das Programm die Originalnummer vorher in einer zweiten Variablen merken, um sie mit r vergleichen zu können.
In einem Lernspiel verwaltet ein Python-Programm die Münzen des Spielers in einer globalen Variablen:
muenzen = 20 def kaufe(preis): global muenzen if preis <= muenzen: muenzen = muenzen - preis return 1 return 0 def bonus(muenzen): muenzen = muenzen + 15 return muenzen k = kaufe(8) + kaufe(9) + kaufe(5) x = bonus(muenzen)
a) Welchen Wert hat k? b) Welchen Wert hat die globale Variable muenzen, nachdem alle Zeilen ausgeführt wurden?
global die globale Variable (Seiteneffekt). In bonus ist muenzen dagegen ein Parameter, also eine lokale Variable.Vollständige Lösung
Die drei Aufrufe laufen von links nach rechts: 1 + 1 + 0 = 2 erfolgreiche Käufe, danach sind noch 3 Münzen übrig. bonus(muenzen) bekommt eine Kopie des Werts 3 in den Parameter; das lokale muenzen wird 18 und zurückgegeben, also x = 18. Die globale Variable bleibt 3.
Hinweis: Der Bonus ist ein typischer Fehler — gleicher Name, aber anderer Speicherplatz. Richtig wäre muenzen = bonus(muenzen).
Die Schulplattform speichert Benutzernamen nur in Kleinbuchstaben und legt zusätzlich eine zweistellige Prüfsumme an. Für die Eingabe "MaxI" läuft:
Operation normiere(name) neu ← "" für i von 0 bis länge(name) − 1 wiederhole a ← ascii(name[i]) wenn a ≥ 65 und a ≤ 90 dann a ← a + 32 ende wenn neu ← neu + zeichen(a) ende für zurück neu Operation pruefsumme(s) summe ← 0 für i von 0 bis länge(s) − 1 wiederhole summe ← summe + ascii(s[i]) ende für zurück summe mod 100
a) Bei wie vielen Zeichen von "MaxI" ist die Bedingung der Verzweigung wahr? b) Welchen Wert liefert pruefsumme(normiere("MaxI"))?
Vollständige Lösung
Nur M (77) und I (73) liegen im Bereich 65–90 → 2 Zeichen werden umgewandelt: normiere("MaxI") = "maxi".
Prüfsumme: 109 + 97 + 120 + 105 = 431; 431 mod 100 = 31.
Hinweis: Weil vor der Summe normiert wird, erhalten „MaxI“, „maxi“ und „MAXI“ dieselbe Prüfsumme — genau das ist gewollt.
Eine Wetterstation speichert das Wetter von zehn Tagen als Zeichenkette: S = sonnig, W = wolkig, R = Regen. Heute lautet sie "SSRWSRRRSW". Ein Auswertungsalgorithmus:
anzahl ← 0 serie ← 0 laengste ← 0 für i von 0 bis länge(tage) − 1 wiederhole wenn tage[i] = "R" dann anzahl ← anzahl + 1 serie ← serie + 1 wenn serie > laengste dann laengste ← serie ende wenn sonst serie ← 0 ende wenn ende für
a) Welchen Wert hat anzahl am Ende? b) Welchen Wert hat laengste am Ende?
Vollständige Lösung
| i | tage[i] | anzahl | serie | laengste |
|---|---|---|---|---|
| 0 | S | 0 | 0 | 0 |
| 1 | S | 0 | 0 | 0 |
| 2 | R | 1 | 1 | 1 |
| 3 | W | 1 | 0 | 1 |
| 4 | S | 1 | 0 | 1 |
| 5 | R | 2 | 1 | 1 |
| 6 | R | 3 | 2 | 2 |
| 7 | R | 4 | 3 | 3 |
| 8 | S | 4 | 0 | 3 |
| 9 | W | 4 | 0 | 3 |
Es gab 4 Regentage, die längste Regenserie dauerte 3 Tage (Positionen 5 bis 7).
Hinweis: Ohne serie ← 0 im sonst-Zweig würde serie einfach alle R zählen — dann wäre laengste fälschlich 4.
Der Schulkiosk startet mit 100 Eis am Stiel. In jeder Pause wird ein Viertel des aktuellen Bestands verkauft (ganzzahlig, der Rest bleibt im Kühlfach). Nachbestellt wird, sobald weniger als 30 Eis übrig sind. Das Struktogramm rechts simuliert das.
a) Nach wie vielen Pausen muss nachbestellt werden? b) Wie viele Eis sind dann noch im Kühlfach?
Vollständige Lösung
| p | verkauf | bestand | bestand ≥ 30? |
|---|---|---|---|
| 0 | – | 100 | wahr |
| 1 | 25 | 75 | wahr |
| 2 | 18 | 57 | wahr |
| 3 | 14 | 43 | wahr |
| 4 | 10 | 33 | wahr |
| 5 | 8 | 25 | falsch |
Nach der 5. Pause ist bestand = 25 < 30, die Bedingung ist falsch, die Schleife endet. Ausgabe: 5 Pausen, 25 Eis.
Hinweis: Mit Kommazahlen (100 · 0,75⁵ ≈ 23,7) käme ein anderer Bestand heraus — die Ganzzahldivision bildet ab, dass nur ganze Eis verkauft werden.
Für 28 Referatsthemen lost ein Java-Programm eine Nummer aus. Die Themen 1–4 gehören zum Block 1, 5–8 zum Block 2 usw.
int nr = (int) (Math.random() * 28) + 1; int block = (nr - 1) / 4 + 1;
Beim Ziehen liefert Math.random() den Wert 0.4817. a) Welche Themennummer nr wird gezogen? b) Zu welchem block gehört sie?
Vollständige Lösung
0.4817 · 28 = 13.4876; (int) schneidet ab → 13; + 1 → nr = 14. Die Formel liefert nr immer zwischen 1 (bei 0.0) und 28 (bei Werten knapp unter 1).
block = (14 − 1) / 4 + 1 = 13 / 4 + 1 = 3 + 1 = 4. Kontrolle: Block 4 umfasst die Themen 13–16. Hinweis: Das „− 1 … + 1“ ist nötig, weil die Themen bei 1 beginnen; ohne es läge Thema 4 fälschlich in Block 2.
