Gymnasium Löbau/Vertiefungsklasse 2013/Wiederholung: Datentypen und Programmstrukturen
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
An einfachen Problemstellungen wollen wir ausgewählte Datentypen und Programmstrukturen in JavaScript wiederholen.
<code id="5b82ce93bff2e" hidden>
function runden(x, n) {
return Math.round(x * Math.pow(10, n)) / Math.pow(10, n);
}
function intKorrekt(z, min, max) {
var korrekt = false;
var i = min;
do {
korrekt = (z == i);
i++;
}
while (i <= max && !korrekt);
return korrekt;
}
</code>
== Fakultät einer natürlichen Zahl ==
Die Fakultät einer natürlichen Zahl berechnet sich aus:
<blockquote>$n! = 1 \cdot 2 \cdot 3 \cdot ... \cdot n$</blockquote>
Implementiere diese Bildungsvorschrift mit einer Funktion und teste diese mit (kleinen) Argumenten.
<code id="5b82646eb3149">
function fakultaet(n) {
var produkt = 1;
// -- weitere Anweisungen --
return produkt;
}
</code>
<check execute="(fakultaet(2) == 2 && fakultaet(6) == 720)">true</check>
<run id="5b82646eb31d2">
fakultaet(6);
</run>
== Das Heron-Verfahren ==
Das Heron-Verfahren ist ein Näherungsverfahren zur Bestimmung der ''Quadratwurzel'' einer beliebigen positiven reellen Zahl $z$.
Aus einem beliebigen Startwert $x$ ergibt sich aus der nachfolgenden Gleichung mit $x_0$ ein erster Näherungswert für $\sqrt{z}$:
<blockquote>$x_0 = \frac{x + \frac{z}{x}}{2}$</blockquote>
Wird $x_0$ als neuer Startwert in diese Gleichung eingsetzt, erhält man einen besseren Näherungswert.<br />
Durch mehrfaches Anwenden dieses Verfahrens kann der Wert von $\sqrt{z}$ mit beliebiger Genauigkeit angenähert werden. <br />
Vervollständige dazu die entsprechende Funktion.
<code id="5b826f3a1ca84">
function heron(z, x) {
var x0 = x;
// -- weitere Anweisungen --
return x0;
}
</code>
<check execute="(runden(Math.sqrt(2), 6) == runden(heron(2, 1), 6) && runden(Math.sqrt(13), 6) == runden(heron(13, 71), 6))">true</check>
<run id="5b826dc024ec9">
heron(2, 1);
</run>
== Die Fibonaccizahlen ==
<table border="0">
<tr>
<td valign="top">
Einer der bedeutendsten Mathematiker des Mittelalters, '''Leonardo Fibonacci di Pisa''' (* um 1180; † 1241), beschrieb die Fortpflanzung von Kaninchen mit der Zahlenfolge:
<blockquote>$1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...$</blockquote>
'''Definition:'''
<blockquote>
$\mbox{fibo}(n)=\begin{cases}1,\mbox{wenn}\hspace{0.3em}n=1\\1,\mbox{wenn}\hspace{0.3em}n=2\\\mbox{fibo}(n-1)+\mbox{fibo}(n-2),\mbox{sonst}\end{cases}$
</blockquote>
'''Beschreibung:'''
* Die ersten beiden Glieder der Zahlenfolge sind jeweils 1.
* Jedes weitere Glied ergibt sich aus der Summe seiner beiden Vorgänger.
<br/>
Eine allgemeine Formel zur Berechnung der n-ten Fibonaccizahl wurde unabhängig voneinander von den französischen Mathematikern '''Abraham de Moivre''' (* 26. Mai 1667; † 27. November 1754) erst im Jahr 1718 und '''Jacques Philippe Marie Binet''' (* 2. Februar 1786; † 12. Mai 1856) sogar erst im Jahr 1843 entdeckt.
</td>
<td valign="top">
[[Bild:Fibonacci1.jpg|miniatur|Berechnung der "Kaninchenaufgabe" mit der Fibonacci-Folge]]
</td>
</tr>
</table>
Ergänze die nachfolgende Funktion und teste sie mit kleinen Argumenten.
<code id="5b9f5d298bead">
function fibo(n) {
var f1 = 1, f2 = 1;
var f;
// -- weitere Anweisungen --
return f2;
}
</code>
<check execute="(fibo(1) == 1 && fibo(2) == 1 && fibo(6) == 8 && fibo(33) == 3524578)">true</check>
<run id="5b9f5d298bfc1">
fibo(6);
</run>
== Zufallszahlen ==
Mit den nachfolgenden Funktionen lassen sich beliebige Zufallszahlen ereugen:
Math.random() ... erzeugt eine (rationale) Zufallszahl $z$ im Intervall $0 \le z < 1$
Math.floor(z) ... rundet die Zahl $z$ auf die nächstniedrigere ganze Zahl ab
Experimentiere mit diesen Funktionen, so dass große ''ganze'' Zufallszahlen generiert werden.
<run id="5b82c1c29723c">
Math.floor(Math.random() * 10);
</run>
Vervollständige nun die nachfolgende Funktion, mit der das Werfen eines Würfels simuliert werden soll.
<code id="5b82c1c2971b4">
function wuerfelzahl() {
var w;
return w;
}
</code>
<code id="5b9760aaac5a7" hidden>
function wurfKorrekt(maxAnz) {
var z = [], i = 1;
var w;
var korrekt = false;
do {
w = wuerfelzahl();
korrekt = intKorrekt(w, 1, 6);
if (korrekt) z[w - 1]++;
i++;
}
while (korrekt && i < maxAnz);
return (korrekt && z.length == 6);
}
</code>
<check execute="(wurfKorrekt(1000))">true</check>
<run id="5b82c1c2972a1">
wuerfelzahl();
</run>
== Zufallsexperimente ==
=== Werfen einer Münze ===
Simuliere mit der nachfolgenden Prozedur das Werfen einer Münze. Dabei soll ausgegeben werden, wie oft Kopf und Zahl gefallen sind.
<code id="5b82f3a3aadf9">
function muenzwurf(anz) {
var kopf = 0, zahl = 0;
// -- weitere Anweisungen --
return "Kopf: " + kopf + " / " + "Zahl: " + zahl;
}
</code>
<run id="5b82f3a3aae93">
muenzwurf(100);
</run>
=== Würfeln mit einem Würfel ===
Wie oft muss im Mittel ein Würfel geworfen werden, bis ''nacheinander'' zwei Sechsen gefallen sind?
<code id="5b82f8b67d4b6">
function wuerfeln1() {
var w1 = 0, w2 = 0, z = 0;
// -- weitere Anweisungen --
return z;
}
function wuerfelexperiment1(anz) {
var z = 0, mw = 0;
// -- weitere Anweisungen --
return mw;
}
</code>
<run id="5b82f8b67d56b">
wuerfelexperiment1(100);
</run>
=== Würfeln mit zwei Würfeln ===
Wie oft müssen im Mittel zwei Würfel geworfen werden, bis beide Augenzahlen gleich sind?
<code id="5b82fc48d8245">
function wuerfeln2() {
var w1 = 0, w2 = 0, z = 0;
// -- weitere Anweisungen --
return z;
}
function wuerfelexperiment2(anz) {
var z = 0, mw = 0;
// -- weitere Anweisungen --
return mw;
}
</code>
<run id="5b82fc48d82ec">
wuerfelexperiment2(100);
</run>
== Widerstandsnetzwerk ==
<code id="5b96384641b90" hidden>
function grenzwert(r) {
return (Math.sqrt(5) + 1) / 2 * r;
}
</code>
Zunächst besteht eine einfache elektrische Grundschaltung aus 2 gleichgroßen Widerständen. Durch Anhängen weiterer dieser Grundschaltungen entsteht daraus ein komplexes Widerstandsnetzwerk:
<p>[[Bild:Widerstandsnetzwerk1.GIF]]</p><br />
Entwickle eine Funktion, die den Gesamtwiderstand zwischen den Anschlussklemmen <math>A</math> und <math>B</math> berechnet, wenn <math>n</math> Grundschaltungen zu diesem Widerstandsnetzwerk zusammengesetzt wurden.
<code id="5b9760aaac634">
function widerstand(r, n) {
var r_ges = 2 * r;
// -- weitere Anweisungen --
return r_ges;
}
</code>
<check execute="(runden(widerstand(123, 10), 3) == runden(grenzwert(123), 3) && runden(widerstand(11256, 10), 2) == runden(grenzwert(11256), 2))">true</check>
<run id="5b96384641d05">
widerstand(100, 10);
</run>