wie sage ich oder?!
melko
- javascript
ich möchte eine if Bedienung aufstellen in der ich mehrere Bedienungen aufschreibe und eines davon muss stimmen damit er weiter macht?! Ich habe mit or probiert geht nicht gibts vielleicht irgendwas anderes! BIDDE DANKE
Hi,
probiers mal mit:
if ((Bedingung 1) || (Bedingung 2))
{
...
}
|| steht für "oder"
&& steht für "und"
Gruß, Stefan
if ((Bedingung 1) || (Bedingung 2))
ja das geht nur bei 2 Bedienungen ich habe aber 6?!
es schaut folgendermassen aus:
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
Falls du ein Datum überprüfst, du kannst mit JS wesentlich effektiver auf ein gültiges Datum prüfen. Dazu musst du die Angaben tag, monat und Jahr in eine Date Objekt umwandeln und danach vergleichst du diese Werte mit den urpsrünglichen.
Ich habe eine Datumsbibliothek geschrieben wo diese Funktion eingebaut ist: http://home.arcor.de/struebig/computer/javascript/lib/datum.html
Struppi.
Ähm was ich möchte ist eine Abfrage in der ich frage was das für ein Monat ist und das speichere ich in arr_date[1] und dann will ich sehen ob dieses Monat eines von meinen 6 ist! wenn ja dann soll er weiter gehen wenn nicht abbrechen?! verstehst ihr was ich mein?
Ähm was ich möchte ist eine Abfrage in der ich frage was das für ein Monat ist und das speichere ich in arr_date[1] und dann will ich sehen ob dieses Monat eines von meinen 6 ist! wenn ja dann soll er weiter gehen wenn nicht abbrechen?! verstehst ihr was ich mein?
Ja, aber die Frage ist warum du das machen willst?
Struppi.
Hi,
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
Diese Bedingung (Bedienungen haben damit nichts zu tun) wird immer wahr sein, weil arr_date[1] immer nur einen Wert haben kann, also sind von den 6 Abfragen immer 5 wahr.
Du willst hier die Und-Verknüpfung &&
cu,
Andreas
Hi,
das würde mit Klammern besser funktionieren:
if ((arr_date[1]!=1) || (arr_date[1]!=2) || (arr_date[1]!=3) || (arr_date[1]!=4) || (arr_date[1]!=11) || (arr_date[1]!=12)) return cal_error ("Ungültiges Monat!");
Es ist egal, wieviele Argumente Du reinschreibst.
Gruß, Stefan
Hi,
das würde mit Klammern besser funktionieren:
Nein.
if ((arr_date[1]!=1) || (arr_date[1]!=2) || (arr_date[1]!=3) || (arr_date[1]!=4) || (arr_date[1]!=11) || (arr_date[1]!=12)) return cal_error ("Ungültiges Monat!");
Der Ausdruck ist nach wie vor immer wahr. Weil immer 5 der Zweige wahr sind. Und das reicht bei "oder" aus, um den Gesamtausdruck wahr zu machen. Hier muß "und" verwendet werden.
cu,
Andreas
Hallo MudGuard,
Der Ausdruck ist nach wie vor immer wahr. Weil immer 5 der Zweige wahr sind. Und das reicht bei "oder" aus, um den Gesamtausdruck wahr zu machen. Hier muß "und" verwendet werden.
Sei geduldig! Logik ist genau das, was Programmierung schwer macht. Ich finde, das Beispiel hier ist typisch dafuer, wo die Fallstricke beim Programmieren lauern. Das Script laeuft syntaktisch fehlerfrei, tut aber nicht was es soll, einfach weil wie hier im Beispiel eine Bedingung logisch falsch formuliert ist.
Versuch vielleicht mal etwas deutlicher zu machen, was du meinst:
Bei der Bedingung
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12)
haben wir eine Oder-Verknuepfung von sechs Einzelausdruecken. Das Oder ist inklusiv und bedeutet: wenn eine der sechs Einzelausdruecke wahr ist, ist der gesamte Ausdruck wahr.
Angenommen, arr_date[1] hat den aktuellen Wert: 5.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
5!=1 ... das ist bereits wahr ("es ist wahr, dass 5 ungleich 1 ist").
Damit ist der Gesamtausdruck bereits ebenfalls wahr, und es wird gar nicht mehr weiter ausgewertet.
Angenommen, arr_date[1] hat den aktuellen Wert: 1.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
1!=1 ... das ist falsch ("es ist falsch, dass 1 ungleich 1 ist").
Also weiter mit dem naechsten Einzelausdruck:
1!=2 ... dies ist jedoch wahr ("es ist wahr, dass 1 ungleich 2 ist"), und damit braucht der Rest nicht weiter ausgewertet zu werden, da ja gilt, dass der Gesamtausdruck wahr ist, wenn einer der Einzelausdruecke wahr ist.
Es ist also so, dass die Auswertung bei allen Werten ausser 1 bereits beim ersten Einzelausdruck abbricht, da der Gesamtausdruck dann schon wahr ist. Nur beim Wert 1 wird ueberhaupt der zweite Einzelausdruck bewertet, und der ist dann aber auf jeden Fall wahr (ebenso wie alle nachfolgenden, die aber gar nicht mehr ausgewertet werden brauchen).
Der Grund fuer das unerwuenschte Verhalten der Auswertung sind wohl die Negativ-Vergleiche in den Einzelausdruecken. Wenn man die schon unbedingt beibehalten will (man koennte sie ja auch positiv formulieren), dann muss man die Einzelausdruecke durch logisches Und verknuepfen, um das erwuenschte Verhalten zu erreichen. Bei logischem Und gilt naemlich: der Gesamtausdruck ist nur wahr, wenn alle Einzelausdruecke wahr sind.
Also
if (arr_date[1]!=1 && arr_date[1]!=2 && arr_date[1]!=3 && arr_date[1]!=4 && arr_date[1]!=11 && arr_date[1]!=12)
Angenommen wieder, arr_date[1] hat den aktuellen Wert: 5.
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
5!=1 ... dies ist wahr ("es ist wahr, dass 5 ungleich 1 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=2 ... dies ist wahr ("es ist wahr, dass 5 ungleich 2 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=3 ... dies ist wahr ("es ist wahr, dass 5 ungleich 3 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=4 ... dies ist wahr ("es ist wahr, dass 5 ungleich 4 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=11 ... dies ist wahr ("es ist wahr, dass 5 ungleich 11 ist"). Weiter mit dem naechsten Einzelausdruck:
5!=12 ... dies ist wahr ("es ist wahr, dass 5 ungleich 12 ist").
Alle Einzelausdruecke sind also wahr, und somit ist der Gesamtausdruck wahr. von dem if abhaengiger Code wird also ausgefuehrt.
Jetzt mal mit Wert 1:
Der Script-Interpreter gelangt in die if-Abfrage und faengt an, die Einzelausdruecke zu bewerten:
1!=1 ... dies ist falsch ("es ist falsch, dass 1 ungleich 1 ist"). Damit ist der Gesamtausdruck bereits falsch, da ja jeder Einzelausdruck wahr sein muesste, damit der Gesamtausdruck wahr ist. Der Interpreter kann die Auswertung also beenden und - sofern vorhanden - den else-Zweig ausfuehren.
Das ist nun etwas arg ausfuehrlich geworden, aber manchmal hilft es einfach, systematisch ein paar Moeglichkeiten Schritt fuer Schritt durchzudenken. So kommt man Logikfehlern leichter auf die Schliche. Und gerade bei Sprachen wie JavaScript, fuer die es kaum Debugging-Tools mit Einzelschrittverfolgung und Variablen-Inspektion gibt, muss man so manches einfach mal systematisch im Kopf durchgehen.
viele Gruesse
Stefan Muenz
Hallo,
meiner Meinung nach muss man sich nur einer sprachlich eindeutigen Formulierung des Problemes befleißigen. Dann klappts auch mit der Logik.
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
heißt:
Wenn zutrifft, dass arr_date[1] entweder nicht gleich 1 oder nicht gleich 2 ... oder nicht gleich 12 ist, dann soll der Fehler zurückgegeben werden.
Wahrscheinlich soll es aber heißen:
Bei allen Werten in arr_date[1], außer 1, 2, 3, 4, 11 und 12, soll der Fehler zurückgegeben werden. Das lässt sich so schlecht in Programmcode darstellen, also muss man anders formulieren.
Wenn nicht zutrifft, dass arr_date[1] gleich 1 oder arr_date[1] gleich 2 ... arr_date[1] gleich 12 ist, dann soll der Fehler zurückgegeben werden.
if (!(arr_date[1]==1 || arr_date[1]==2 || arr_date[1]==3 || arr_date[1]==4 || arr_date[1]==11 || arr_date[1]==12)) return cal_error ("Ungültiges Monat!");
oder
Wenn zutrifft, dass arr_date[1] nicht gleich 1 ist und arr_date[1] nicht gleich 2 ist ... und arr_date[1] nicht gleich 12 ist, dann soll der Fehler zurückgegeben werden.
if (arr_date[1]!=1 && arr_date[1]!=2 && arr_date[1]!=3 && arr_date[1]!=4 && arr_date[1]!=11 && arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
viele Grüße
Axel
hi,
ja das geht nur bei 2 Bedienungen ich habe aber 6?!
nein, du hast eigentlich nur zwei.
es schaut folgendermassen aus:
if (arr_date[1]!=1 || arr_date[1]!=2 || arr_date[1]!=3 || arr_date[1]!=4 || arr_date[1]!=11 || arr_date[1]!=12) return cal_error ("Ungültiges Monat!");
(von dem "eigentlich meinst du &&"-problem, das Andreas bereits angesprochen hat, mal abgesehen - )
der monat soll also genau dann "ungültig" sein, wenn er kleiner 5 oder größer als 10 ist?
ja dann formulier das doch auch gleich so als bedingung ...
gruß,
wahsaga