Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

10:bedingte_wiederholung [2018/06/03 22:53] (aktuell)
Zeile 1: Zeile 1:
 +====== Die bedingte Wiederholung ======
 +Wiederholungen lassen sich auch mit einer anderen Kontrollstruktur umsetzen, der bedingten Wiederholung.
 +Die Tabelle zeigt zwei Möglichkeiten,​ eine Sequenz unter einer bestimmten Bedingung zu wiederholen.
 +^ ^ while-do ^ do-while ^
 +| Sprachkonstrukt | <​code>​
 +while(//​Bedingung){
 +   //​Sequenz }
 +</​code>​ | <​code>​
 +do{ //Sequenz
 +  }
 +while(//​Bedingung)
 +</​code>​ |
 +| Struktogramm ​ |  |  |
 +| Erläuterung | Die Bedingung wird überprüft und gegebenenfalls die Sequenz ausgeführt. Anschließend erfolgt eine erneute Überprüfung der Bedingung. | Die Sequenz wird auf jeden Fall einmal ausgeführt. Im Anschluss wird die Bedingung überprüft und gegebenenfalls die Sequenz wiederholt. |
  
 +<​note>​Meist wird die while-do-Schleife in Programmen verwendet. Gelegentlich vereinfacht sich der Quellcode aber bei Nutzung der do-while-Konstruktion.</​note>​
 +
 +=== Beispiel 1: ===
 +Auf der Konsole werden in absteigender Reihenfolge die natürlichen Zahlen bis 100 ausgegeben.
 +<​code>​
 +public class Algorithmen{
 +    public void countdown(){
 +        int i=100;
 +        while(i>​0){
 +            System.out.println(i);​
 +            i=i-1;
 +        }
 +    }
 +}
 +</​code>​
 +Du erinnerst dich vielleicht, dass du ein ähnliches Programm mit Hilfe der for-Schleife schon geschrieben hast. 
 +<​note>​for-Schleifen,​ do-while-Schleifen und while-do-Schleifen sind gleichwertig und können jeweils durch eine andere Schleifenkonstruktion ersetzt werden.</​note>​
 +Hier die Lösung zum Countdown-Problem mit den drei verschiedenen Schleifenarten.
 +^ while-do ^ do-while ^ for ^
 +| <​code>​public void countdown(){
 +   int i=100;
 +   ​while(i>​0){
 +      System.out.println(i);​
 +      i=i-1;
 +   }
 +}</​code>​ | <​code>​
 +public void countdown(){
 +   int i=100;
 +   do{
 +      System.out.println(i);​
 +      i=i-1;
 +   }
 +   ​while(i>​0)
 +}</​code>​ | <​code>​
 +public void countdown(){
 +   ​for(int i=100; i>0; i=i-1){
 +      System.out.println(i);​
 +   }
 +}
 +</​code>​ | 
 +
 +=== Beispiel 2: ===
 +Eine Methode, die Zahlen auf ihre Primzahleigenschaft untersucht.
 +Im letzten Kapitel hast du bereits eine solche Methode mit Hilfe einer for-Schleife geschrieben.\\
 +Hier im Vergleich dazu eine Variante mit einer while-Schleife.
 +^ for-Schleife ^ while-Schleife ^
 +| <​code>​
 + boolean istPrimzahl(int z) {
 + boolean antwort = true;
 + for (int teiler = 2; teiler < z; teiler++) {
 + if (z % teiler == 0) {
 + antwort = false;
 + }
 + }
 + return antwort;
 + }
 +</​code>​ | <​code>​
 +    boolean istPrimzahl(int z) {
 +        boolean antwort = true;
 +        int teiler=2;
 +        while(teiler < z) {
 +            if (z % teiler == 0) {
 +                antwort = false;
 +            }
 +            teiler=teiler+1;​
 +        }
 +        return antwort;
 +    }
 +</​code>​ | 
 +
 +==== Aufgabe 1: ====
 +Programmiere eine Animation, bei der zwei Kreise auf dem Zeichenfenster sich von links nach rechts bewegen. Ein Kreis befindet sich dabei rechts von dem anderen und wird von ihm eingeholt. Die Animation endet, wenn beide Kreise die gleiche waagrechte Position besitzen.\\
 +Ein Grundgerüst des Codes mit Hilfskommentaren findest du, falls nötig, ​
 +<hidden hier>
 +<​code>​
 +import tools.*;
 +public class BedingteWiederholung
 +{
 +    public void aufholjagd(){
 +        // Variablen für die x-Positionen der beiden Kreise definieren
 +        // Startwerte der x-Positionen festlegen
 +        while(........){ ​  // Bedingung für die Wiederholung
 +            // Zeichenfenster löschen
 +            // die beiden Kreise zeichnen
 +            // 20 Millisekunden warten
 +            // die x-Koordinaten der beiden Kreise verändern
 +        }    ​
 +    }
 +}
 +</​code>​
 +</​hidden>​
 +\\
 +Du benötigst noch mehr Hilfe. Also gut der Quelltext, bei dem du nur noch die Lücken .... füllen musst.\\
 +<hidden Zweite Hilfe>
 +<​code>​
 +import tools.*;
 +public class BedingteWiederholung
 +{
 +    public void aufholjagd(){
 +        int x1, x2;  // Variablen für die x-Positionen der beiden Kreise definieren
 +        x1=....; // Startwerte der x-Positionen festlegen
 +        x2=....; // der zweite Kreis befindet sich weiter rechts ​        
 +        while(....){ ​  // Bedingung für die Wiederholung,​ solange der erste Kreis sich links vom zweiten befindet
 +            Zeichenfenster.loeschen(); ​ // Zeichenfenster löschen
 +            Zeichenfenster.zeichneKreis(.... ,​100,​10); ​ // die beiden Kreise zeichnen
 +            Zeichenfenster.zeichneKreis(.... ,100,10);
 +            Zeichenfenster.warteSekunden(0.02);​ // 20 Millisekunden warten
 +            x1=x1+....; ​ // die x-Koordinaten der beiden Kreise verändern
 +            x2=x2+....; ​ // der Kreis 2 bewegt sich schneller als Kreis 1
 +        }    ​
 +    }
 +}
 +
 +</​code>​
 +</​hidden>​
 +==== Aufgabe 2: Fehlerhaft ====
 +Im Programmcode der folgenden Funktion, die den ganzzahligen Anteil zweier Zahlen berechnen soll, haben sich Fehler eingeschlichen. Verbessere diese
 +<​code>​
 +public int ganzzahlDivision(int a, int b) {
 + int i = 1;
 + while (a <= b) {
 + a = a - b;
 + i = i + a;
 + }
 + return i;
 +}
 +</​code>​
 +<hidden Lösung>
 +<​code>​
 +public int ganzzahlDivision(int a, int b) {
 + int i = 0;          // Zähler für die Anzahl der Subtraktionen a-b
 + while (a >= b) {    // solange a größer gleich b ist, wird b von a abgezogen
 + a = a - b;  // und 
 + i = i + 1;  // der Zähler um eins erhöht ​
 + }
 + return i;
 +}
 +</​code>​
 +
 +</​hidden>​
Drucken/exportieren