MINT lernen

Statische und dynamische Typen

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu Datentypen, Typfehlern und dem Unterschied zwischen statischer und dynamischer Typisierung.

Dein Fortschritt:
0 / 0 Aufgaben
1

Kostenrechner für die Klassenfahrt

AFB I–II

Die 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:

Python · fahrt.py
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:

Konsole
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'
  1. Bestimme bei der Eingabe 24 den Datentyp von teilnehmer, von kosten und vom Ergebnis des Ausdrucks 1200 / 24.
  2. Interpretiere die Fehlermeldung: In welcher Zeile tritt der Fehler auf, was bedeutet er, und warum wird er erst nach der Eingabe gemeldet?
  3. Wende die Umwandlungsfunktionen int() und str() 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)
Was liefert input immer zurück — egal, was eingetippt wird? Und welchen Typ liefert / in Python?
Hinweis zu Aufgabe b)
Lies die letzte Zeile der Meldung genau: Welche beiden Typen werden mit / verknüpft?
Hinweis zu Aufgabe c)
Zeile 4 hätte nach der Korrektur von Zeile 1 ebenfalls einen Typfehler: String plus float.

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.

2

Highscore mit Bonus

AFB II–III

Fü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.“

Java (Tim)
1  int highscore = 0;
2  String eingabe = "150";
3  highscore = eingabe;
4  highscore = highscore + 10;
5  System.out.println(highscore);
JavaScript (Aylin)
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);
Wo steht der Typ?
Java: Typ gehört zur Variableint0highscore"150"StringJavaScript: Typ gehört zum Werthighscore0number"150"stringvorhernach Zeile 3
In Java trägt die Variable ihren Typ, in JavaScript trägt ihn der Wert, auf den der Name gerade zeigt.
  1. Analysiere, was bei beiden Programmen passiert, wenn sie übersetzt bzw. ausgeführt werden. Gib bei JavaScript die Ausgaben an.
  2. Überprüfe Tims Behauptung anhand deiner Ergebnisse aus a).
  3. Verändere Zeile 3 des JavaScript-Programms so, dass am Ende 160 ausgegeben wird.
  4. 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)
Java: Was prüft der Compiler in Zeile 3? JavaScript: Welchen Typ hat highscore nach Zeile 3, und was bewirkt + mit einem String?
Hinweis zu Aufgabe b)
Gibt es in JavaScript eine Fehlermeldung — und ist das Ergebnis richtig? Denke auch an Python aus Aufgabe 1.
Hinweis zu Aufgabe c)
Der Text muss vor dem Rechnen ausdrücklich in eine Zahl umgewandelt werden.
Hinweis zu Aufgabe d)
Kriterien: Wann werden Fehler gefunden? Wie schnell kann man etwas ausprobieren? Wie gut verstehen andere den Code?

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.