Funktion definieren
Niels Fortmann
- javascript
0 suit0 Steel0 Felix Riesterer
0 Steel
1 Felix Riesterer
0 Don P0 Felix Riesterer
0 Don P
1 Don P
Warum muss oder sollte man den check=1 wieder auf check=0 setzen, kann man sowas auch weglassen oder ist es einfach nur besser?
function PrimzahlCheck (Zahl) {
if (Zahl >= 2) {
var Grenzzahl = Zahl / 2;
var Check = 1;
for (var i = 2; i <= Grenzzahl; i++)
if (Zahl % i == 0) {
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
Check = 0;
}
if (Check == 1)
alert(Zahl + " ist eine Primzahl!");
} else {
alert("Bitte geben Sie eine natürliche Zahl größer als 1 ein!");
}
}
Quelle: http://de.selfhtml.org/javascript/sprache/funktionen.htm
Gruss
Niels
Warum muss oder sollte man den check=1 wieder auf check=0 setzen, kann man sowas auch weglassen oder ist es einfach nur besser?
Das ist eine logische Sache - denk mal scharf nach, warum Check "0" sein muss, wenn eine zu testende Zahl ohne Rest durch eine andere Ganzzahl teilbar ist.
Geht auch ohne check
function PrimzahlCheck (Zahl) {
if (Zahl >= 2) {
var Grenzzahl = Zahl / 2;
for (var i = 2; i <= Grenzzahl; i++)
var mymod = Zahl % i;
if (mymod == 0) {
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
}
if (mymod != 0)
alert(Zahl + " ist eine Primzahl!");
} else {
alert("Bitte geben Sie eine natürliche Zahl größer als 1 ein!");
}
}
Lieber Steel,
var Grenzzahl = Zahl / 2;
for (var i = 2; i <= Grenzzahl; i++)
var mymod = Zahl % i;
if (mymod == 0) {
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
}
if (mymod != 0)
mir scheint von der Programmlogik, dass Du keine letztendliche Aussage über "Zahl" treffen kannst, sodass Deine Funktion kein sinnvolles true oder false zurückgeben kann. Immerhin wird "mymod" bei jedem möglichen Teiler wieder überschrieben, sodass von der Funktion letztendlich nur "Grenzzahl" als Teiler geprüft wird.
Das Beispiel in SELFHTML benutzt "Check" als sogenanntes Flag, um in den verschiedenen Testläufen dieses Flag bei Bedarf wieder zu löschen. Dein Beispiel bräuchte das auch!
Liebe Grüße,
Felix Riesterer.
Hola Felix!
var Grenzzahl = Zahl / 2;
for (var i = 2; i <= Grenzzahl; i++)
var mymod = Zahl % i;
if (mymod == 0) {
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
}
if (mymod != 0)mir scheint von der Programmlogik, dass Du keine letztendliche Aussage über "Zahl" treffen kannst, sodass Deine Funktion kein sinnvolles true oder false zurückgeben kann. Immerhin wird "mymod" bei jedem möglichen Teiler wieder überschrieben, sodass von der Funktion letztendlich nur "Grenzzahl" als Teiler geprüft wird.
Hm... Ich bin eh nicht gut drauf heute (rotze rum, hab halsschmerzen und bin angefressen) und das war irgendwie die zweite oder dritte Variante die ich posten wollte. Ich glaub da hab ich Code verwurschtelt. Du hast natuerlich recht. Das Prog merkt sich gar nicht ob die Zahl nun geteilt werden konnte oder nicht und sowieso is das ungetesteter Muell.
Das Beispiel in SELFHTML benutzt "Check" als sogenanntes Flag, um in den verschiedenen Testläufen dieses Flag bei Bedarf wieder zu löschen. Dein Beispiel bräuchte das auch!
Das schon. Das hier nicht:
function PrimzahlCheck (Zahl)
{
if (Zahl >= 2) {
var Grenzzahl = Zahl / 2;
var i = 2;
for (i = 2; i <= Grenzzahl; i++)
if (Zahl % i == 0)
{
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
break;
}
if (Zahl % i != 0)
alert(Zahl + " ist eine Primzahl!");
}
else
{
alert("Bitte geben Sie eine natürliche Zahl größer als 1 ein!");
}
}
Is halt so nah wie moeglich am Original ohne check. Dafuer halt mit extra Rechenschritt, der sich aber auch wegmachen lassen tut.
Lieber Niels,
Warum muss oder sollte man den check=1 wieder auf check=0 setzen, kann man sowas auch weglassen oder ist es einfach nur besser?
Die Variablen "Check" wird hier als sogenanntes Flag eingesetzt, das im Prinzip "ja" oder "nein" speichert, also einen Bool'schen Wert (true/false).
Lass mich die Funktion einmal auskommentieren, damit es klarer wird:
function PrimzahlCheck (Zahl) {
// Nur Zahlen größer zwei testen
if (Zahl >= 2) {
/* als mögliche Teiler nur Zahlen bis zur Hälfte von "Zahl" benutzen,
da größere mögliche Teiler keinen Sinn haben. */
var Grenzzahl = Zahl / 2;
// Annahme: "Zahl" ist eine Primzahl.
var Check = 1;
// mögliche Teiler ausprobieren
for (var i = 2; i <= Grenzzahl; i++)
// Mit dem Modulo-Operator den Rest der Zahl bestimmen
if (Zahl % i == 0) {
// Kein Rest! Keine Primzahl!
alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
Check = 0; // OK, Annahme widerrufen.
}
// Wie hat sich unsere Annahme bewährt?
if (Check)
alert(Zahl + " ist eine Primzahl!");
} else {
// "Zahl" war zu klein
alert("Bitte geben Sie eine natürliche Zahl größer als 1 ein!");
}
return (Check); // gibt entweder true oder false zurück
}
Ob man "Check" jetzt die Werte 0 und 1 oder false und true gibt, ist JavaScript egal. Es wertet den numerischen Wert 1 wie ein Bool'sches true, und ein numerisches 0 wie ein Bool'sches false. Daher habe ich die Zeile mit if (Check==1)
etwas verkürzt.
Ist das Ganze jetzt klarer geworden?
Liebe Grüße,
Felix Riesterer.
Hallo,
Ob man "Check" jetzt die Werte 0 und 1 oder false und true gibt, ist JavaScript egal.
Das ja, aber kann doch für ein boolesches Flag auch einen booleschen Wert nehmen...
und ihn auch sinnvoller benennen als "Check", z.B. so:
var prim = true; // Wir nehmen zuerst an, es ist eine Primzahl.
Falls sich dann rausstellt, dass es keine ist:
prim = false;
Und für die Ausgabe dann:
if (prim) { /* .... */}
else { /* ... */ }
So wäre die Frage im OP wohl gar nicht aufgekommen.
Gruß, Don P
Lieber Don,
prim = false;
[...]
if (prim) { /* .... */}
else { /* ... */ }
> So wäre die Frage im OP wohl gar nicht aufgekommen.
dann schlage diese Änderung für SELFHTML8.1.2 vor... aber wahrscheinlich wird eine ähnliche Verbesserung im JavaScript-Kapitel eh eingearbeitet werden. Oder wird der JS-Teil an molily und seine eigene Seite ausgelagert?
Liebe Grüße,
Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
Hallo,
dann schlage diese Änderung für SELFHTML8.1.2 vor...
Im Ernst? Will ja nicht meckern, aber die ganze JavaScript-Doku in SELFHTML scheint mir veraltet und ist zum Teil auch fehlerhaft. Man müsste eigentlich so ziemlich alles neu schreiben...
Dass da sehr viel Arbeit drinsteckt, ist mir klar. Es dürften einige Mannjahre zusammenkommen. Wer wollte das schon freiwillig unentgeltlich machen?
Habe bis jetzt nur herausbekommen, dass SELFHTML ein Verein ist, der quasi nur aus Gründungsmitgliedern besteht, was auch so bleiben soll. An passiven Mitgliedern ist man scheint's auch nicht interessiert ^^
Da wundert es mich nicht wirklich, wenn das Ding zunehmend verstaubt...
aber wahrscheinlich wird eine ähnliche Verbesserung im JavaScript-Kapitel eh eingearbeitet werden. Oder wird der JS-Teil an molily und seine eigene Seite ausgelagert?
Darüber weiß ich nichts. Bin ja nur ein Nutzer, was auch so bleiben soll.
Wenn es allerdings die Möglichkeit gäbe, dass man wie in einem Wiki die Doku und die Beispiele überabeiten könnte, dann könnte man Verbesserungen, die einem einfallen, einfach kurz reinsetzen bzw. Fehler korrigieren. Oder gibt es schon ein bedienbares Vorschlagsystem, mit dem man einen Artikel oder Beispiel-Code so ändern kann, dass ein Revisor (molily?) nur noch "OK" klicken muss und die Änderung ist drin?
Gruß, Don P
Hallo,
Abgesehen von Check oder nicht Check ist das
var Grenzzahl = Zahl / 2;
als Genzzahl nicht wirklich gut.
Zum Primzahltest einer Zahl n reicht es, wenn man als Grenzzahl Math.floor(Math.sqrt(n))
nimmt.
Natürlich sind *noch* performantere Lösungen denkbar...
Gruß, Don P