Benutzer-Werkzeuge

Webseiten-Werkzeuge


einstieg:geschachtelt:start

Ineinandergeschachtelte Wiederholungen ("Schleifen"/"Loops")

Es kommt häufig vor, dass ein Programmteil wiederholt werden muss, in dem selbst schon eine Wiederholung steckt. Wofür das gut ist und wie es geht, zeige ich Dir am besten an ein paar Beispielen.

Beispiel 1: Einmaleinstabelle

Kennst Du noch die Bleistifte mit den winzigen Einmaleinstabellen drauf, die in der Grundschule streng verboten sind? Die Einmaleinstabelle sieht so aus:

1  2  3  4 5  6  7  8  9  10
2  4  6  8  10 12 14 16 18 20
3  6  9  12 15 18 21 24 27 30
4  8  12 16 20 24 28 32 36 40
5  10 15 20 25 30 35 40 45 50
6  12 18 24 30 36 42 48 54 60
7  14 21 28 35 42 49 56 63 70
8  16 24 32 40 48 56 64 72 80 ​
9  18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100 

Wir wollen ein Programm schreiben, das die Einmaleinstabelle auf dem Bildschirm ausgibt.

Strategie: Divide and conquer (Teile und herrsche)

Oft lässt sich ein Problem nur lösen, indem man es in kleine, beherrschbare Teilprobleme zerlegt. Diese Problemlösestrategie nennt man command and conquer (mehr dazu hier).

Wir denken uns die Einmaleinstabelle in einzelne Zeilen ("Einmaleinsreihen") zerlegt und schreiben zunächst ein Programm, das eine einzelne Einmaleinsreihe ausgibt.

Der Wert der Variable 'e' bestimmt die Einmaleinsreihe, die ausgegeben wird.

Probiere es aus, indem Du die 6 in Zeile 1 abänderst und das Programm neu startest! Führe das Programm auch mal in Einzelschritten aus ("Step over": ) und sieh' Dir im Variablen-Tab an, welche Werte die Variablen e und i während des Programmablaufs annehmen!

Um die komplette Einmaleinstabelle auszugeben, müssen wir den obigen Programmteil zuerst für e == 1 ausführen, dann für e == 2, usw.:

War's das schon?

Eigentlich ist die Aufgabe jetzt schon gelöst: Die Einmaleinstabelle wird korrekt ausgegeben. Trotzdem hoffe ich, dass Ihr mit der gefundenen Lösung genauso unzufrieden seid wie ich:

  • Der Code ist hochgradig redundant.
  • Wenn wir später in der for-loop etwas ändern wollen (z.B. weil wir einen Fehler entdeckt haben), dann müssen wir es 10-Mal ausbessern.
  • Das Programm belegt sehr viel Speicherplatz.



Es muss doch möglich sein, den Computer anzuweisen, den Programmblock aus dem ersten Beispiel oben einfach 10-mal zu wiederholen!

Saubere Lösung: zwei ineinandergeschachtelte for-loops

Schiebe den Geschwindigkeitsregler (neben dem Startbutton) auf ca. 6 Schritte pro Sekunde und führe das Programm aus. Wenn das Programm langsam genug ausgeführt wird, wird die gerade ausgeführte Anweisung jeweils grün hinterlegt.

  • Beobachte, nach welchem Muster der grüne Balken sich durchs Programm bewegt!
  • Führe das Programm auch im Einzelschritt bei geöffnetem Tab "Variablen" aus und schau' Dir bei jedem Schritt die Werte der Variablen e und i an!

Die Tabelle sieht noch nicht perfekt aus, weil die Zahlen unterschiedlich breit sind:

1 2 3 4 5 6 7 8 9 10 ​
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

Im Kapitel zur Wenn-Dann-Anweisung werden wir das Programm noch verbessern.

Beispiel 2: Stern-Dreieck

Bisher können wir zwar nur Zeichen auf dem Bildschirm ausgeben (Computergrafik und Spieleprogrammierung kommt auch noch, versprochen!), damit lassen sich aber auch richtig schöne Bilder zeichnen (Stichwort "ASCII-Art", siehe hier). Wir beginnen mit einem einfachen Dreieck.

*​
**​
***​
****​
*****
******
*******
********
*********
**********
***********​
************

Aufgaben zum Stern-Dreieck:

1. Ändere das Programm so ab, dass die Pyramide auf dem Kopf steht, also so:

************​
***********​
**********
*********
********
*******
******
*****
****
***
**
*

Hier geht's zur Lösung!


2. Ändere das Programm so ab, dass die Pyramide zentriert erscheint, also so:

      *
     ***
    *****
   *******
  *********
 ***********

Tipps:

  • Jede Reihe besteht jetzt aus einer ungeraden Anzahl von Sternen. Die Variable reihe soll also nicht die Werte 1, 2, 3, … annehmen, sondern die Werte 1, 3, 5, …
  • Vor jeder Reihe von Sternen stehen unterschiedlich viele Leerzeichen. Wie kann man die Anzahl der Leerzeichen aus der Anzahl der Sterne ( = Reihennummer) berechnen? Dazu eine Hilfstabelle:
Reihe Anzahl von Sternen Anzahl von Leerzeichen
116
335
557


Hier geht's zur Lösung!

Beispiel 3: Grafik

Die Erzeugung von Grafikobjekten lernen wir erst etwas später, trotzdem glaube ich, dass Du das folgende Beispiel bestimmt schon verstehen kannst. Nur so viel:

new Circle(300, 200, 100);

erzeugt ein Kreis-Objekt mit Mittelpunkt $(300,200)$ und Radius 100.


Weitere Aufgaben

einstieg/geschachtelt/start.txt · Zuletzt geändert: 2020/12/01 09:28 von Martin Pabst