Bisher wurden die einzelnen Anweisungen der Reihe nach ausgeführt. Oftmals will man aber die Aktionen nur unter gewissen Umständen oder gar öfter ausführen.
Kontrollstrukturen definieren die Art der Ausführung von einzelnen Anweisungen. So kann angegeben werden, dass eine Folge von Anweisungen wiederholt oder in Abhängigkeit von Bedingungen ausgeführt wird.
Die bedingte Ausführung ist eine Menge von Anweisungen, die nur ausgeführt werden, wenn eine Bedingung erfüllt ist. JavaScript kennt zwei Arten von bedingter Ausführung:
Durch die if Anweisung wird eine Anweisung nur ausgeführt, wenn eine Bedingung zu true auswertbar ist. Der optional anzugebende else Teil wird ausgeführt, wenn die Bedingung nicht wahr ist.
Syntax:
if ( condition )
statement1
[ else
statement2
]
condition kann ein JavaScript Ausdruck sein, der zu einem booleschen Wert auswertbar ist.
Durch das folgende Programm wird das Maximum von zwei Zahlen ermittelt.
Soll mehr als eine Anweisung (statement1, statement2) ausgeführt werden, so sind die Anweisungsfolgen in geschweifte Klammern einzuschließen.
Da JavaScript interpretiert wird, sollte man bemüht sein, den Kode so kurz zu halten. Bei Programmiersprachen, bei denen ein Compiler der Quelltext übersetzt und dabei optimiert, ist das nicht so wichtig. Das obige Beispiel ist effektiver, wenn man Anweisung zur Ausgabe nach die if Anweisung schreibt, da sie doch in jedem Fall ausgeführt wird.
Entwickeln Sie eine JavaScript Funktion
max(a,b)
die als Ergebnis das Maximum der Zahlen a und b liefert. Ist a oder b keine Zahl, so soll der Rückgabewert "undefined" sein. Verwenden Sie if-else Anweisungen.
If-else Anweisungen können verschachtelt auftreten. Dadurch muss festgelegt werden, welches else zu welchem if gehört. Ein else gehört stets zum vorherigen if, für das kein else existiert (Klammern müssen berücksichtigt werden).
Dies ist an folgendem Beispiel verdeutlicht den Sachverhalt:
Soll im o.a. Beispiel das else zum ersten if gehören, also die Zahl 20 ausgedruckt werden, wenn x negativ ist, dann ist zu Klammern.
Die allgemeine Form, eine Entscheidung unter mehreren Alternativen zu programmieren ist:
if (expr1)
|
Sobald die erste Bedingung (expri) erfüllt ist, wird die Anweisung stati ausgeführt und die if-else-Kette verlassen. Die letzte Anweisung statn wird ausgeführt, wenn keine Bedingung erfüllt ist.
Entwickeln Sie ein Programm, das bei Eingabe eines Monats die Anzahl der Tage des Monats ausgibt. Verwenden Sie if-else Ketten.
Die switch Anweisung wählt eine von mehreren Alternativen aus. Dabei wird untersucht, ob ein Ausdruck einem von mehreren konstanten Werten besitzt.
Syntax:
switch ( expression ) {
case label :
statement;
case label:
statement;
...
default:
statement;
}
Zunächst wird der Wert von expression ermittelt, dann wird das label gesucht, das mit dem Wert übereinstimmt. Álle Anweisungen (statement) ab diesem "Sprungziel" werden ausgeführt. Will man nur genau die Anweisung, die zum label gehört ausführen, so ist folgende Konstruktion zu wählen:
switch ( expression ) {
case label :
statement;
break;
case label:
statement;
break;
...
default:
statement;
}
Die break Anweisung bewirkt das Verlassen der switch Anweisung.
Das nachfolgende Beispiel ermittelt die Anzahl der Tage eines Monats mittels einer switch Anweisung.
Eine Schleife faßt Anweisungen zusammen, die insgesamt solange ausgeführt werden, wie eine anzugebende Bedingung noch erfüllt ist.
JavaSript kenn folgende Arten von Schleifen:
Eine for Schleife wiederholt Anweisungen solange die zugehörige Bedingung erfüllt ist.
Syntax
for ( [initialExpression] ; [condition] ; [incrementExpression] ) {
statements
}
Die Verarbeitung der for Schleife funktioniert wie folgt in den Schritten:
Das folgende Beispiel zeigt wie Umrechnung von Fahrenheit in Celsius mit einer for Schleife
Ein Beispiel aus dem Bereich WEB Design zählt die Selektionsoptionen in einer Liste (multiple select option).
Eine while Schleife führt ihre Anweisungen solange wie ihre Bedingung sich zu true auswertet.
Syntax
while ( condition ) {
statements
}
Zunächst wird condition ausgewertet. Ist das Ergebnis true, so werden die Anweisungen (statements) ausgeführt, dann wird condition geprüft usw.
Da die Bedingung zuerst geprüft wird bevor eine Anweisung ausgeführt wird, nennt man diese Schleifenform auch "Schleife mit abweisendem Charakter".
| Beispiel 3.2-3 | |
Wenn man beim Programmieren vergisst, die Bedingungsvariablen zu verändern, ist schnell eine Unendlichschleife entstanden - das Programm terminiert nie.
| Beispiel 3.2-4 (Unendlichschleife) | |
Eine Schleifenform mit nicht abweisendem Charakter ist die do-while Schleife.
Syntax:
do {
statements
} while ( condition )
Die Anweisungen (statements) werden einmal ausgeführt, dann wird condition geprüft und in Abhängigkeit des Ergebnisses wird wiederholt oder nicht.
| Beispiel 3.2-5 (Unendlichschleife) | |
Die Programme in 3.2.3 und 3.2.5 liefern gleiche Ergebnisse, es sei den man startet mit einem negativen Wert für i oder i ist 0.
Gegeben sei folgendes Programm.
var x = 1; |
Formulieren Sie das Programm um, so dass das gleiche Resultat erzeugt wird, indem Sie die for Schleife in
a) eine while Schleife
b) eine do while Schleife
ersetzen.
Eine weiter Art, Wiederholungen auszudrücken, sind rekursive Funktionen.
Eine Funktion heißt rekursiv, wenn sie direkt oder indirekt selbst aufgerufen wird.
Verdeutlicht werden rekursive Funktionen am Beispiel einer Funktion zum Drucken von Zahlen.
| Beispiel 3.3-1 | |
Ein Standardbeispiel rekursiver Funktion ist die Funktion Fakultät.
Die Fakultät einer Zahl ist definiert:
iterativ:
n! = n * (n-1) * (n-2) * ... * 2 * 1
rekursiv:
factorial (1) = 1;
factorial (n) = n * factorial (n-1)
Die programmtechnische Realisierung ist am nächsten Beispiel demonstriert:
| Beispiel 3.3-2 (rekursiv) | |
| Beispiel 3.3-3 (iterativ) | |
Der größte gemeinsame Teiler zweier natürlicher Zahlen ist definiert als:
rekursiv:
ggt(q,s) = 0 wenn s = 0
ggt(s,q%s) sonst
iterativ:
ggt(q,s) =
setze t = s
bestimme s = q % s
setze q = t
wiederhole die Schritte 1 - 3 solange bis r = 0; dann ist q das Ergebnis
Formulieren Sie das Programm
a) als rekursive Funktion
b) als nicht rekursive Funktion
Fibonacci Zahlen ist definiert als:
1,1,2,3,5,8,13,21, ...
D.h. die n-te Fibonacci Zahl ist die Summe der n-1-ten und der n-2-ten Fibonacci Zahl, wobei die 1. und 2. Fibonacci Zahl 1 ist.
Formulieren Sie die Lösung als rekursive Gleichung und schreiben sie ein Programm für die iterative und die rekursive Vorgehensweise.
Worin Unterscheiden sich beide Lösungen (Hinweis: ermitteln Sie mit Ihren Lösungen fibo(100).)
Die Eulerfunktion euler(n) gibt die Anzahl der zu n teilerfremden natürlichen Zahlen aus, die kleiner als n sind. Dabei heißen zwei Zahlen teilerfremd, wenn ihr größter gemeinsamer Teiler 1 ist.
Schreiben Sie ein Programm, das den Wert der Eulerfunktion von 1 bis einer einzulesenden Zahl > 3 auflistet. Verwenden Sie die bereits entwickelte Funktion ggt.
Beispiel:
euler(6) = 2, denn
ggt(1,6) =
1
ggt(2,6) = 2
ggt(3,6) = 3
ggt(4,6) = 2
ggt(5,6) =
1
Die Ausgabe des Programms bei Eingabe 6 sieht also wie folgt aus:
1 0
2 1
3 2
4 2
5 4
6 2
Ein label ist eine Anweisung, die eine Stelle im Programm identifiziert, so dass man auf sie verweisen kann.
Die Verwendung wird im nächsten Abschnitt bei der break Anweisung verdeutlicht.
Syntax:
label :
statement
label kann dabei ein beliebiger JavaScript Name sein, ausgenommen reservierte Worte.
Die break Anweisung wird verwendet, um switch Anweisungen, Schleifen zu verlassen oder zu Label zu "springen".
Syntax
Eine break Anweisung bewirkt:
| Beispiel 3.5-1 | |
Die continue Anweisung führt eine Schleife erneut aus.
Syntax
Die continue Anweisung beendet die aktuelle Schleife und setzt die Ausführung bei der Abarbeitung der Schleifenbedingung fort. Man nennt continue deshalb auch Restartanweisung.
| Beispiel 3.5-2 | |
| Beispiel 3.5-3 | |