MINT lernen

Ein Problem in vielen Sprachen

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu Syntaxunterschieden und zum Übertragen eines Algorithmus.

Dein Fortschritt:
0 / 0 Aufgaben
1

Sparen in zwei Sprachen

AFB I–II

In der Informatik-AG schreiben Lena und Tom dasselbe Programm: Lena spart jede Woche 15 € Taschengeld, 20 € hat sie schon. Das Programm soll ausgeben, nach wie vielen Wochen sie mindestens 100 € für ein neues Fahrradschloss mit Alarm zusammenhat. Lena programmiert in Python, Tom in Java.

Python (Lena)
guthaben = 20
woche = 0
while guthaben < 100:
    guthaben = guthaben + 15
    woche = woche + 1
print(woche)
Java (Tom)
public class Sparen {
  public static void main(String[] args) {
    int guthaben = 20;
    int woche = 0;
    while (guthaben < 100) {
      guthaben = guthaben + 15;
      woche = woche + 1;
    }
    System.out.println(woche);
  }
}
  1. Nenne vier Unterschiede in der Schreibweise (Syntax) zwischen den beiden Programmen.
  2. Beschreibe, woran man in beiden Programmen erkennt, welche Zeilen zur Schleife gehören.
  3. Bestimme die Ausgabe beider Programme mithilfe einer Tabelle für guthaben und woche.

Hinweise

Hinweis zu Aufgabe a)
Achte auf Variablen, Zeilenenden, Blöcke, die Ausgabe und alles, was „um das Programm herum“ steht.
Hinweis zu Aufgabe b)
Python und Java nutzen dafür völlig verschiedene Zeichen — eines davon ist unsichtbar.
Hinweis zu Aufgabe c)
Trage nach jedem Schleifendurchlauf den neuen Stand ein. Die Schleife endet, sobald guthaben < 100 falsch ist.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Zum Beispiel (vier davon genügen):

  • Java gibt beim Anlegen den Typ an (int guthaben = 20;), Python nicht.
  • Java beendet Anweisungen mit Semikolon, Python nicht.
  • Java braucht einen Programmrahmen (class Sparen und main), Python beginnt direkt.
  • Ausgabe: print gegenüber System.out.println.
  • Die Bedingung steht in Java in runden Klammern, in Python folgt ein Doppelpunkt.
Erwartungshorizont zu Aufgabe b)

In Python gehören alle Zeilen zur Schleife, die unter while guthaben < 100: eingerückt sind; die erste nicht eingerückte Zeile (print(woche)) steht nach der Schleife. In Java markieren die geschweiften Klammern { } den Schleifenblock — die Einrückung ist dort nur für die Lesbarkeit da.

Erwartungshorizont zu Aufgabe c)

guthaben / woche: 20 / 0 → 35 / 1 → 50 / 2 → 65 / 3 → 80 / 4 → 95 / 5 → 110 / 6. Jetzt ist 110 < 100 falsch, die Schleife endet.

Beide Programme geben 6 aus: Nach 6 Wochen hat Lena 110 €. Die Ausgabe ist gleich, weil beide denselben Algorithmus umsetzen.

2

Ein Durchschnitt, drei Sprachen

AFB II–III

Mika hat für die Klassenfahrt-Planung ein Python-Programm geschrieben, das den Durchschnitt der Bewertungen von vier Ausflugszielen berechnet. Es gibt 2.25 aus. Weil die App der Klasse im Browser läuft und der Server in Go geschrieben ist, soll er das Programm übertragen.

Python
noten = [2, 3, 2, 2]
summe = 0
for n in noten:
    summe = summe + n
print(summe / len(noten))

Mika behauptet: „Wenn ich jede Zeile wörtlich übersetze, kommt in jeder Sprache 2.25 heraus.“

Vom Algorithmus zum Programm
Algorithmus: Notenschnitt 1. summe ← 0 2. für jede Note n: summe ← summe + n 3. Ausgabe: summe geteilt durch Anzahl Python summe / len(noten) JavaScript summe / noten.length Go summe / len(noten) derselbe Algorithmus — drei Schreibweisen für Schritt 3
Der Algorithmus ist sprachunabhängig; nur die Schreibweise ändert sich.
  1. Erläutere mithilfe der Abbildung, warum man den Algorithmus nur einmal entwerfen muss, auch wenn er in mehreren Sprachen laufen soll.
  2. Implementiere Mikas Programm in Go, sodass es ebenfalls 2.25 ausgibt.
  3. Untersuche, was die wörtliche Übersetzung der letzten Zeile in Go (fmt.Println(summe / len(noten))) und in JavaScript (console.log(summe / noten.length);) ausgibt.
  4. Beurteile Mikas Behauptung.

Hinweise

Hinweis zu Aufgabe a)
Was steht im oberen Kasten — und was steht erst in den unteren?
Hinweis zu Aufgabe b)
Du brauchst package main, import "fmt", func main(), eine Liste vom Typ []int und eine Schleife mit range. Für das Komma-Ergebnis müssen beide Zahlen vor dem Teilen in float64 umgewandelt werden.
Hinweis zu Aufgabe c)
In Go sind summe und len(noten) ganze Zahlen (int). Was macht / mit zwei ganzen Zahlen?
Hinweis zu Aufgabe d)
Nutze dein Ergebnis aus c). Gilt die Behauptung für alle Sprachen, für einige oder für keine?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Der Algorithmus beschreibt die Schritte (Summe bilden, durch die Anzahl teilen) ohne eine Sprache. Die drei Kästen unten zeigen nur verschiedene Schreibweisen desselben Schritts 3. Wer den Algorithmus einmal durchdacht hat, muss beim Übertragen nur noch die Syntax der neuen Sprache anwenden — Denkfehler im Ablauf müssen nicht in jeder Sprache neu gefunden werden.

Erwartungshorizont zu Aufgabe b)
Go
package main

import "fmt"

func main() {
    noten := []int{2, 3, 2, 2}
    summe := 0
    for _, n := range noten {
        summe = summe + n
    }
    fmt.Println(float64(summe) / float64(len(noten)))
}

Ausgabe: 2.25. Wichtig sind der Programmrahmen, := zum Anlegen, range mit _ für den nicht benötigten Index und die Umwandlung in float64.

Erwartungshorizont zu Aufgabe c)

Go: summe = 9 und len(noten) = 4 sind ganze Zahlen, 9 / 4 ergibt ganzzahlig 2. JavaScript kennt für beide nur den Typ number und rechnet 9 / 4 = 2.25.

Erwartungshorizont zu Aufgabe d)

Die Behauptung ist falsch — sie gilt nur für manche Sprachen. JavaScript (und PHP) liefern 2,25, Go (ebenso Java, C#, Rust) liefert bei wörtlicher Übersetzung 2, weil / zwischen ganzen Zahlen ganzzahlig teilt. Beim Übertragen reicht es also nicht, Wörter auszutauschen: Man muss die Besonderheiten der Zielsprache kennen und das Ergebnis testen.