3.8 Lösungen
1. Zuerst soll der Benutzer eine Zahl eingeben. Dazu benutzen Sie die
Funktion window.prompt(), die Sie in der Lerneinheit kennen gelernt
haben. Die eingegebene Zahl speichern Sie in einer Variablen, damit
Sie in den folgenden Anweisungen darauf zurückgreifen
können:
var eingabezahl;
eingabezahl = window.prompt("Bitte geben Sie eine Zahl ein!");
Nun muss überprüft werden, ob die Zahl gerade oder ungerade
ist. Sie erinnern sich hoffentlich noch an den Modulo-Operator aus
Lerneinheit 2. Wenn eingabezahl % 2 gleich 0 ist, ist die Zahl gerade und
es soll die entsprechende Ausgabe erscheinen. Wenn nicht, soll
"ungerade" geschrieben werden. Das Wort
"wenn" deutet schon darauf hin, dass Sie eine
if-Anweisung benötigen:
if (eingabezahl % 2 == 0){
document.write("gerade");
}else{
document.write("ungerade");
}
Haben Sie daran gedacht, ein doppeltes Gleichheitszeichen zu setzen? Sie
wollen schließlich vergleichen und keine Zuweisung vornehmen. (In
diesem Fall würde ein einfaches Gleichheitszeichen zu einer
Fehlermeldung führen, da auf der linken Seite nicht nur eine
Variable steht.)
2. (In Übung 3.2 probieren Sie verschiedene Varianten aus; dazu gibt es keine Musterlösung.)
3. Die Lösung dieser Übung besteht darin, zwei bedingte Ausdrücke ineinander zu verschachteln:
<script type="text/javascript"> var toreBayern = 3; var toreHertha = 2; var meldung = (toreHertha == toreBayern) ? "Unentschieden" : ((toreHertha > toreBayern) ? "Hertha hat gewonnen" : "Bayern hat gewonnen"); alert(meldung); </script>Die Bedingung des äußeren Ausdrucks prüft, ob beide Mannschaften gleich viele Tore geschossen haben. In diesem Fall hat er den Wert "Unentschieden". Anderenfalls nimmt er den Wert des zweiten, hinter dem ersten Doppelpunkt stehenden bedingten Ausdrucks an. Dieser stellt fest, welche Mannschaft mehr Tore geschossen hat und nimmt dann den entsprechenden Wert an. Wie Sie sehen, werden solche Verschachtelungen schnell unübersichtlich. Eine entsprechende Klammerung (auch da, wo sie nicht unbedingt notwendig ist) kann zwar helfen, den Überblick zu bewahren, doch generell sollten Sie im Interesse der Lesbarkeit Ihrer Programme überlegen, auf solche Konstrukte zu verzichten.
4. Die Aufforderung an den Benutzer, die drei Werte einzugeben,
sollte kein Problem mehr darstellen. Sie benutzen wieder die Funktion
window.prompt(). Denken Sie aber vorher daran, die drei
benötigten Variablen zu deklarieren.
var tag, monat, jahr;
tag = window.prompt("Bitte Tag eingeben:");
monat = window.prompt("Bitte Monat eingeben:");
jahr = window.prompt("Bitte Jahr eingeben:");
Zuerst soll überprüft werden, ob der für den Monat
eingegebene Wert erlaubt ist. Wenn der Benutzer hier etwas falsches
eingegeben hat, erscheint eine Fehlermeldung. Der Monat ist falsch, wenn
er kleiner ist als 1 (monat < 1) oder größer
ist als 12 (monat > 12).
Wie hier schon im Satz zu sehen, sind diese beiden
Bedingungen durch ein ODER verknüpft. Wir können also
formulieren:
if (monat < 1 || monat > 12) {
alert("Die Monatsangabe ist nicht korrekt!");
}
Hinweis:
Oftmals kommt man auf die Idee, als Bedingung folgendes zu schreiben:
(monat < 1 || > 12), weil man sprachlich formuliert
"Falls der Monat kleiner 1 oder größer 12
ist...". Eine solche Konstruktion ist nicht möglich, da
der ODER-Operator auf beiden Seiten vollständige Bedingungen
verlangt, die auch für sich allein stehen könnten. Dies ist
bei > 12 nicht der Fall.
Die Anweisungen zur Überprüfung des Tages werden im
else-Teil dieser if-Anweisung untergebracht, da sie natürlich nur
dann ausgeführt werden sollen, wenn der eingegebene Monat korrekt
ist. Zuerst muss wieder eine Variable deklariert werden, nämlich
hoechsteErlaubteTage. Der Übersichtlichkeit halber stellt man
alle Deklarationen an den Anfang des Skriptes, dann hat man alle
Variablen beisammen.
var hoechsteErlaubteTage;
Ihr sollen die Werte 31, 30 oder 28 zugewiesen werden, je nachdem,
welchen Monat der Benutzer eingegeben hat. Bei 1, 3, 5, 7, 8, 10 oder
12 hat der Monat 31 Tage, im Februar (monat == 2) sind es nur 28, bei
den restlichen Monaten 30. Wir benötigen also wieder eine
if-Bedingung, mit der diese Überprüfung, welcher Monat
eingegeben wurde, ausgeführt werden kann:
if (monat == 1 || monat == 3 || monat == 5
|| monat == 7 || monat == 8 || monat == 10 || monat == 12) {
hoechsteErlaubteTage = 31;
} else {
if (monat == 2) {
hoechsteErlaubteTage = 28;
} else {
hoechsteErlaubteTage = 30;
}
}
Nun fehlt nur noch die Überprüfung, ob auch der eingegebene Tag
im zulässigen Bereich ist. Dies ist der Fall, wenn er
größer oder gleich 1 ist und kleiner oder gleich dem
höchsten zulässigen Tag für diesen Monat. Das lässt
sich im Programm so schreiben:
if (tag >= 1 && tag <= hoechsteErlaubteTage) {
alert("Das Datum ist korrekt!");
} else {
alert("Den Tag gibt es in diesem Monat nicht.");
}
In diesem Beispiel haben Sie sicherlich eins bemerkt: Wenn man die
Bedingungen, die zu überprüfen sind, vorher einmal sehr genau
formuliert, dann ist es ziemlich leicht, sie auch im Programm
hinzuschreiben. In der sprachlichen Formulierung ist meistens klar, ob
man UND oder ODER verwendet. Das vollständige Programm finden Sie
hier.
5. Wenn Sie die break-Anweisungen weglassen, sehen Sie, dass von dem
jeweils zutreffenden Fall an sämtliche Ausgabeanweisungen
ausgeführt werden.
6. Das Programm beginnt mit der Deklaration der benötigten Variablen und den Eingabeaufforderungen. Sinnvollerweise deklarieren wir gleich noch eine Variable für das Ergebnis der Berechnung.
var zahl1, zahl2, rechenzeichen, ergebnis;
zahl1 = window.prompt("Bitte erste Zahl eingeben:");
rechenzeichen = window.prompt("Bitte Rechenzeichen eingeben:");
zahl2 = window.prompt("Bitte zweite Zahl eingeben:");
Je nach eingegebenem Rechenzeichen sieht die durchzuführende
Rechnung ein wenig anders aus. Da hier die auszuführenden Aktionen
allein vom Wert einer einzigen Variablen abhängen, bietet sich eine
switch-Anweisung an:
switch (rechenzeichen) {
case "+": ergebnis = zahl1 + zahl2;
break;
case "-": ergebnis = zahl1 - zahl2;
break;
case "*": ergebnis = zahl1 * zahl2;
break;
case "/": ergebnis = zahl1 / zahl2;
break;
}
Sicherlich wundern Sie sich, warum der ganze Aufwand überhaupt
nötig ist. Kann man nicht einfach schreiben
ergebnis = zahl1 rechenzeichen zahl2; ?
Nein, das geht leider nicht. Das Rechenzeichen liegt nämlich als String, also als Zeichenkette vor. Üblicherweise interpretiert der Interpreter jede Eingabe als Zeichenkette. Das führt dazu, dass in dieser Programmzeile eine Zeichenkette zwischen zwei weiteren Zeichenketten (die auch als Zahlen interpretiert werden können) steht, was für den Interpreter einfach keinen Sinn ergibt. Dass ein Symbol in dem String steht, das für ihn aussagekräftig sein könnte, ist für ihn nicht erkennbar. Der Aufwand mit der
switch-Anweisung ist also nötig. Aber immerhin haben Sie nun eine
Erklärung dafür, dass das Rechenzeichen bei case immer in
Anführungszeichen stehen muss – dem Erkennungszeichen
für Strings. Fehlt nur noch die Ausgabe des Ergebnisses:
alert("Das Ergebnis lautet: " + ergebnis);
Beim Testen werden Sie feststellen, dass zwar –, * und / ganz
gut funktionieren, dass + aber vollkommen falsche Ergebnisse liefert.
Kann JavaScript etwa nicht richtig addieren? Doch, hier schlägt nur
wieder das Problem mit den Zeichenketten zu. Auch die Zahleingaben des
Benutzers werden zuerst einmal als Zeichenketten interpretiert, was dazu
führt, dass der Interpreter keine Addition ausführt, sondern
das + als String-Verkettung (Aneinanderhängen) benutzt. Wenn Sie 3 +
5 eingeben, kommt 35 heraus, nämlich 5 an die 3 angehängt. Die Frage ist jetzt, was man dagegen unternehmen kann. Später werden wir Ihnen noch andere Wege vorstellen. Der einfachste aber ist, den Interpreter zur Verarbeitung von Zahlen zu zwingen, indem man mit den Eingabe als erstes Rechnungen durchführt, die nicht falsch interpretiert werden können. Das kann z.B. eine Multiplikation mit 1 sein. Sie verändert die Zahlen nicht, ist aber eindeutig als Rechenoperation zu erkennen. Wir formulieren also um:
case "+": ergebnis = (zahl1 * 1) + (zahl2 * 1); break;Dies ist zwar kein schöner Trick, aber jetzt funktioniert's! Später werden Sie eine bessere Lösung kennen lernen.
7. Meistens werden Sie relativ lange warten, bevor Sie feststellen, dass Sie in einer Endlosschleife gefangen sind. Einige Browser brechen die Bearbeitung nach einer gewissen Zeit ab. Ansonsten bleibt Ihnen nicht anderes übrig, als den Browser mit Hilfe des Prozess-Managers Ihres Betriebssystems zu stoppen.
8. Offensichtlich sollen hier die Anweisungen zur Eingabe und zur
Überprüfung eines Datums mit Hilfe einer Schleife wiederholt
werden. Da der Benutzer auf jeden Fall mindestens einmal ein Datum
eingeben soll, bietet sich die do-while-Schleife an. Das Gerüst
für das Programm lautet dann also folgendermaßen:
//Deklarationen do { //Anweisungen zum Einlesen und Überprüfen des Datums, //kann vollständig aus Übung 3.4 übernommen werden } while (Benutzer will weitermachen);Unsere Aufgabe ist es also, zu testen, ob der Benutzer weiter machen will oder nicht. Zuerst einmal benötigen wir dazu eine boolesche Variable, in der wir die Entscheidung des Benutzers speichern können. Wie gewohnt, sollte auch diese zu Beginn des Skriptes deklariert werden:
var weitermachen;Bisher kennen Sie nur die Funktion
window.prompt(), mit der man den
Benutzer zur Eingabe eines Textes auffordern kann. In diesem Fall
benötigen wir aber nur eine Ja/Nein-Entscheidung. Dazu dient die
Funktion window.confirm(). Sie erzeugt ein kleines Fenster auf dem
Bildschirm, in dem der Benutzer auf Ja oder Nein (in einigen Browsern
auch OK und Abbrechen) klicken kann. Der Rückgabewert der Funktion
gibt die getroffene Entscheidung, also Ja (=true) oder Nein (=false), an
und kann dann in einer Variablen gespeichert werden:
weitermachen = window.confirm("Wollen Sie ein weiteres Datum überprüfen lassen?");
In der Bedingung müssen wir dann nur noch testen, ob die Variable
weitermachen den Wert true hat. Insgesamt ist das Programm
also wie folgt aufgebaut:
//Deklarationen var weitermachen; do { //Code zum Einlesen und Überprüfen des Datums, //kann vollständig aus Übung 3.4 übernommen werden weitermachen = window.confirm("Wollen Sie ein weiteres Datum überprüfen lassen?"); } while (weitermachen);Beachten Sie, dass die Frage, ob der Benutzer weitermachen will, ebenfalls in der Schleife steht. Auch diese Frage soll natürlich nach jedem neu eingegebenen Datum wiederholt werden.
9. Zuerst sollten wieder alle benötigten Variablen deklariert
werden: grenze für die Obergrenze, die der Benutzer eingibt,
summe für das Ergebnis der Berechnung und ein Zähler i, der
nacheinander die einzelnen aufzusummierenden Zahlen (1, 2, 3, ...)
annimmt.
var grenze, summe, i;Die Eingabe durch den Benutzer ist einfach:
grenze = window.prompt("Bis zu welcher Zahl wollen Sie aufsummieren?");
Wie wird nun die Summe berechnet? Wenn Sie sich die Aufgabe ansehen, wird
deutlich, dass i nacheinander die Werte 1, 2, 3, ... bis zur eingegebenen
Grenze annehmen soll, damit man sie addieren kann. Das macht man am
besten mit einer for-Schleife:
for (i= 1; i <= grenze; i++) {
...
}
i fängt bei 1 an und wird in jedem Schleifendurchlauf um eins
erhöht. Die Schleife läuft solange, wie i kleiner oder gleich
der eingegebenen Grenze ist. Was passiert nun innerhalb der Schleife?
i nimmt nacheinander die Werte
an, die wir aufsummieren wollen. Es bietet sich also an, innerhalb der
Schleife das jeweils aktuelle i zur Summe hinzuzufügen, summe also
um i zu erhöhen:
for (i= 1; i <= grenze; i++) {
summe += i;
}
Das funktioniert auch ganz gut. Die einzige Überlegung, die jetzt
noch fehlt, ist, dass summe natürlich mit irgendeinem Startwert
beginnen muss. Mit dem Operator += haben wir ja eigentlich immer
geschrieben "Nimm den alten Wert von summe, addiere i dazu und
speichere das ganze wieder in summe". Am Anfang gibt es aber
noch keinen "alten Wert" von summe. Nun, bevor irgend
etwas addiert worden ist, ist die Summe sicherlich gleich 0. Also
können wir das als Startwert verwenden.
summe = 0;
for (i= 1; i <= grenze; i++) {
summe += i;
}
Beachten Sie, dass diese Initialisierung natürlich vor der Schleife
stehen muss, sonst würde sie mit jedem Schleifendurchlauf wieder
ausgeführt werden, was das Programm ziemlich sinnlos macht. Fehlt
nur noch die Ausgabe der Summe nach Beendigung der Schleife:
alert("Die Summe lautet: " + summe);
Damit Sie das Programm gut verfolgen können, bietet es sich zu
Testzwecken an, in der Schleife auch noch eine Ausgabe der Variablen
summe und i unterzubringen. Dann sehen Sie genau, welche
Werte gerade in diesen Variablen gespeichert sind. Bevor Sie ein Programm
veröffentlichen, löschen Sie solche Testausgaben natürlich
wieder.
