CUBE.CODES: Schleifen mit for: Unterschied zwischen den Versionen

Aus MINT.lentner.net
Zur Navigation springen Zur Suche springen
Zeile 25: Zeile 25:
 
<br style="clear:left; ">
 
<br style="clear:left; ">
  
===Programm 2: Das Gaußsche Kinderwunder===
+
===Programm 4: Teiler ermitteln===
//Das Gaußsche Kinderwunder
+
Auch unser Teilerprogramm können wir jetzt '''in einer einzigen Zeile''' verwirklichen
  x=1;
+
  for(i=1; i<=20000; ++i) if(20000%i==0) UI.log(i);
summe=0;
 
while(x<=100)  
 
  {
 
    summe=summe+x;
 
    UI.log(summe);
 
    x=x+1;
 
  }
 
  
 
===Programm 2a: JavaScript hat als Ableger der Abkürzungsfanatikersprache '''C''' einige solche Tipps für uns parat ...===
 
===Programm 2a: JavaScript hat als Ableger der Abkürzungsfanatikersprache '''C''' einige solche Tipps für uns parat ...===

Version vom 11. Januar 2022, 13:40 Uhr

CUBE.CODES blank

Programm 1: für(... ) tue ...

 for(i=1; i<1000; 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 der Befehl UI.log(i) wiederholt wird. Man kann aber alle typischen Wünsche einer einzelnen Zeile unterbringen:

  1. 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.
  2. 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.
  3. 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.

Programm 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);

Programm 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<=20000; ++i) if(20000%i==0) UI.log(i);

Programm 2a: JavaScript hat als Ableger der Abkürzungsfanatikersprache C einige solche Tipps für uns parat ...

//Das Gaußsche Kinderwunder
x=0; summe=0;
while(++x<=100) summe+=x;
UI.log(summe);

Programm 3: Den Zauberwürfel bewegen

//Was passiert, wenn ich einen MOVE immer wieder mache?
   await CUBE.move(" E R ");
   while(!CUBE.isSolved()) await CUBE.move(" E R ");
//Probier's mal mit dem MOVE RBLF! :-) Viel Spaß!

Lässt man die erste Codezeile weg, klingt das Programm auch umgangssprachlich vernünftig, "funktioniert aber nicht"! Probier's! Natürlich funktioniert die Schleife. Sie macht, was sie soll, nämlich: Den Zug ausführen, solange der Würfel ungelöst ist. Aber der Würfel ist ja am Anfang gelöst. Also alles richtig! Die Schleife wird nicht mal ein einziges Mal ausgeführt, weil die Wiederholungsbedingung ja schon beim ersten Mal nicht erfüllt ist.

Gibt es nicht eine einfachere Möglichkeit, zu sagen, dass der PC die Schleife auf jeden Fall einmal macht und erst vor der wirklichen Wiederholung die Bedingung abfragt? Sonst müsste man (auch bei längeren Wiederholungsblöcken) immer den Befehlsblock nochmal extra vor die Schleife kopieren, damit der PC den Block einmal ausführt und dann erst über die Wiederholung berät!

Die Lösung ist Programm 3a: Mach {... } solange(... )

do await CUBE.move(" E R "); while(!CUBE.isSolved())

Programm 3b: Ich möchte mitzählen

 i=0;
 do 
    {
      await CUBE.move(" E R "); 
      ++i;
    } while(!CUBE.isSolved())
 UI.log(i);

CUBE muss also den Zug (E R) acht mal ausführen, damit der CUBE wieder so aussieht, wie am Anfang. Das ist übrigens bei jedem Zug so, dass er irgendwann zum gelösten Zustand zurückkehrt. Man nennt diese Zahl die Ordnung(E R)!

Bestimme die Ordnungen der folgenden Züge:

  • F2 R2 U2 F' B D2 L2 F B (Ordnung 6)
  • R' y (Ordnung 1206)
  • M' S' M S (Ordnung 3)
  • L M R D E U B S F (Ordnung 4)

Finde Züge mit möglichst großer Ordnung!

Ordnung von Zügen ausprobieren!