CUBE.CODES: Schleifen mit for: Unterschied zwischen den Versionen
(32 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
__NOTOC__ | __NOTOC__ | ||
[https://ide.cube.codes CUBE.CODES blank] | [https://ide.cube.codes CUBE.CODES blank] | ||
− | + | ==Programm 1: für(... ) tue ... == | |
− | for(i=1; i< | + | for(i=1; i<10; i=i+1) UI.log(i); |
− | Das Sprachkonstrukt '''for(<Anfangsbefehl>; <Wiederholungsbedingung>; <Veränderung>)''' vor dem Befehl '''UI.log(i)''' steuert ähnlich dem while-Konstrukt, wie | + | führt zur Ausgabe ... |
− | #Der '''<Anfangsbefehl>''' wird ausgeführt bevor alles losgeht. Dabei setzt man meistens die Zählervariable auf einen gewünschten Anfangszustand. Man kann aber auch beliebige andere Befehle anfangs ausführen lassen. | + | [08:26:54] Program starting ... |
− | #Die '''<Wiederholungsbedingung>''' | + | [08:27:00] Program running ... |
− | #Die '''<Veränderung>''' | + | 1 |
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 | ||
+ | 6 | ||
+ | 7 | ||
+ | 8 | ||
+ | 9 | ||
+ | [08:27:00] Program finished successfully | ||
+ | |||
+ | Das Sprachkonstrukt '''for(<Anfangsbefehl>; <Wiederholungsbedingung>; <Veränderung>)''' vor dem Befehl '''UI.log(i)''' steuert ähnlich dem while-Konstrukt, '''wie''' der nachfolgende Befehl (hier: UI.log(i)) '''wiederholt wird'''. Man kann aber (anders als bei while) alle typischen Wünsche einer einzigen Zeile unterbringen: | ||
+ | #Der '''<Anfangsbefehl>''' wird ausgeführt, bevor alles losgeht. Dabei setzt man meistens die Zählervariable auf einen gewünschten Anfangszustand. Man kann aber auch beliebige andere Befehle anfangs ausführen lassen. | ||
+ | #Die '''<Wiederholungsbedingung>''' wird immer überprüft, bevor der nachfolgende Befehl ausgeführt wird. Trifft die Bedingung zu, wird er (nochmal) ausgeführt, trifft er nicht (mehr) zu, wird der nachfolgende Befehl nicht mehr ausgeführt, also die Serie unterbrochen. | ||
+ | #Die '''<Veränderung>''' ist ein Befehl, der nach jeder Durchführung ausgeführt wird. Wir benutzen ihn meist, um die Zählervariable zu verändern. Würden wir die Situation nicht verändern, wäre die Wiederholungsbedingung ja immer richtig und wir hätten eine '''Endlosschleife'''. | ||
− | == | + | ==Übungsprogramme 2: Teste die folgenden Schleifen== |
− | + | for(i=0; i<100; i=i+2) UI.log(i); | |
− | + | for(i=1; i<100; i=i+2) UI.log(i); | |
− | + | for(i=1; i<1000; i=i*2) UI.log(i); | |
− | + | for(i=100; i>-1; i=i-1) UI.log(i); | |
− | + | for(i=1; i<10; i=i+1) UI.log("1/"+i); | |
− | + | for(i=1; i>0; i=i/2) UI.log(i); | |
− | |||
− | Man kann | + | ==Übungsprogramme 3: Man kann damit in einer Zeile auch einfach Wertetabellen ausgeben, die beliebig skaliert sind== |
+ | for(i=0; i<100; i=i+1) UI.log(i+" - "+i*i); | ||
+ | for(i=-10; i<=10; i=i+1) UI.log(i+" | "+i*i); | ||
+ | for(i=0; i<1000; ++i) UI.log(i+" | "+(3*i+11)); | ||
+ | for(i=-10; i<=10; i=i+0.5) UI.log(i+" | "+(2*i*i-i+2.5)); | ||
− | + | ==Programm 4: Teiler ermitteln== | |
+ | Auch unser Teilerprogramm können wir jetzt '''in einer einzigen Zeile''' verwirklichen | ||
+ | for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i); | ||
− | + | ... führt zur Ausgabe: | |
− | + | [07:57:54] Program starting ... | |
+ | [07:58:00] Program running ... | ||
+ | 1 | ||
+ | 2 | ||
+ | 4 | ||
+ | 5 | ||
+ | 8 | ||
+ | 10 | ||
+ | 16 | ||
+ | 20 | ||
+ | 25 | ||
+ | 40 | ||
+ | 50 | ||
+ | 80 | ||
+ | 100 | ||
+ | 125 | ||
+ | 200 | ||
+ | 250 | ||
+ | 400 | ||
+ | 500 | ||
+ | 1000 | ||
+ | 2000 | ||
+ | [07:58:00] Program finished successfully | ||
− | + | ==Übungsprogramme 5: Wir wiederholen mehrere Befehle == | |
+ | Dass die Folge dreier Sprachelemente in '''for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i);''' (Programm 4) so unproblematisch funktioniert, verwundert Euch vielleicht und ist auch nicht selbstverständlich. Vergleiche dazu die vier Programme: | ||
− | '''1 + 2 | + | '''Programm5a:''' |
+ | for(i=1; i<=10; ++i) y=i*2; UI.log(y); | ||
− | ... | + | und ... |
− | |||
− | + | '''Programm5b:''' | |
− | + | for(i=1; i<=10; ++i) {y=i*2; UI.log(y);} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | sowie | |
− | |||
− | |||
− | |||
− | |||
− | + | '''Programm5c:''' | |
− | + | for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i); | |
− | |||
− | |||
− | |||
− | + | und ... | |
− | + | '''Programm5d:''' | |
+ | for(i=1; i<=2000; ++i) {if(2000%i==0) UI.log(i);} | ||
− | === | + | === Was hat es mit den vier Varianten auf sich? === |
− | |||
− | === | + | '''Programm5a:''' |
− | + | for(i=1; i<=10; ++i) y=i*2; UI.log(y); | |
− | + | Führt zur Ausgabe ... | |
− | + | [08:09:54] Program starting ... | |
− | + | [08:10:00] Program running ... | |
− | + | 20 | |
− | + | [08:10:01] Program finished successfully | |
− | + | # ... gibt es nur eine (!) Ausgabe mit UI.log(y). Der Wiederholungsoperator gilt also '''nur für den nachfolgenden''' Befehl y=i*2; . UI.log(y) wird also erst ausgeführt, nachdem die komplette Schleife beendet ist. Die Ausgabe ist aber nicht 22, obwohl am Ende der Schleife i==11 ist! Der Befehl y=i*2; wurde ja als letztes (in der Schleife) ausgeführt, als i noch 10 war. Daher wurde als letztes y=i*2; für i=10 berechnet. Also die Ausgabe 20! | |
+ | # Die Formulierung {for(i=1; i<=10; ++i) y=i*2;} UI.log(y); wäre vielleicht klarer und ist auch korrekt. Die Vorrangregel aus 1. macht aber die Klammerung überflüssig. | ||
+ | # Programme sollen aber nicht nur mystifying korrekt sein sondern auch leicht verständlich, daher würde wohl jeder Programmierer Programm 5a folgendermaßen notieren: | ||
+ | '''Programm5a':''' | ||
+ | for(i=1; i<=10; ++i) y=i*2; | ||
+ | UI.log(y); | ||
− | + | '''Programm5b:''' Klammert nun die hinteren beiden Befehle und fasst sich somit zu einem einzigen '''Befehlsblock''' zusammen. Die Zeile | |
+ | |||
+ | for(i=1; i<=10; ++i) {y=i*2; UI.log(y);} | ||
− | + | führt also jetzt zur Ausgabe ... | |
− | |||
− | |||
− | |||
− | |||
− | + | [08:35:19] Program starting ... | |
− | [ | + | [08:35:26] Program running ... |
+ | 2 | ||
+ | 4 | ||
+ | 6 | ||
+ | 8 | ||
+ | 10 | ||
+ | 12 | ||
+ | 14 | ||
+ | 16 | ||
+ | 18 | ||
+ | 20 | ||
+ | [08:35:26] Program finished successfully | ||
+ | |||
+ | Anders ist die Situation bei Programm 5c und 5d: |
Aktuelle Version vom 21. Januar 2022, 08:36 Uhr
Programm 1: für(... ) tue ...
for(i=1; i<10; i=i+1) UI.log(i);
führt zur Ausgabe ...
[08:26:54] Program starting ... [08:27:00] Program running ... 1 2 3 4 5 6 7 8 9 [08:27:00] Program finished successfully
Das Sprachkonstrukt for(<Anfangsbefehl>; <Wiederholungsbedingung>; <Veränderung>) vor dem Befehl UI.log(i) steuert ähnlich dem while-Konstrukt, wie der nachfolgende Befehl (hier: UI.log(i)) wiederholt wird. Man kann aber (anders als bei while) alle typischen Wünsche einer einzigen Zeile unterbringen:
- Der <Anfangsbefehl> wird ausgeführt, bevor alles losgeht. Dabei setzt man meistens die Zählervariable auf einen gewünschten Anfangszustand. Man kann aber auch beliebige andere Befehle anfangs ausführen lassen.
- Die <Wiederholungsbedingung> wird immer überprüft, bevor der nachfolgende Befehl ausgeführt wird. Trifft die Bedingung zu, wird er (nochmal) ausgeführt, trifft er nicht (mehr) zu, wird der nachfolgende Befehl nicht mehr ausgeführt, also die Serie unterbrochen.
- Die <Veränderung> ist ein Befehl, der nach jeder Durchführung ausgeführt wird. Wir benutzen ihn meist, um die Zählervariable zu verändern. Würden wir die Situation nicht verändern, wäre die Wiederholungsbedingung ja immer richtig und wir hätten eine Endlosschleife.
Übungsprogramme 2: Teste die folgenden Schleifen
for(i=0; i<100; i=i+2) UI.log(i); for(i=1; i<100; i=i+2) UI.log(i); for(i=1; i<1000; i=i*2) UI.log(i); for(i=100; i>-1; i=i-1) UI.log(i); for(i=1; i<10; i=i+1) UI.log("1/"+i); for(i=1; i>0; i=i/2) UI.log(i);
Übungsprogramme 3: Man kann damit in einer Zeile auch einfach Wertetabellen ausgeben, die beliebig skaliert sind
for(i=0; i<100; i=i+1) UI.log(i+" - "+i*i); for(i=-10; i<=10; i=i+1) UI.log(i+" | "+i*i); for(i=0; i<1000; ++i) UI.log(i+" | "+(3*i+11)); for(i=-10; i<=10; i=i+0.5) UI.log(i+" | "+(2*i*i-i+2.5));
Programm 4: Teiler ermitteln
Auch unser Teilerprogramm können wir jetzt in einer einzigen Zeile verwirklichen
for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i);
... führt zur Ausgabe:
[07:57:54] Program starting ... [07:58:00] Program running ... 1 2 4 5 8 10 16 20 25 40 50 80 100 125 200 250 400 500 1000 2000 [07:58:00] Program finished successfully
Übungsprogramme 5: Wir wiederholen mehrere Befehle
Dass die Folge dreier Sprachelemente in for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i); (Programm 4) so unproblematisch funktioniert, verwundert Euch vielleicht und ist auch nicht selbstverständlich. Vergleiche dazu die vier Programme:
Programm5a:
for(i=1; i<=10; ++i) y=i*2; UI.log(y);
und ...
Programm5b:
for(i=1; i<=10; ++i) {y=i*2; UI.log(y);}
sowie
Programm5c:
for(i=1; i<=2000; ++i) if(2000%i==0) UI.log(i);
und ...
Programm5d:
for(i=1; i<=2000; ++i) {if(2000%i==0) UI.log(i);}
Was hat es mit den vier Varianten auf sich?
Programm5a:
for(i=1; i<=10; ++i) y=i*2; UI.log(y);
Führt zur Ausgabe ...
[08:09:54] Program starting ... [08:10:00] Program running ... 20 [08:10:01] Program finished successfully
- ... gibt es nur eine (!) Ausgabe mit UI.log(y). Der Wiederholungsoperator gilt also nur für den nachfolgenden Befehl y=i*2; . UI.log(y) wird also erst ausgeführt, nachdem die komplette Schleife beendet ist. Die Ausgabe ist aber nicht 22, obwohl am Ende der Schleife i==11 ist! Der Befehl y=i*2; wurde ja als letztes (in der Schleife) ausgeführt, als i noch 10 war. Daher wurde als letztes y=i*2; für i=10 berechnet. Also die Ausgabe 20!
- Die Formulierung {for(i=1; i<=10; ++i) y=i*2;} UI.log(y); wäre vielleicht klarer und ist auch korrekt. Die Vorrangregel aus 1. macht aber die Klammerung überflüssig.
- Programme sollen aber nicht nur mystifying korrekt sein sondern auch leicht verständlich, daher würde wohl jeder Programmierer Programm 5a folgendermaßen notieren:
Programm5a':
for(i=1; i<=10; ++i) y=i*2; UI.log(y);
Programm5b: Klammert nun die hinteren beiden Befehle und fasst sich somit zu einem einzigen Befehlsblock zusammen. Die Zeile
for(i=1; i<=10; ++i) {y=i*2; UI.log(y);}
führt also jetzt zur Ausgabe ...
[08:35:19] Program starting ... [08:35:26] Program running ... 2 4 6 8 10 12 14 16 18 20 [08:35:26] Program finished successfully
Anders ist die Situation bei Programm 5c und 5d: