Gymnasium Löbau/Vertiefungsklasse 2013/Komplexe Übung (I): Würfelexperimente mit einem Würfel

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Javascript</language>
== Mehrfachverzweigungen ==

Gegeben sind die nachfolgenden Funktionen zur Simulation des Würfelns mit einem idealen Würfel.

<code id="5c0408d83bce9">
var z1 = 0, z2 = 0, z3 = 0, z4 = 0, z5 = 0, z6 = 0;

function wuerfel1(anzahl) {
 for (var i = 1; i <= anzahl; i++) {
  var zufall = Math.floor(Math.random() * 6 + 1);
  switch (zufall) {
   case 1: z1++; break; 
   case 2: z2++; break;
   case 3: z3++; break;
   case 4: z4++; break;
   case 5: z5++; break;
   default: z6++;
  }
 }
}

function wuerfelAusgabe1() {
 console.log("Augenzahl 1: " + z1);
 console.log("Augenzahl 2: " + z2);
 console.log("Augenzahl 3: " + z3);
 console.log("Augenzahl 4: " + z4);
 console.log("Augenzahl 5: " + z5);
 console.log("Augenzahl 6: " + z6);
}
</code>

<run id="5c0408d83bd61">
wuerfel1(1000);
wuerfelAusgabe1();
</run>

Die <tt>switch-case-default</tt>-Syntax gestattet die Konstruktion von ''Mehrfachverzweigungen''. Die Anzahl der Fallunterscheidungen ist dabei beliebig. Der Anweisungsblock nach <tt>default</tt> wird in allen Fällen ausgeführt, die nicht zuvor untersucht worden sind.
<blockquote>[[Bild:Mehrfachverzweigung1.gif]]</blockquote>
Trotzdem erkennen wir schnell Grenzen dieser Implementation:
* Der Gebrauch einer großen globaler Variablen kann zu unerwünschten Nebeneffekten führen.
* Gleichartige Anweisungen treten gehäuft auf.
* Eine Generalisierung der Lösungsidee (z.B. zur Simulation des Werfens mehrerer Würfel) ist nicht problemlos möglich.
* Die Wertübergabe an weitere Funktionen (z.B. zur grafischen Darstellung) ist ebenfalls eingeschränkt.
Wir wollen deshalb die Zählergebnisse mit der Datenstruktur Feld verwalten.

== Zählung mit einer Feldvariablen ==

<code id="5c0506ea2a5f3" hidden>
var rand = 50;
var maxBreite = 400 - 2 * rand;
var maxHoehe = 300 - 2 * rand;

function minMax(feld) {
 var ergebnis = new Array(0, 0);
 for (var i = 0; i < feld.length; i++) {
  if (ergebnis[0] > feld[i]) ergebnis[0] = feld[i];
  if (ergebnis[1] < feld[i]) ergebnis[1] = feld[i];
 }
 return ergebnis;
}

function balken(turtle, hoehe, breite) {
 turtle.forward(breite); turtle.left(90); 
 turtle.forward(hoehe); turtle.left(90);
 turtle.forward(breite); turtle.left(90);
 turtle.forward(hoehe); turtle.left(90);
 turtle.forward(breite); 
}

function BalkenDiagramm(canvas, turtle, feld) {
 var breite = maxBreite / feld.length; 
 var extremWert = minMax(feld);
 var min = extremWert[0];
 var max = extremWert[1];
 canvas.clear();
 turtle.hide();
 turtle.move(rand, rand + max /(max - min) * maxHoehe);
 turtle.right(90);
 for (var i = 0; i < feld.length; i++)
  balken(turtle, feld[i] / (max - min) * maxHoehe, breite);
}

function wuerfelTest(feld, anzahl) {
 var summe = 0;
 for (i = 0; i < feld.length; i++)
  summe = summe + feld[i];
 return (feld.length == 6) && (summe == anzahl);
}
</code>

Die Zählung einer zufällig geworfenen Augenzahl soll mit einer Feldvaraiblen erfolgen. Dabei entspricht der Feldindex der um $1$ verminderten Zufallszahl. Vervollständige die nachfolgenden Funktion unter Nutzung des bereitgestellten Struktogramms.

<blockquote>
<table cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="top" width="230">[[Bild:wuerfel2.gif]]</td>
<td align="left" valign="top" width="870">
<code id="5c05031793dee">
function wuerfel2(anzahl) {
 var ZaehlFeld = new Array(0, 0, 0, 0, 0, 0);
 // -- weitere Anweisungen --
 return ZaehlFeld;
}

function wuerfelAusgabe2(ZaehlFeld) {
 for (var i = 0; i < ZaehlFeld.length; i++)
  console.log("Augenzahl " + (i + 1) + ": " + ZaehlFeld[i]);
}
</code>

<check execute="wuerfelTest(wuerfel2(10), 10) && wuerfelTest(wuerfel2(100), 100)">
true
</check>
</td>
</tr>
</table>
</blockquote>

<canvas w="400" h="300"></canvas>

<run id="5c05031793e82">
var newZaehlFeld = wuerfel2(1000);
wuerfelAusgabe2(newZaehlFeld);
BalkenDiagramm(canvas1, turtle1, newZaehlFeld);
</run>