Kostenrechner für die Klassenfahrt
AFB I–IIDie Klasse 9b fährt ins Schullandheim. Der Bus kostet 1200 Euro und soll gleichmäßig aufgeteilt werden. Lea schreibt dafür ein kleines Python-Programm:
1 teilnehmer = input("Wie viele fahren mit? ") 2 kosten = 1200 3 pro_kopf = kosten / teilnehmer 4 print("Jeder zahlt " + pro_kopf + " Euro")
Beim Test gibt sie 24 ein und erhält diese Meldung:
Wie viele fahren mit? 24
Traceback (most recent call last):
File "fahrt.py", line 3, in <module>
pro_kopf = kosten / teilnehmer
TypeError: unsupported operand type(s) for /: 'int' and 'str'- Bestimme bei der Eingabe 24 den Datentyp von
teilnehmer, vonkostenund vom Ergebnis des Ausdrucks1200 / 24. - Interpretiere die Fehlermeldung: In welcher Zeile tritt der Fehler auf, was bedeutet er, und warum wird er erst nach der Eingabe gemeldet?
- Wende die Umwandlungsfunktionen
int()undstr()an, um die Zeilen 1 und 4 so zu ändern, dass bei der Eingabe 24 „Jeder zahlt 50.0 Euro“ ausgegeben wird.
Hinweise
Hinweis zu Aufgabe a)
input immer zurück — egal, was eingetippt wird? Und welchen Typ liefert / in Python?Hinweis zu Aufgabe b)
/ verknüpft?Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
teilnehmer: String ("24"), weil input immer Text liefert. kosten: int. 1200 / 24: float (50.0), weil / in Python immer eine Kommazahl liefert.
Erwartungshorizont zu Aufgabe b)
Der Fehler tritt in Zeile 3 auf: Python soll eine ganze Zahl (int) durch einen Text (str) teilen — dafür ist / nicht definiert. Python ist dynamisch typisiert: Die Typen werden erst geprüft, wenn die Zeile ausgeführt wird. Deshalb laufen die Zeilen 1 und 2 (inklusive Eingabe) noch, und der Fehler erscheint erst beim Erreichen von Zeile 3.
Erwartungshorizont zu Aufgabe c)
Zeile 1: teilnehmer = int(input("Wie viele fahren mit? ")). Zeile 4: print("Jeder zahlt " + str(pro_kopf) + " Euro"). Ohne die zweite Änderung käme in Zeile 4 ein neuer TypeError, weil ein String nicht mit einem float verkettet werden kann. Ausgabe: Jeder zahlt 50.0 Euro.
Highscore mit Bonus
AFB II–IIIFür das Lernspiel der Schul-Website sollen Tim und Aylin einen Highscore verwalten. Der neue Punktestand kommt als Text aus einem Eingabefeld und soll anschließend um 10 Bonuspunkte erhöht werden. Tim programmiert in Java, Aylin in JavaScript. Tim behauptet: „Bei dynamischer Typisierung gibt es keine Typfehler — JavaScript ist also die sicherere Wahl.“
1 int highscore = 0; 2 String eingabe = "150"; 3 highscore = eingabe; 4 highscore = highscore + 10; 5 System.out.println(highscore);
1 let highscore = 0; 2 let eingabe = "150"; 3 highscore = eingabe; 4 if (highscore > 90) { 5 console.log("Neuer Rekord!"); 6 } 7 highscore = highscore + 10; 8 console.log(highscore);
- Analysiere, was bei beiden Programmen passiert, wenn sie übersetzt bzw. ausgeführt werden. Gib bei JavaScript die Ausgaben an.
- Überprüfe Tims Behauptung anhand deiner Ergebnisse aus a).
- Verändere Zeile 3 des JavaScript-Programms so, dass am Ende 160 ausgegeben wird.
- Bewerte, ob für eine große Schul-App, an der viele Personen über Jahre programmieren, eher eine statisch oder eine dynamisch typisierte Sprache geeignet ist.
Hinweise
Hinweis zu Aufgabe a)
highscore nach Zeile 3, und was bewirkt + mit einem String?Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Java: Der Compiler meldet in Zeile 3 einen Typfehler (incompatible types: String cannot be converted to int). Das Programm startet gar nicht. JavaScript: Nach Zeile 3 zeigt highscore auf den String "150". Beim Vergleich > 90 wird er in eine Zahl umgewandelt, also erscheint „Neuer Rekord!“. In Zeile 7 verkettet + aber: "150" + 10 ergibt "15010". Ausgaben: Neuer Rekord! und 15010.
Erwartungshorizont zu Aufgabe b)
Die Behauptung stimmt nicht. Richtig ist nur, dass JavaScript hier keine Fehlermeldung ausgibt. Der Typfehler ist aber trotzdem da: Statt 160 steht 15010 im Highscore — ein stiller Fehler, der erst später auffällt. Andere dynamische Sprachen wie Python melden solche Fehler zur Laufzeit (TypeError). Java findet den Fehler dagegen schon vor dem Start. „Keine Fehlermeldung“ bedeutet also nicht „sicherer“.
Erwartungshorizont zu Aufgabe c)
highscore = Number(eingabe); (auch parseInt(eingabe) oder parseInt(eingabe, 10) ist richtig). Dann ist highscore die Zahl 150, Zeile 7 rechnet 150 + 10 = 160.
Erwartungshorizont zu Aufgabe d)
Erwartet wird ein Urteil mit Abwägung. Für statische Typisierung: Typfehler werden vor dem Start gefunden, die Typangaben dokumentieren den Code für andere, Werkzeuge können besser helfen. Für dynamische Typisierung: weniger Schreibaufwand, schnelles Ausprobieren, flexibel bei kleinen Skripten. Naheliegendes Fazit: Für ein großes, langlebiges Projekt mit vielen Beteiligten spricht mehr für statische Typisierung; für kleine Skripte und Prototypen ist dynamische Typisierung bequem. Ein anderes, gut begründetes Urteil ist ebenfalls richtig.
