FOR Anweisung Aufgabe: Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm public class MainWhile { public static void main (String[] args){ int i; i=0; // wie geht es // weiter ?? Schleifenzähler verändern Initialisierung Bedingung for (i=0; i<=100; i=i+1){ println(i); } println("Das war es"); } Bedingung falsch Bedingung wahr Programmverlauf for (i=0; i<=100; i=i+1){ println(i); } println("Das war es");} Dynamische Entwicklung des Inhalts der Variablen i for (i=0; i<=100; i=i+1){ println(i); } println("Das war es"); i 0 1 for (i=0; i<=100; i=i+1){ println(i); } println("Das war es"); i 0 1 2 .... usw. bis i den Wert 100 hat for (i=0; i<=100; i=i+1){ println(i); } println("Das war es"); i 0 1 2 ... 100 101 for (i=0; i<=100; i=i+1){ println(i); } println("Das war es"); i 0 1 2 ... 100 101 Java-Syntax für FOR - Anweisung Den Schleifenzähler verändern Bedingung Initialisierung for (Ausdr1; Ausdr2; Ausdr3){ Anweisung(en); } bei einer Anweisung sind Klammern nicht nötig. Trotzdem: Immer Klammern machen. Blockende kein Semikolon for (Ausdr1; Ausdr2; Ausdr3){ Anweisung(en); } Diesen Teil innerhalb einer for-Anweisung nennt man auch Schleifenrumpf Warum nur eine Ausgabe ? for (i=0; i<=100; i=i+1); { println(i); } Weil der Compiler dieses Konstrukt als die zwei folgenden Anweisungen auffasst: for (i=0; i<=100; i=i+1); { println(i); } Nach for (...) muss eine Anweisung kommen ! Diese Anweisung ist die "leere Anweisung" (die nichts macht bzw. bewirkt), die durch den leeren Ausdruck, der mit einem Semikolon abgeschlossen wird, zu einer Anweisung wird. Diese wird solange ausgeführt, solange i<=100 , also 101 mal. DANACH wird einmal println(i) ausgeführt. Das heißt for (i=0; i<=100; i=i+1); wird vom Compiler wie folgt interpretiert: for (i=0; i<=100; i=i+1) ; Was wird also ausgegeben ? 101 Aufgabe: Flußdiagramm der FOR - Anweisung mit beliebigem A1, A2, A3 und beliebigen Anweisung(en) A, also der folgenden Anweisung … for (A1; A2; A3){ A; } Initialisierung (A1) Bedingung (A2) wahr A Schleifenzähler verändern (A3) falsch Oder alternativ: Initialisierung (A1) Schleifenzähler verändern (A3) A Bedingung (A2) falsch wahr Struktogramm: for(Ausdruck1; Ausdruck2; Ausdruck3) Anweisungen Die for-Schleife nennt man auch Zählschleife, weil durch den Anfangswert und den Endwert der Schleifenvariablen die Anzahl der Schleifendurchgänge festgelegt sind. Wie oft wird der Schleifenrumpf einer forSchleife durchlaufen. Nennen Sie die obere bzw. untere Grenze. 0 ... Durchgänge, wobei die Initialisierung (Ausdr1) aber auf jeden Fall genau 1 Mal gemacht wird. Zum Schluss: Eine Besonderheit von allen 3 Schleifenarten: break und continue Für alle drei Arten von Schleifen, for Schleife, while Schleife und do-while Schleife existieren noch zwei wichtige Anweisungen, nämlich break und continue. Die break-Anweisung veranlaßt, daß die Schleife sofort verlassen wird. Bei verschachtelten Schleifen wird die aktuelle Schleife sofort verlassen. Die continue-Anweisung veranlaßt, daß sofort zum Anfang der Schleife (Schleifen-Bedingung) gesprungen wird. Im Gegensatz zur breakAnweisung wird die Schleife nicht verlassen. Bei einer for-Schleife wird dagegen mit dem Abarbeiten des letzten Ausdrucks in der for-Klammer weitergemacht. Beispiele Was gibt das folgende Programm auf dem Bildschirm aus? public class Startklasse { public static void main (String[] args){ 10/3=3.333333 10/2=5.000000 10/1=10.000000 Hallo Welt double teiler,erg; teiler=4; while(teiler>=-2){ Warum wird nicht 10/0=... ausgegeben? teiler--; if(teiler==0){ break; } erg=10/teiler; print("10/"+teiler+"="+erg); } println("Hallo Welt"); return 0; } Wenn der teiler 0 wird, wird break ausgeführt. Dies veranlaßt das Verlassen der Schleife und die Ausführung der nächsten Anweisung Was gibt das folgende Programm auf dem Bildschirm aus? public class Startklasse { public static void main (String[] args){ 10/3=3.333333 10/2=5.000000 10/1=10.000000 10/-1=-10.000000 10/-2=-5.000000 10/-3=-3.333333 Hallo Welt double teiler,erg; teiler=4; while(teiler>=-2){ teiler--; if(teiler==0){ continue; } Warum wird bei teiler=0 nicht die Schleife verlassen? erg=10/teiler; print("10/%f=%f\n",teiler,erg); } println("Hallo Welt"); return 0; } Wenn der teiler 0 wird, wird wieder an den Anfang der Schleife gesprungen. Was gibt das folgende Programm auf dem Bildschirm aus? 10/3=3.333333 10/2=5.000000 10/1=10.000000 10/-1=-10.000000 10/-2=-5.000000 Hallo Welt public static void main()...{ double teiler, erg; } for(teiler=3;teiler>=-2;teiler--){ if(teiler==0){ continue; } Warum wird bei teiler=0 nicht die Schleife verlassen? erg=10/teiler; printf("10/%f=%f\n",teiler,erg); } Aus Platzmangel wurden die Ausgaben nicht untereinander printf("Hallo Welt\n"); geschrieben return 0; 0 wird, wird sofort an den letzten Ausdruck der Wenn der teiler for-Klammer gesprungen.