Sparen in zwei Sprachen
AFB I–IIIn 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.
guthaben = 20
woche = 0
while guthaben < 100:
guthaben = guthaben + 15
woche = woche + 1
print(woche)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);
}
}- Nenne vier Unterschiede in der Schreibweise (Syntax) zwischen den beiden Programmen.
- Beschreibe, woran man in beiden Programmen erkennt, welche Zeilen zur Schleife gehören.
- Bestimme die Ausgabe beider Programme mithilfe einer Tabelle für
guthabenundwoche.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
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 Sparenundmain), Python beginnt direkt. - Ausgabe:
printgegenüberSystem.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.
Ein Durchschnitt, drei Sprachen
AFB II–IIIMika 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.
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.“
- Erläutere mithilfe der Abbildung, warum man den Algorithmus nur einmal entwerfen muss, auch wenn er in mehreren Sprachen laufen soll.
- Implementiere Mikas Programm in Go, sodass es ebenfalls
2.25ausgibt. - 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. - Beurteile Mikas Behauptung.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
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)
summe und len(noten) ganze Zahlen (int). Was macht / mit zwei ganzen Zahlen?Hinweis zu Aufgabe d)
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)
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.
