einstieg:geschachtelt:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | einstieg:geschachtelt:start [2024/08/31 12:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Ineinandergeschachtelte Wiederholungen (" | ||
+ | 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. | ||
+ | <WRAP center round tip 80%> | ||
+ | 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 [[https:// | ||
+ | Wir denken uns die Einmaleinstabelle in einzelne Zeilen (" | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int e = 6; // Einmaleinsreihe | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | Der Wert der Variable ' | ||
+ | **Probiere es aus,** indem Du die '' | ||
+ | </ | ||
+ | |||
+ | Um die komplette Einmaleinstabelle auszugeben, müssen wir den obigen Programmteil zuerst für '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int e = 1; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 2; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 3; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 4; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 5; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 6; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 7; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 8; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 9; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | e = 10; | ||
+ | for(int i = 1; i <= 10; i++){ | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round todo 80%> | ||
+ | **War' | ||
+ | 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 **[[https:// | ||
+ | * 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 ===== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | for(int e = 1; e <= 10; e++){ | ||
+ | | ||
+ | print(e * i + " "); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | 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 " | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | 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 [[wenndann: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Beispiel 2: Stern-Dreieck ===== | ||
+ | Bisher können wir zwar nur Zeichen auf dem Bildschirm ausgeben (Computergrafik und Spieleprogrammierung kommt auch noch, versprochen!), | ||
+ | < | ||
+ | * | ||
+ | ** | ||
+ | *** | ||
+ | **** | ||
+ | ***** | ||
+ | ****** | ||
+ | ******* | ||
+ | ******** | ||
+ | ********* | ||
+ | ********** | ||
+ | *********** | ||
+ | ************ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | for(int reihe = 1; reihe <= 12; reihe++){ | ||
+ | | ||
+ | print(" | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Aufgaben zum Stern-Dreieck: | ||
+ | 1. Ändere das Programm so ab, dass die Pyramide auf dem Kopf steht, also so: | ||
+ | < | ||
+ | ************ | ||
+ | *********** | ||
+ | ********** | ||
+ | ********* | ||
+ | ******** | ||
+ | ******* | ||
+ | ****** | ||
+ | ***** | ||
+ | **** | ||
+ | *** | ||
+ | ** | ||
+ | * | ||
+ | </ | ||
+ | |||
+ | [[.loesungen: | ||
+ | |||
+ | | ||
+ | 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 '' | ||
+ | * 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 ^ | ||
+ | |1|1|6| | ||
+ | |3|3|5| | ||
+ | |5|5|7| | ||
+ | ... | ||
+ | |||
+ | | ||
+ | [[.pyramidezentriert: | ||
+ | |||
+ | ===== Beispiel 3: Grafik ===== | ||
+ | Die Erzeugung von Grafikobjekten lernen wir [[klassen1: | ||
+ | <code myjava> | ||
+ | new Circle(300, 200, 100); | ||
+ | </ | ||
+ | erzeugt ein Kreis-Objekt mit Mittelpunkt $(300,200)$ und Radius 100. | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | for(int zeile = 1; zeile <= 15; zeile++){ | ||
+ | | ||
+ | new Circle(30*spalte, | ||
+ | new Circle(30*(16-spalte), | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Weitere Aufgaben ===== | ||
+ | [[.geschachteltewh: |
einstieg/geschachtelt/start.txt · Zuletzt geändert: 2024/08/31 12:03 von 127.0.0.1