Websiteentwicklung: JavaScript: Programmablauf und Kontrollstrukturen: Lösungen
Aus Wikibooks
Lösungen zu Programmablauf und Kontrollstrukturen
1. Einen Anweisungsblock definiert man, indem man die Anweisungen zwischen geschweifte Klammern schreibt.
{
Anweisung 1; Anweisung 2; ... Anweisung n;
}
2. Die Funktion „fDoppelt“ könnte so aussehen:
function fDoppelt(dZahl)
{
return dZahl*2;
}
3. Die HTML-Seite mit der Funktion „fDoppelt“ könnte so aussehen:
<html>
<head>
<title>Zahl-Verdopplung</title>
<script type="text/javascript" language="JavaScript">
<!--
function fDoppelt(dZahl)
{
return dZahl*2;
}
var dZahl=parseFloat(prompt("Gib eine Zahl ein!"));
alert("Das Doppelte von " + dZahl + " ist " + fDoppelt(dZahl) + "!")
//-->
</script>
<noscript>
Bitte aktivieren Sie JavaScript - sonst gilt:
Wie Sie sehen, sehen Sie nichts!
</noscript>
</head>
<body>
<h2>Eine Zahl wurde mit JavaScript verdoppelt!</h2>
</body>
</html>
4. Die Lösung könnte so aussehen:
<html>
<head>
<title>Verdopplungs-Schleife</title>
<script type="text/javascript" language="JavaScript">
<!--
function fDoppelt(dZahl)
{
return dZahl*2;
}
//-->
</script>
<noscript>Bitte schalten Sie JavaScript ein</noscript></head>
<body>
<h3>Verdopplungs-Schleife</h3>
<script language="JavaScript">
<!--
for(var i=10; i<=100; i=i+10)
{
document.write("Das Doppelte von " + i + " ist " + fDoppelt(i) + "!<br>");
}
//-->
</script>
</body>
</html>
5. Bei einer Schleife mit while wird vor dem ersten Durchlauf die Bedingung geprüft und die Schleife möglicherweise gar nicht durchlaufen, bei einer Schleife mit do ... while erfolgt die Prüfung nach dem ersten Durchlauf, ein Durchlauf ist also garantiert.
6. Bei der Anweisung if...else folgt hinter if eine Bedingung in runden Klammern, dann ein Anweisungsblock in geschweiften Klammern, dann das else und ein weiterer Anweisungsblock in geschweiften Klammern. Bei einer erfüllten Bedingung hinter if wird der erste Block ausgeführt, bei einer unerfüllten Bedingung der zweite hinter else!
7. Die Lösung für eine Primzahlfunktion (inklusive der Teiler-Funktion) könnte so aussehen:
function fTeiler(iZ,iT)
{
if (iT > 0)
{
var iR =0;
iR=iZ%iT;
if(iR==0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
function fIstPrim(iN)
{
// die Scan-Untergrenze wird mit 1 festgelegt
var iMin=0;
// die Scan-Obergrenze mit der zu untersuchenden Zahl
var iMax=iN;
//Variable Anzahl der Teiler definieren und 0 setzen
var iTAnz=0;
//boolesche Variable bIT (bIstTeiler) definieren + false setzen
var bIT=false;
var i=iMin;
//die folgende WHILE-Schleife durchläuft alle
//ganzen Zahlen von Untergrenze (iMin) bis Obergrenze (iMax) oder Anzahl Teiler >0
//d.h. ein echter Teiler wurden gefunden
while(i<=iMax && iTAnz==0)
{
i=i+1;
if((i>iMin+1) && (i<iMax-1))
{
bIT=fTeiler(iN,i);//Aufruf der Teilerfunktion
if(bIT)
{
iTAnz++; // ist Teiler - iTAnz wird erhöht
}
}
}
//Das Ergebnis (Anzahl Teiler) wird ausgewertet
if(iTAnz==0)
return true;
else
return false;
}
Die Lösung kommt mit spartanischen Mitteln aus. Man könnte noch die Laufzeit minimieren, z.B. indem man ab 3 in 2-er-Schritten hochzählt (außer 2 gibt es ja keine geraden Primzahlen) und indem man die Obergrenze auf den ganzzahligen Teil der Quadratwurzel der zu prüfenden Zahl begrenzt - dazu würde allerdings das Math-Objekt benötigt (wegen der benötigten Ganzzahl-Methode „Math.floor“ und der Quadratwurzel-Methode „Math.sqrt“), das bisher noch nicht besprochen wurde. Korrekterweise müsste auch noch die Ausgabe der 1 als Primzahl unterdrückt werden, weil alle Primzahlen genau 2 Teiler haben, nämlich 1 und sich selbst - 1 hat aber nur einen Teiler - nämlich 1. Als Lehrbeispiel zeigt dieses Programm aber, wie mächtig JavaScript ist bzw. was man mit den wenigen bisher besprochenen Mitteln bereits erreichen kann.
9. Die Lösung für eine HTML_Seite, die eine Primfaktor-Zerlegung leistet, könnte so aussehen:
<html>
<head>
<title>Primfaktorbestimmung in Javascript</title>
<meta name="author" content="S.Möller">
<script type="text/javascript" language="JavaScript">
<!-- // Script-Beginn
function fTeiler(iZ,iT)
{
if (iT > 0)
{
var iR =0;
iR=iZ%iT;
if(iR==0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
function fIstPrim(iN)
{
// die Scan-Untergrenze wird mit 1 festgelegt
var iMin=0;
// die Scan-Obergrenze mit der zu untersuchenden Zahl
var iMax=iN;
//Variable Anzahl der Teiler definieren und 0 setzen
var iTAnz=0;
//boolesche Variable bIT (bIstTeiler) definieren + false setzen
var bIT=false;
var i=iMin;
//die folgende WHILE-Schleife durchläuft alle
//ganzen Zahlen von Untergrenze (iMin) bis Obergrenze (iMax) oder Anzahl Teiler >0
//d.h. ein echter Teiler wurden gefunden
while(i<=iMax && iTAnz==0)
{
i=i+1;
if((i>iMin+1) && (i<iMax-1))
{
bIT=fTeiler(iN,i);//Aufruf der Teilerfunktion
if(bIT)
{
iTAnz++; // ist Teiler - iTAnz wird erhöht
}
}
}
//Das Ergebnis (Anzahl Teiler) wird ausgewertet
if(iTAnz==0)
return true;
else
return false;
}
function fPrimFaktorAusgabe()
{
with(document.frmPrim)
{
var iZahl=parseInt(txtZahl.value);
var iTemp=iZahl;
var iF=2;
var iFmin=2;
var bIT=false;
var bIP=false;
if(iZahl>=1)
{
tAusgabe.value="Primfaktorzerlegung von " + iZahl + "\n \n";
while(iTemp>1)
{
bIP=fIstPrim(iF);
if(bIP==true)
{
bIT=fTeiler(iTemp,iF);
if(bIT==true)
{
tAusgabe.value=tAusgabe.value + iF + "\n";
iTemp=iTemp/iF;
}
else
{
if(iF==2)
{
iF=iF+1;
}
else
{
iF=iF+2;
}
}
}
else
{
iF=iF+1;
}
}
tAusgabe.value=tAusgabe.value + "\n"+ "\n" + "Fertig !";
}
else
{
alert("Größer als 1 habe ich gesagt!");
}
}
}
// Scriptende -->
</script>
</head>
<body>
<form method="get" name="frmPrim">
<h2>Primzahlfaktorisierung einer Zahl n</h2>
<b>Gib eine ganze Zahl n >= 2 ein:</b><br>
<input type="text" name="txtZahl"></input><br>
<input type="button" name="btnStart" value="Primzahlfaktorisierung starten"
onClick="fPrimFaktorAusgabe()"></input>
<br>
<textarea name="tAusgabe" cols="20" rows="20"></textarea>
</form>
</body>
</html>


