Kurs: JavaScript

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.