Und hier die Lösung. Aber nicht fuschen

Erläuterungen zum Programm MaxTeilerAnzahl.html
1. Struktur des Dokuments:
Der "Body" des HTML-Dokuments wird in den Zeilen 61 – 65 beschrieben. Es gibt ein
Eingabefeld mit dem Vorgabewert 1000, einen Button mit der Beschriftung "Los!" und
einen Absatz, der zunächst leer ist.
Das Javascript-Programm befindet sich zwischen den <script></script> - Tags.
Der HTML-Teil ist folgendermaßen mit dem Javascript-Code verknüpft:
•
Das Input-Feld und der Absatz haben eine id ("eingabe" bzw. "ausgabe"), sodass diese
Elemente im Programm über document.getElementById(" …") gefunden werden
können. (Zeilen 42, 46, 50, 54)
•
Der Button ist über das onclick-Attribut mit der Funktion los() verbunden, d.h., bei
einem Klick auf den Button wird die Funktion los() aufgerufen.
2. Funktionen:
Das Programm wegen der Übersicht in mehrere Funktionen aufgeteilt, die sich zum Teil
gegenseitig aufrufen.
•
Ausgangspunkt ist die Funktion "los()". In Zeile 11 wird darin die Funktion
"loescheAusgabe()" aufgerufen. Das Programm springt dann zu dieser Funktion (Zeile
45) und führt die dort stehenden Anweisungen aus. Danach springt der Computer zur
nächsten Zeile nach dem Aufruf (hier Zeile 12) zurück.
Eine Funktion wird aufgerufen, indem man ihren Namen (mit Klammern) schreibt.
•
Die Funktion "los()" hat keine Parameter (d.h. zwischen den Klammern steht nichts) und
keinen Rückgabewert (kein "return" in der Funktion).
Weitere solche Funktionen sind leseEingabe() und loescheAusgabe() (Zeilen 41 und 45)
•
Die Funktionen pruefe, teilerAnzahl, setzeAusgabe und fuegeZeilezurAusgabeHinzu
haben einen Parameter, d.h., sie bekommen beim Aufruf einen Wert mitgeliefert.
Ein Beispiel: Wenn irgendwo im Programm die Anweisung
setzeAusgabe("Hallo!") steht, geschieht folgendes:
- Der Computer springt zur Funktion "setzeAusgabe(text)" in Zeile 49
- text bekommt die Zeichenkette "Hallo!" als Wert zugewiesen
- "Hallo!" wird als HTML-Code in den Absatz mit der id "ausgabe" gesetzt (als
innerHTML, also zwischen <p> und </p> ).
- Die Funktion setzeAusgabe ist beendet, das Programm springt zurück.
•
Die Funktionen teilerAnzahl und leseEingabe geben einen Wert zurück. Man erkennt
dies an der return-Anweisung am Ende. Hier wird festgelegt, was die Funktion
"antwortet".
Beispiel: In Zeile 12 wird leseEingabe() aufgerufen. Der Computer springt zur Zeile 42.
Mit document...value wird der Wert des Eingabefeldes ausgelesen und anschließend mit
return an die aufrufende Funktion übergeben. In Zeile 12 wird dieser Wert dann
verwendet und der Variablen "grenze" zugewiesen.
3. Variablen
•
Der "Lebenslauf" einer Variablen am Beispiel der Variablen "anzahl" in Zeile 31:
1. Deklaration: Mit dem Wort var wird dem Computer eine neue Variable
"bekanntgemacht"2. Initialisierung: Der Variablen wird ein erster Wert zugewiesen.
3. Aktualiserung: Die Variable bekommt einen neuen Wert, der alte geht dabei
verloren.
Deklaration und Initialisierung werden oft in einer Zeile kombiniert. "anzahl" wird in 31
deklariert und bekommt sofort den Wert 0. In Zeile 34 wird "anzahl" bei jedem gefundenen Teiler
aktualisiert.
• Variablen "leben" immer nur in der Funktion, in der sie deklariert werden. Die Variablen
"anzahl" und "kandidat" aus den Zeilen 30 und 31 sind nur in der Funktion
"teilerAnzahl" bekannt und können von außerhalb nicht "gesehen" oder verändert
werden. Wenn ich eine Variable in mehreren Funktionen verwenden möchte, muss sie
außerhalb der Funktionen deklariert werden. Im Programm ist das die Variable
"maximaleTeilerAnzahl", die in den Funktionen los() und pruefe(zahl) verwendet wird.
4. Schleifen:
Am Beispiel der Funktion Teileranzahl:
•
Wesentlich für die Schleife, die die Kandidatenzahlen durchläuft, sind die Zeilen 30, 32
und 36
•
In Zeile 30 wird die Zählvariable "kandidat" deklariert und initialisiert (erster Kandidat
ist 1)
•
In Zeile 32 wird aktuelle Wert von "kandidat" mit der Zahl verglichen. Solange
kandidat<=zahl ist, wird die Schleife durchlaufen.
•
In Zeile 36 wird der kandidat um 1 erhöht. Ohne diese Zeile würde der Wert von
Kandidat bei 1 bleiben und die Schleife würde endlos durchlaufen.
•
Eine ganz ähnliche Schleife befindet sich in der Funktion los()
5. Funktionsweise des Programms (Überblick, einige Details sind weggelassen)
a. Beim Klick auf den Button wird die Funktion los() aufgerufen
b. Die Ausgabe wird gelöscht, die Grenze eingelesen
c. Zu Beginn wird maximaleTeilerAnzahl auf einen Wert gesetzt, der sicher kleiner ist als
der tatsächliche Wert.
d. In der Schleife (Zeilen 13, 15, 17 sind wesentlich) werden alle Zahlen von 1 bis zur
Grenze durchlaufen und mit der Funktion "pruefe" untersucht.
e. "pruefe()" untersucht, ob die aktuelle Zahl mehr Teiler als das bisherige Maximum hat.
Falls ja wird das Maximum aktualisiert und zur Anzeige hinzugefügt, falls nein
geschieht nichts.
Beachte: Die aktuelle Anzahl der Teiler wird dreimal benutzt. Darum wird der Wert zu
Beginn in der Variablen "ta" gespeichert. So wird vermieden, dass die Funktion
teilerAnzahl mehrfach mit dem selben Wert aufgerufen wird (Zeitersparnis).
f. Zur Funktion "teileranzahl":
Die Schleife wurde oben bereits erläutert. Wenn der Kandidat ein Teiler ist (zahl ohne
Rest durch kandidat teilber ist, Z. 33) wird anzahl um 1 erhöht, sonst geschieht nichts.
Mit return wird die Teileranzahl zurückgegeben.
g. Die anderen Funktionen sind Hilfsfunktionen. Ein- und Ausgabe waren bereits vor der
letzten Kursarbeit bekannt.