Benutzer-Werkzeuge

Webseiten-Werkzeuge


einstieg:geschachtelt:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
einstieg:geschachtelt:start [2020/06/26 10:14] – [Beispiel 2: Stern-Dreieck] Martin Pabsteinstieg:geschachtelt:start [2020/12/01 09:28] – [Bessere Lösung: zwei ineinandergeschachtelte for-loops] Martin Pabst
Zeile 1: Zeile 1:
-====== Ineinandergeschachtelte Schleifen ======+====== Ineinandergeschachtelte Wiederholungen ("Schleifen"/"Loops"======
  
-Es kommt häufig vor, dass ein Programmteil wiederholt werden muss, in dem selbst schon eine Schleife steckt. Das ist kein Problem, denn Schleifen kann man beliebig ineinander schachteln. Wofür das gut ist und wie es geht, zeige ich Dir am besten an ein paar Beispielen.+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 ===== ===== Beispiel 1: Einmaleinstabelle =====
Zeile 116: Zeile 116:
 <WRAP center round todo 80%> <WRAP center round todo 80%>
 **War's das schon?** \\ \\ **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:+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://de.wikipedia.org/wiki/Redundanz_(Kommunikationstheorie)|redundant]]**.    * Der Code ist hochgradig **[[https://de.wikipedia.org/wiki/Redundanz_(Kommunikationstheorie)|redundant]]**. 
-  * Wenn wir später in der for-Schleife etwas ändern wollen (z.B. weil wir einen Fehler entdeckt haben), dann müssen wir es **10-Mal ausbessern**.+  * 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**.    * Das Programm **belegt sehr viel Speicherplatz**. 
  \\ \\   \\ \\ 
Zeile 124: Zeile 124:
 </WRAP> </WRAP>
  
-== Bessere Lösung: zwei ineinandergeschachtelte Schleifen ==+===== Saubere Lösung: zwei ineinandergeschachtelte for-loops =====
 <HTML> <HTML>
  
Zeile 147: Zeile 147:
 </WRAP> </WRAP>
  
 +<WRAP center round todo 60%>
 +Die Tabelle sieht noch nicht perfekt aus, weil die Zahlen unterschiedlich breit sind:
 +<code>
 +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
 +</code>
 +Im Kapitel zur Wenn-Dann-Anweisung werden wir [[wenndann:if:start#beispiel_2verbesserung_der_einmaleinstabelle|das Programm noch verbessern.]]
 +</WRAP>
  
  
Zeile 152: Zeile 168:
 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 [[https://www.asciiart.eu/|(Stichwort "ASCII-Art", siehe hier)]]. Wir beginnen mit einem einfachen 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 [[https://www.asciiart.eu/|(Stichwort "ASCII-Art", siehe hier)]]. Wir beginnen mit einem einfachen Dreieck.
 <code> <code>
-+* 
-** +** 
-*** +*** 
-****+****
 ***** *****
 ****** ******
 +*******
 ******** ********
 +*********
 +**********
 +***********​
 +************
 </code> </code>
  
Zeile 166: Zeile 187:
  
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
-for(int zeile = 1; zeile <= 12; zeile++){ +for(int reihe = 1; reihe <= 12; reihe++){ 
-   for(int spalte = 1; spalte <= zeile; spalte++){+   for(int spalte = 1; spalte <= reihe; spalte++){
       print("*");       print("*");
    }    }
Zeile 177: Zeile 198:
 </HTML> </HTML>
  
-<WRAP center round tip 80%> +===== Aufgaben zum Stern-Dreieck: ===== 
-Der Wert der Variable 'e' bestimmt die Einmaleinsreihe, die ausgegeben wird. \\ \\  +1. Ändere das Programm so abdass die Pyramide auf dem Kopf steht, also so: 
-**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": {{:klassen1:anwenden:step_over.png?nolink|}}) und sieh' Dir im Variablen-Tab an, welche Werte die Variablen ''e'' und ''i'' während des Programmablaufs annehmen! +<code> 
-</WRAP>+************​ 
 +***********​ 
 +********** 
 +********* 
 +******** 
 +******* 
 +****** 
 +***** 
 +**** 
 +*** 
 +** 
 +* 
 +</code>
  
-Um die komplette Einmaleinstabelle auszugeben, müssen wir den obigen Programmteil zuerst für ''e == 1'' ausführen, dann für ''e == 2'', usw.:+[[.loesungen:aufgabe1:start|Hier geht's zur Lösung!]]
  
-<HTML>+ \\  
 +2. Ändere das Programm so ab, dass die Pyramide zentriert erscheint, also so: 
 +<code> 
 +      * 
 +     *** 
 +    ***** 
 +   ******* 
 +  ********* 
 + *********** 
 +</code> 
 +**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:
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Schachteln2'}">+^ Reihe ^ Anzahl von Sternen ^ Anzahl von Leerzeichen ^ 
 +|1|1|6| 
 +|3|3|5| 
 +|5|5|7| 
 +...
  
-<script type="text/plain" title="Main.java"> + \\  
-int e = 1; +[[.pyramidezentriert:start|Hier geht's zur Lösung!]]
-for(int i = 1; i <= 10; i++){ +
-   print(e * i + " "); +
-+
-println();+
  
-2; +===== Beispiel 3: Grafik ===== 
-for(int i 1; i <10; i++){ +Die Erzeugung von Grafikobjekten lernen wir [[klassen1:anwenden:start|erst etwas später]], trotzdem glaube ich, dass Du das folgende Beispiel bestimmt schon verstehen kannst. Nur so viel: 
-   print(e * i + " "); +<code myjava> 
-} +new Circle(300, 200, 100); 
-println();+</code> 
 +erzeugt ein Kreis-Objekt mit Mittelpunkt $(300,200)$ und Radius 100.
  
-e = 3; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 4; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 5; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 6; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 7; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 8; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 9; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-println(); 
- 
-e = 10; 
-for(int i = 1; i <= 10; i++){ 
-   print(e * i + " "); 
-} 
-</script> 
-</div> 
- 
-</HTML> 
- 
-<WRAP center round todo 80%> 
-**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 **[[https://de.wikipedia.org/wiki/Redundanz_(Kommunikationstheorie)|redundant]]**.  
-  * Wenn wir später in der for-Schleife 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! 
-</WRAP> 
- 
-== Bessere Lösung: zwei ineinandergeschachtelte Schleifen == 
 <HTML> <HTML>
  
-<div class="java-online" style="height: 200px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Schachteln3'}">+<div class="java-online" style="height: 250px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Schachteln2'}">
  
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
-for(int = 1; <= 10e++){ +for(int zeile = 1; zeile <= 15zeile++){ 
-   for(int = 1; <= 10i++){ +   for(int spalte = 1; spalte <= 16 - zeilespalte++){ 
-      print(" ");+      new Circle(30*spalte, 30*zeile, (spalte zeile)*1.2); 
 +      new Circle(30*(16-spalte), 30*(16-zeile), (spalte + zeile)*1.2);
    }    }
-   println(); 
 } }
 </script> </script>
Zeile 278: Zeile 262:
  
 </HTML> </HTML>
 + \\ 
 +
 +
  
-<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 "Variablen" aus und schau' Dir bei jedem Schritt die Werte der Variablen e und i an! 
-</WRAP> 
  
 +===== Weitere Aufgaben =====
 +[[.geschachteltewh:weitereaufgaben:start|Weitere Aufgaben zu geschachtelten Wiederholungen findest Du hier.]]
einstieg/geschachtelt/start.txt · Zuletzt geändert: 2021/12/29 11:29 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki