CUBE.CODES: Schleifen mit while Teil s: Unterschied zwischen den Versionen

Aus MINT.lentner.net
Zur Navigation springen Zur Suche springen
 
(29 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
===Programm 1: solange ... wiederhole ...===
+
__NOTOC__
 +
[https://ide.cube.codes CUBE.CODES blank]
 +
===Programm 1: solange(... ) wiederhole {... } ===
 
  //Wiederholungen
 
  //Wiederholungen
 
  x=1;
 
  x=1;
  while(x<101) x=x+1;
+
  while(x<101) x=x+1; UI.log(x);
UI.log(x);
 
  
===Programm 1a: Was tut sich während der Wiederholung? - Wiederhole ganze Programmblöcke===
+
Was tut sich während der Wiederholung? Wie lautet die Ausgabe?
 +
 
 +
'''Merke:''' <br>Der Schleifenoperator '''while''' bezieht sich immer nur '''auf den folgenden Befehl'''. Wollen wir mehrere Befehle wiederholen, müssen wir sie zu '''einem Befehlsblock''' zusammenfassen.
 +
 
 +
===Programm 1a: Wiederhole ganze Programmblöcke===
 
  //Wiederholungen ganzer Blöcke
 
  //Wiederholungen ganzer Blöcke
 
  x=1;
 
  x=1;
Zeile 15: Zeile 20:
  
 
Man kann also ganz offensichtlich durch Schleifen in einem Programm Berechnungen beliebig oft - auch variiert - wiederholen und dadurch viel mächtigere Berechnungen realisieren als in einer Tabellenkalkulation, in der wir immer nur '''einen Term''' für eine Berechnung formulieren konnten.
 
Man kann also ganz offensichtlich durch Schleifen in einem Programm Berechnungen beliebig oft - auch variiert - wiederholen und dadurch viel mächtigere Berechnungen realisieren als in einer Tabellenkalkulation, in der wir immer nur '''einen Term''' für eine Berechnung formulieren konnten.
 +
 +
In der 5. Klasse hattet Ihr eine Reihe von Themen (Teilermenge, Vielfachenmenge, ggT, kgV, Primzahlen, Primfaktorzerlegung, ...), die mathematisch banal waren, aber vom Rechenaufwand her immens! Um zu entscheiden, ob 3000107291 eine Primzahl ist, müsstet Ihr gut 3 Milliarden
 +
Teilungen durchführen. Für uns Fünfties wäre das unmöglich gewesen, darum haben wir auch nur mit klitzekleinen Zahlen gemacht (meist nur unter 100!). Aber mit einer Programmiersprache und der Möglichkeit, Schleifen zu formulieren, die dann unser PC durchführt, können wir das in wenigen Sekunden entscheiden!
 +
* [[Hat 3000107291 Teiler?]]
 +
 +
[08:24:31] Program starting ...
 +
[08:24:32] Program running ...
 +
1
 +
43
 +
1181
 +
50783
 +
59077
 +
2540311
 +
69769937
 +
3000107291
 +
bye bye!
 +
[08:25:13] Program finished successfully
  
 
[[Datei: 10dm.jpg | thumb | links]]
 
[[Datei: 10dm.jpg | thumb | links]]
Zeile 51: Zeile 73:
 
  //Probier's mal mit dem MOVE RBLF! :-) Viel Spaß!
 
  //Probier's mal mit dem MOVE RBLF! :-) Viel Spaß!
  
Lässt man die erste Codezeile weg, "funktioniert die Schleife nicht"! 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.
+
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)
  
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 (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!
+
Finde Züge mit möglichst großer Ordnung!<p>
 +
[https://ide.cube.codes/?init=loadFromUrl&url=https://share-repository.cube.codes/v1/appStates/7d280477-8a4a-4d06-9fb6-deb3244c7e0f Ordnung von Zügen ausprobieren!]

Aktuelle Version vom 8. April 2022, 07:36 Uhr

CUBE.CODES blank

Programm 1: solange(... ) wiederhole {... }

//Wiederholungen
x=1;
while(x<101) x=x+1; UI.log(x);

Was tut sich während der Wiederholung? Wie lautet die Ausgabe?

Merke:
Der Schleifenoperator while bezieht sich immer nur auf den folgenden Befehl. Wollen wir mehrere Befehle wiederholen, müssen wir sie zu einem Befehlsblock zusammenfassen.

Programm 1a: Wiederhole ganze Programmblöcke

//Wiederholungen ganzer Blöcke
x=1;
while(x<101) 
   {
    x=x+1;
    UI.log(x);
   }

Man kann also ganz offensichtlich durch Schleifen in einem Programm Berechnungen beliebig oft - auch variiert - wiederholen und dadurch viel mächtigere Berechnungen realisieren als in einer Tabellenkalkulation, in der wir immer nur einen Term für eine Berechnung formulieren konnten.

In der 5. Klasse hattet Ihr eine Reihe von Themen (Teilermenge, Vielfachenmenge, ggT, kgV, Primzahlen, Primfaktorzerlegung, ...), die mathematisch banal waren, aber vom Rechenaufwand her immens! Um zu entscheiden, ob 3000107291 eine Primzahl ist, müsstet Ihr gut 3 Milliarden Teilungen durchführen. Für uns Fünfties wäre das unmöglich gewesen, darum haben wir auch nur mit klitzekleinen Zahlen gemacht (meist nur unter 100!). Aber mit einer Programmiersprache und der Möglichkeit, Schleifen zu formulieren, die dann unser PC durchführt, können wir das in wenigen Sekunden entscheiden!

[08:24:31] Program starting ...
[08:24:32] Program running ...
1
43
1181
50783
59077
2540311
69769937
3000107291
bye bye!
[08:25:13] Program finished successfully
10dm.jpg

Das Gaußsche Kinderwunder

Von Carl Friedrich Gauß (* 30. April 1777 in Braunschweig, † 23. Februar 1855 in Göttingen) geht die Geschichte um, dass er in der 1. Klasse Grundschule schon seine erste Mathematische Erfindung tätigte, als sein Lehrer der Klasse die Übungsaufgabe aufgab: Addiert alle Zahlen von 1 bis 100!

Der kleine Carl Friedrich soll sich sogleich gemeldet haben mit der Antwort 5050. Wie hat er das wohl gemacht? Schließlich ist ...

1 + 2 + 3 + 4 + 5 + ... + 98 + 99 + 100 =

... ja für Erstklässler keine "Aufgabe auf einen Blick". Tja hängt wohl vom persönlichen Blick ab! JavaSkript kann da etwas hölzerner vorgehen ...:

Programm 2: Das Gaußsche Kinderwunder

//Das Gaußsche Kinderwunder
x=1;
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 ...

//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!