Mainzel: Toter Button

Ich komme bei diesem einfachen Problem nicht weiter, der Button, mit dem man seine Eingabe Abschickt ist einfach tot, ich weiß nicht was falsch ist, eigentlich sollte ein Alert angezeigt werden, in dem der BMI steht (Information zur Codierung fehlt, weil ich zu faul war, um Umlaute zu ersetzen):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<title>BMI-Berechnung</title>
<script type='text/javascript'>
function bb() {
var weight = parseFloat(eingabe.height.value);
var height = parseFloat(eingabe.weight.value);
var bmi;
bmi = (weight/(height*height));
output = "Ihr BMI beträgt " + bmi;
   if (bmi < 12) {output += "Die Eingabe ist Ungültig! Die Körpergrö&ße bitte als Fließkommazahl mit einem Punkt statt einem Komma eingeben.";}
   if (bmi < 18) {output += "Ein Arztbesuch aufgrund ihres Untergewichts ist Unerlässlich";}
   if (bmi >= 18 && bmi <= 20) {output += "Sie sind Untergewichtig.";}
   if (bmi >= 20 && bmi < 25) {output += "Ihr Gewicht ist gut, ein BMI von 22 ist optimal.";}
   if (bmi >= 25 && bmi <= 29) {output += "Sie sind etwas zu dick.";}
   if (bmi >= 30 && bmi <= 39) {output += "Sie sind stark Übergewichtig.";}
   if (bmi >= 30 && bmi <= 39) {output += "Eine ärztliche Behandlung aufgrund ihres Übergewichts ist zu empfehlen.";}
   if (bmi >= 60) {output += "Entweder sind sie extrem UEbergewichtig oder die Eingabe ist fehlerhaft.";}
   alert(output);
}
</script>
<style type="text/css">
body {
font-family:Verdana;
background-color:#1111FA;
color:#FFFF64;
}
#eingabefeld {
text-align:center;
}
</style>
</head>
<body>
<div id="eingabefeld">
<form name="eingabe" action="none">
<p>
K&ouml;rpergr&ouml;&szlig;e in m: <input type="text" name="height"> <br>

		K&ouml;rpergewicht im kg: <input type="text" name="weight"><br>  
		<input type="button" value="BMI berechnen und bewerten" onclick="bb">  
	</p>  
</form>  

</div>
</body>
</html>

Ich hoffe ihr könnt mir helfen.

  1. Hi,

    Ich komme bei diesem einfachen Problem nicht weiter, der Button, mit dem man seine Eingabe Abschickt ist einfach tot, ich weiß nicht was falsch ist,

    Dann lerne, mit der JavaScript-Fehlerkonsole umzugehen!
    (Die des IE ist nicht empfehlenswert, besser Firefox nutzen.)

    <input type="button" value="BMI berechnen und bewerten" onclick="bb">

    Was soll bb sein? Der Aufruf einer Funktion sieht anders aus.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      Ich komme bei diesem einfachen Problem nicht weiter, der Button, mit dem man seine Eingabe Abschickt ist einfach tot, ich weiß nicht was falsch ist,

      Dann lerne, mit der JavaScript-Fehlerkonsole umzugehen!
      (Die des IE ist nicht empfehlenswert, besser Firefox nutzen.)

      <input type="button" value="BMI berechnen und bewerten" onclick="bb">

      Was soll bb sein? Der Aufruf einer Funktion sieht anders aus.

      MfG ChrisB

      Danke für den Hinweis, letztendlich hat es dann funktioniert, als ich aus eingabe.weight.value und eingabe.height.value document.eingabe.weight.value und document.eingab.height.value gemacht habe.
      MfG, Mainzel

    2. Hi!

      Dann lerne, mit der JavaScript-Fehlerkonsole umzugehen!
      (Die des IE ist nicht empfehlenswert, besser Firefox nutzen.)

      Auch nicht die in den Developer Tools des IE8 (mit F12 zu erreichen)? Ich denke, die kann sich mittlerweile sehen lassen. Auch Debugging mit Breakpoints und schrittweisem Durchlaufen usw. ist da möglich.

      Lo!

  2. Liebe(r) Mainzel,

    if (bmi < 12) {[...]}
       if (bmi < 18) {[...]}
       if (bmi >= 18 && bmi <= 20) {[...]}
       if (bmi >= 20 && bmi < 25) {[...]}
       if (bmi >= 25 && bmi <= 29) {[...]}
       if (bmi >= 30 && bmi <= 39) {[...]}
       if (bmi >= 30 && bmi <= 39) {[...]}
       if (bmi >= 60) {[...]}

    dich sollten http://de.selfhtml.org/javascript/sprache/bedingt.htm#switch@title=switch-Statements extrem interessieren...

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. @@Felix Riesterer:

      nuqneH

      dich sollten http://de.selfhtml.org/javascript/sprache/bedingt.htm#switch@title=switch-Statements extrem interessieren...

      Bei Intervallen??

      Wie soll das gehen? Sag bitte nicht switch(true)!

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
      1. Lieber Gunnar,

        dich sollten http://de.selfhtml.org/javascript/sprache/bedingt.htm#switch@title=switch-Statements extrem interessieren...

        Bei Intervallen??

        warum nicht? Mit switch-Statements ist es immerhin strukturell logischer, als mit if-Statements.

        switch (bmi) {  
            case bmi < 12:  
                [...]  
            break;  
          
            case bmi < 18 && bmi > 12:  
                [...]  
            break;  
          
            case bmi <= 18  && bmi >= 20:  
                [...]  
            break;  
          
            case bmi >= 20 && bmi < 25:  
                [...]  
            break;  
          
            case bmi >= 25 && bmi <= 29:  
                [...]  
            break;  
          
            case bmi < bmi >= 25 && bmi <= 29:  
                [...]  
            break;  
          
            case bmi >= 30 && bmi <= 39:  
                [...]  
            break;  
          
            case bmi >= 30 && bmi <= 39:  
                [...]  
            break;  
          
            case bmi >= 60:  
                [...]  
            break;  
        }
        

        Zumindest würde damit die if-else-Verkettung entfallen. Dass das alles andere als "best practice" ist, ist mir klar. Ich hätte da eher eine Art Array gebastelt:

        var bmi_messages = [  
            {  
                range : [0, 11.999],  
                message : "Die Eingabe ist Ungültig! Die Körpergröße bitte als Fließkommazahl mit einem Punkt statt einem Komma eingeben."  
            },  
            {  
                range : [12, 17.999],  
                message : "Ein Arztbesuch aufgrund ihres Untergewichts ist Unerlässlich"  
            },  
            {  
                range : [18, 19.999],  
                message : "Sie sind untergewichtig."  
            },  
            {  
                range : [20, 24.999],  
                message : "Ihr Gewicht ist gut, ein BMI von 22 ist optimal."  
            },  
            {  
                range : [25, 29.999],  
                message : "Sie sind etwas zu dick."  
            },  
            {  
                range : [30, 39.999],  
                message : "Sie sind stark übergewichtig."  
            },  
            {  
                range : [40, 59.999],  
                message : "Eine ärztliche Behandlung aufgrund ihres Übergewichts ist zu empfehlen."  
            },  
            {  
                range : [60, 999],  
                message : "Entweder sind sie extrem übergewichtig oder die Eingabe ist fehlerhaft."  
            }  
        ];
        

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. @@Felix Riesterer:

          nuqneH

          warum nicht? Mit switch-Statements ist es immerhin strukturell logischer, als mit if-Statements.

          Leuchtet mir nicht ein, warum switch hier strukturell logischer sein sollte als if-Statements.

          Semantsch ist switch (true) völlig unlogisch, denn der Ausdruck in Klammern soll angeben, wonach verzweigt wird.

          Mit switch (bmi) willst du dich aus der Affäre ziehen? Funktioniert aber nicht allgemein. Wenn der Wertebereich 0 enthält, versagt das.

          Zumindest würde damit die if-else-Verkettung entfallen.

          Warum sollten sie?

          Ich hätte da eher eine Art Array gebastelt:

          Wozu? Und wie willst du die Intervallgrenzen abfragen?

          range : [0, 11.999],
                  range : [12, 17.999],

          Und wenn der BMI nun 11.9995 ist?

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
          1. Lieber Gunnar,

            Du weißt, dass ich Hobbyist und von daher nur interessierter Laie bin. Wie würdest Du denn bei Intervallen vorgehen?

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. @@Felix Riesterer:

              nuqneH

              Wie würdest Du denn bei Intervallen vorgehen?

              Na so.

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. Lieber Gunnar,

                Wie würdest Du denn bei Intervallen vorgehen?

                Na so.

                da gefällt mir ChrisBs Ansatz um Welten besser!

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. @@Felix Riesterer:

                  nuqneH

                  da gefällt mir ChrisBs Ansatz um Welten besser!

                  Warum?

                  Die if-else-if-else-Konstruktion ist gut lesbarer Code.

                  Bei dem Array hast du die Daten gesammelt, was mit ihnen passiert, steht aber an ganz anderer Stelle (in der Schleife). Für mich unnötig verkomplizierter Code.

                  Ich hatte erst überlegt, auch eine Lösung mit Array anzubieten (die sich von ChrisBs nur unwesentlich unterschieden hätte), hatte dann aber besseres zu tun. ;-)

                  Mitunter ist die einfachste Lösung auch die beste.

                  Qapla'

                  PS: Denkbar wäre auch gewesen

                  output += (bmi < 12 ? " … "  
                    : (bmi < 18 ? " … "  
                    : (bmi < 20 ? " … "  
                    : (bmi < 25 ? " … "  
                    : (bmi < 30 ? " … "  
                    : (bmi < 60 ? " … "  
                    : " … "))))));
                  

                  Aber ob das gut lesbarer Code ist?

                  --
                  Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                  (Mark Twain)
                  1. Bei dem Array hast du die Daten gesammelt, was mit ihnen passiert, steht aber an ganz anderer Stelle (in der Schleife).

                    Das ist doch ein potenzieller Vorteil: Man hat einmal deklarativ die Zuordnungen. Die kann man als JSON (oder in sonst einem Format) speichern, erzeugen, verarbeiten, übertragen, auswechseln. Und einmal die Verarbeitungslogik, die ein gewisses Schema voraussetzt, sonst aber flexibel ist.
                    Dafür erfindet man in anderen Anwendungsfällen extra DSLs (domain-specific languages), eben um Sachverhalte deklarativ notieren zu können. JSON bietet sich da ohnehin an.

                    Für mich unnötig verkomplizierter Code.

                    Es ist letztendlich flexibler. Wenn man es braucht und es einem nützt, ergibt das schon Sinn.

                    Mathias

            2. Hi,

              Wie würdest Du denn bei Intervallen vorgehen?

              Eine Schleife bietet sich an - über ein Array, in dem man eine Intervallgrenze und den zugehörigen Text ablegt:

              var texte = [  
                { wert: 100, text : "das sind weniger als Hundert" },  
                { wert: 1000, text : "noch keine Tausend" },  
                { wert: 10000, text : "mindestens Tausend, aber noch keine Zehntausend" },  
                { wert: 100000, text : "Zehntausend oder mehr, das ist schon was" },  
                { wert: 1000000, text : "Hunderttausend[e] sind schon ganz schoen viel" }  
              ];  
                
              var vergleichsWert = 4711,  
                  ausgabe;  
              for(var i=0, l=texte.length; i<l; ++i) {  
                if(vergleichsWert < texte[i].wert) {  
                  ausgabe = texte[i].text;  
                  break;  
                }  
              }  
              alert(vergleichsWert+"\n"+ausgabe);
              

              Wenn man kleiner-Vergleiche macht, sortiert man die Intervallgrenzen aufsteigend, bei größer-Vergleichen andersherum.
              Kleiner-gleich/größer-gleich kann man natürlich auch nehmen, wenn man die Intervallgrenze noch „mit drin“ haben will.

              Wie Sonderfälle zu behandeln sind (ungültiger Wert, größer als eine Obergrenze), ist dann noch zu überlegen.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              1. Lieber ChrisB,

                Eine Schleife bietet sich an - über ein Array, in dem man eine Intervallgrenze und den zugehörigen Text ablegt:

                vielen Dank für Deine klärenden Worte. Meine Idee mit dem Array lag also nicht so falsch, nur die konkrete Umsetzung war noch nicht pragmatisch genug.

                Wieder etwas dazugelernt. Danke!

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
          2. Hi Gunnar.

            Semantsch ist switch (true) völlig unlogisch, denn der Ausdruck in Klammern soll angeben, wonach verzweigt wird.

            ?? Der Ausdruck in Klammern ist ein Ausdruck(!), der mit den Ausdrücken der case-Statements verglichen wird. Das ist die ganze Logik des switch-Statements.

            Viele Grüße,
            der Bademeister

            1. @@Bademeister:

              nuqneH

              Semantsch ist switch (true) völlig unlogisch, denn der Ausdruck in Klammern soll angeben, wonach verzweigt wird.

              ?? Der Ausdruck in Klammern ist ein Ausdruck(!), der mit den Ausdrücken der case-Statements verglichen wird. Das ist die ganze Logik des switch-Statements.

              Es sollte im Threadverlauf klargeworden sein, dass mir bewusst ist, das JavaScript es hergibt, statt jeder if-else-if-else-Konstruktion switch einzusetzen. Aber warum sollte man das tun?

              Man könnte auch jede while-Schleife als for-Schleife umsetzen. Aber warum sollte man das tun?

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. Es sollte im Threadverlauf klargeworden sein, dass mir bewusst ist, das JavaScript es hergibt, statt jeder if-else-if-else-Konstruktion switch einzusetzen. Aber warum sollte man das tun?

                Jede? Keine Ahnung, warum man das tun sollte. Davon hat ja keiner gesprochen.
                Mir leuchtet nur nicht ein, warum Du die Möglichkeiten, die das switch-Statement per Design liefert, grundsätzlich ablehnst.

                Anwendungsbeispiel (in PHP, da ist es wohl sinnvoller aufgehoben).

                Es stehen verschiedene gesetzte Flags als Bits in einer Variable $flag.

                  
                define ("ERSTES_FLAG",  1); // 0001  
                define ("ZWEITES_FLAG", 2); // 0010  
                define ("DRITTES_FLAG", 4); // 0100  
                define ("VIERTES_FLAG", 8); // 1000  
                  
                $flag = ERSTES_FLAG | DRITTES FLAG; // so als Beispiel  
                
                

                Und nun soll abhängig vom höchsten gesetzten Flag ein Anweisungsblock ausgeführt werden. Man kann jetzt:

                1.: erst das höchste gesetzte Flag separat ermitteln und dann ein switch-Statement schreiben.
                2.: eine if-else-Wurst schreiben
                3.: folgendes machen:

                  
                switch (true) {  
                	case $flag & VIERTES_FLAG:  
                		echo "Viertes";  
                		break;  
                	case $flag & DRITTES_FLAG:  
                		echo "Drittes";  
                		break;	  
                	case $flag & ZWEITES_FLAG:  
                		echo "Zweites";  
                		break;	  
                	case $flag & ERSTES_FLAG:  
                		echo "Erstes";  
                		break;	  
                }  
                
                

                Ich persönlich finde letztere Variante am besten, weil am kürzesten und daher (sofern vernünftig kommentiert) am übersichtlichsten und lesefreundlichsten.

                Das mag so mancher anders sehen. Aber es ist doch nicht "semantsch [...] völlig unlogisch". Es ist eine ganz normale Anwendung dessen, wofür die switch-Struktur da ist: Ausdrücke vergleichen.

                Viele Grüße,
                der Bademeister

                1. Hallo,

                  Das mag so mancher anders sehen. Aber es ist doch nicht "semantsch [...] völlig unlogisch". Es ist eine ganz normale Anwendung dessen, wofür die switch-Struktur da ist: Ausdrücke vergleichen.

                  wenn du konkret PHP und/oder Javascript betrachtest: Ja, einverstanden.
                  Für jemanden, der primär in C programmiert, die beiden erwähnten Sprachen nur gelegentlich nutzt und sich dabei freut, dass die Syntax ähnlich, in weiten Teilen sogar gleich ist wie in C, stellt sich die Situation anders dar. In C vergleicht die switch-Anweisung nämlich nur einen Ausdruck mit einer Liste von Konstanten. Daher fällt mir eine Konstruktion mit switch (true) beim Lesen immer wieder auf, ich stolpere quasi drüber und muss mich daran erinnern, dass das ja hier einen Sinn ergeben kann.

                  Ciao,
                   Martin

                  --
                  Früher habe ich mich vor der Arbeit gedrückt, heute könnte ich stundenlang zusehen.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hi Martin.

                    Für jemanden, der primär in C programmiert, die beiden erwähnten Sprachen nur gelegentlich nutzt und sich dabei freut, dass die Syntax ähnlich, in weiten Teilen sogar gleich ist wie in C, stellt sich die Situation anders dar. In C vergleicht die switch-Anweisung nämlich nur einen Ausdruck mit einer Liste von Konstanten. Daher fällt mir eine Konstruktion mit switch (true) beim Lesen immer wieder auf, ich stolpere quasi drüber und muss mich daran erinnern, dass das ja hier einen Sinn ergeben kann.

                    Ja ok, solche Dinge können natürlich die persönlichen Vorlieben beeinflussen. Was ich hier nur sagen wollte ist: Dass Konstrukte wie 'switch (true)' möglich sind, ist kein Bug, sondern eben so gemacht. Also gibts auch kein Grundsatzproblem hinsichtlich der Verwendung, meines Erachtens. In PHP ist das Konzept der Ausdrücke ziemlich mächtig, wenn man sich denn mal drauf einlässt. Warum nicht auch nutzen?

                    Übrigens habe ich vorhin festgestellt, dass in JavaScript (anders als in PHP)

                    1 == true

                    zwar wahr ist, also

                    if (1 == true) alert("Eins ist gleich true");

                    ausgegeben würde, aber in einer Switch-Anweisung

                    switch (true) {
                            case 1: alert("Eins ist gleich true");
                    }

                    jenes nicht zum Erfolg führt. D.h. mein obgies Beispiel würde in JacaScript gar nicht gleicher maßen funktionieren.

                    Viele Grüße,
                    der Bademeister

                    1. @@Bademeister:

                      nuqneH

                      Übrigens habe ich vorhin festgestellt, dass in JavaScript (anders als in PHP) […] jenes nicht zum Erfolg führt. D.h. mein obgies Beispiel würde in JacaScript gar nicht gleicher maßen funktionieren.

                      Hm, ist es nicht irgendwie bedenklich, Konstrukte zu verwenden, die trotz gleicher Syntax in verschiedenen Sprachen verschieden wirken? Da baut man sich ja gleich potentielle Fehlerquellen mit in den Code ein.

                      Qapla'

                      --
                      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                      (Mark Twain)
                      1. Hi!

                        Hm, ist es nicht irgendwie bedenklich, Konstrukte zu verwenden, die trotz gleicher Syntax in verschiedenen Sprachen verschieden wirken? Da baut man sich ja gleich potentielle Fehlerquellen mit in den Code ein.

                        Ich finde es eher bedenklich zu sehr die Sprachen miteinander zu vergleichen, und die Arbeitsweise mit einer Sprache auf andere übertragen zu wollen. Das geht mitunter, hindert einen aber womöglich daran, sich ganz auf die Philosophie der anderen Sprache einzustellen und die Lösung an dieser zu orientieren - oder gar die Sicherheitsmechanismen unangemessen verwendet, wenn man von einer auf die andere schließt, es dort jedoch entscheidende Differenzen gibt.

                        Für die gezeigten Beispiele würde ich das switch(true) nicht verwenden wollen. Es spielt seine Stärken eher aus, wenn zu den variablen Testausdrücken noch Fall-Through benötigt wird und für den sich sonst wiederholenden Code (in den einzelnen if-Blöcken) das Schreiben einer Funktion als ungünstig angesehen wird.

                        Lo!

                    2. in einer Switch-Anweisung

                      switch (true) {
                              case 1: alert("Eins ist gleich true");
                      }

                      jenes nicht zum Erfolg führt. D.h. mein obgies Beispiel würde in JacaScript gar nicht gleicher maßen funktionieren.

                      Richtig, bei switch wird intern nämlich der <http://de.selfhtml.org/javascript/sprache/operatoren.htm#vergleich@title=Identitätsoperator ===> für den Vergleich verwendet.

                      switch (foo) {
                         case bar : quux(); break;
                      }

                      ist identisch mit

                      if (foo === bar) {
                         quux();
                      }

                      Hier müssen Typ *und* Wert von foo und bar übereinstimmen - sofern es sich um Primitives handelt -, oder es muss ein und dasselbe Objekt sein.

                      Bei dem &-Operator kommt immer eine Number heraus, kein Boolean, daher müsste man explizit nach Boolean umwandeln: case Boolean(x & y) oder !!(x & y)

                      Das ist wirklich ein Grund, der für if/else spricht. Oder für case, je nachdem, was man vergleichen will - case(true) ist jedenfalls tückisch, wenn nicht ein Boolean-Wert bei den case-Ausdrücken herauskommt.

                      Mathias

                2. @@Bademeister:

                  nuqneH

                  switch (true) {

                  case $flag & VIERTES_FLAG:
                  echo "Viertes";
                  break;
                  case $flag & DRITTES_FLAG:
                  echo "Drittes";
                  break;
                  case $flag & ZWEITES_FLAG:
                  echo "Zweites";
                  break;
                  case $flag & ERSTES_FLAG:
                  echo "Erstes";
                  break;
                  }

                  
                  >   
                  > Ich persönlich finde letztere Variante am besten, weil am kürzesten und daher (sofern vernünftig kommentiert) am übersichtlichsten und lesefreundlichsten.  
                    
                  Was genau wäre daran übersichtlicher und lesefreundlicher als an  
                    
                  ~~~php
                  if ($flag & VIERTES_FLAG)  
                    echo "Viertes";  
                  else if ($flag & DRITTES_FLAG)  
                    echo "Drittes";  
                  else if ($flag & ZWEITES_FLAG)  
                    echo "Zweites";  
                  else if ($flag & ERSTES_FLAG)  
                    echo "Erstes";
                  

                  Und kürzer ist switch schon wegen der breaks nicht.

                  Es ist eine ganz normale Anwendung dessen, wofür die switch-Struktur da ist: Ausdrücke vergleichen.

                  Wenn man irgendwas gegen true vergleicht, sollte man sich immer fragen, ob das wirklich sinnvoll ist.

                  Qapla'

                  --
                  Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                  (Mark Twain)
                  1. Was genau wäre daran übersichtlicher und lesefreundlicher als an

                    if ($flag & VIERTES_FLAG)

                    echo "Viertes";
                    else if ($flag & DRITTES_FLAG)
                      echo "Drittes";
                    else if ($flag & ZWEITES_FLAG)
                      echo "Zweites";
                    else if ($flag & ERSTES_FLAG).
                      echo "Erstes";

                    
                    >   
                    > Und kürzer ist switch schon wegen der breaks nicht.  
                      
                    Ok, es bleibt mir wohl nichts anderes übrig, als das "am kürzesten" zurückzunehmen. Allerdings halte ich die breaks für keinen Aspekt hier. Bei solch kurzen Blöcken würde ich es in der Praxis eh als Einzeiler notieren,  
                      
                    ~~~php
                      
                    switch (true) {  
                            case $flag & VIERTES_FLAG: echo "Viertes"; break;  
                            case $flag & DRITTES_FLAG: echo "Drittes"; break;  
                            case $flag & ZWEITES_FLAG: echo "Zweites"; break;  
                            case $flag & ERSTES_FLAG:  echo "Erstes";  break;  
                    }  
                    
                    

                    bei längeren Blöcken fällt die eine zusätzliche Zeile nicht wirklich ins Gewicht.

                    Lesefreundlicher finde ich die switch-Variante jedenfalls erheblich, es wirkt sehr viel homogener. Wenn Du diese if-else-Suppe übersichtlicher findest, dann würde ich die Gegenfrage stellen wollen, warum (bzw. ob) Du überhaupt switch-Statements verwendest.

                    Na ja, ich werde Dich wohl jetzt kaum konvertieren, und darum ging es auch nicht. Du sagtest, für so etwas "solle" switch nicht verwendet werden, ich sehe diese Aussage bisher als haltlos an ;-)

                    Wenn man irgendwas gegen true vergleicht, sollte man sich immer fragen, ob das wirklich sinnvoll ist.

                    ACK. Und die Antwort wird manchmal 'Nein' und manchmal 'Ja' heißen :-)

                    Viele Grüße,
                    der Bademeister

                    1. @@Bademeister:

                      nuqneH

                      Lesefreundlicher finde ich die switch-Variante jedenfalls erheblich, es wirkt sehr viel homogener. Wenn Du diese if-else-Suppe übersichtlicher findest

                      Auch gern jeweils einzeilig:

                      if ($flag & VIERTES_FLAG)      echo "Viertes";  
                      else if ($flag & DRITTES_FLAG) echo "Drittes";  
                      else if ($flag & ZWEITES_FLAG) echo "Zweites";  
                      else if ($flag & ERSTES_FLAG)  echo "Erstes";
                      

                      Ich wüsste nicht, was daran unübersichtlicher wäre.

                      Und mit lesefrundlich meine ich Semantik: Wenn dies tue das, andernfalls wenn jenes tue anderes, andernfalls tue das.

                      Verzweige je nach wahr (WTF?), im Falle dies tue das, im Falle jenes tue anderes, andernfalls tue das. Ich finde das nicht besonders lesefreundlich.

                      dann würde ich die Gegenfrage stellen wollen, warum (bzw. ob) Du überhaupt switch-Statements verwendest.

                      Natürlich würde, wenn mehrfach dieselbe Variable mit Werten verglichen wird, ich statt

                      if (a == foo) foo()  
                      else if (a == bar) bar();  
                      else if (a == baz) baz();  
                      else quz();
                      

                      switch verwenden, denn dazu ist es gut:

                      switch (a)  
                      {  
                        case foo: foo(); break;  
                        case bar: bar(); break;  
                        case baz: baz(); break;  
                        default:  quz();  
                      }
                      

                      Qapla'

                      --
                      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                      (Mark Twain)
                      1. Verzweige je nach wahr (WTF?),

                        Neien! :-) "Verzweige je nach..." mag Dein Geschmack des Lesens einer switch-Anweisung sein (und der von C), aber nicht der von PHP (und JavaScript).

                        Das ist meine Perspektive: Das Switch-Konstrukt ist eine Schalterkonstruktion (wie ja der Name nahelegt) - die Cases definieren die Funktionalitaet der Schalterzustaende, und der Switch-Ausdruck ist der Schalter, der einen Zustand auswaehlt. Mehr nicht.

                        Einsatzmoeglichkeiten fuer Schalter gibt es nun viele, eine davon ist die, anhand des Wertes einer Variable zu verzweigen. Ein anderer Fall ist, denjenigen Schalterzustand zu waehlen, dessen Wert true ist (bzw. den ersten solchen). Wieder ein anderer Fall waere, den Schalterzustand zu waehlen, dessen Wert false ist, etc. pp.

                        Ich finde das nicht besonders lesefreundlich.

                        Ok.

                        Viele Gruesse,
                        der Bademeister

        2. Grüße,

          dich sollten http://de.selfhtml.org/javascript/sprache/bedingt.htm#switch@title=switch-Statements extrem interessieren...

          Bei Intervallen??

          warum nicht? Mit switch-Statements ist es immerhin strukturell logischer, als mit if-Statements.

          [code lang=javascript]switch (bmi) {
              case bmi < 12:
                  [...]
              break;

          case bmi < 18 && bmi > 12:
                  [...]
              break;

          wie wäre es mit break;losem

          case 12
           x=sehr mager
          case 18
           x=mager
          case 20
           x=ok

          mit anshcließender augabe?
          MFG
          bleicher

          --
          __________________________-

          FirefoxMyth
          1. Hi,

            wie wäre es mit break;losem

            case 12
            x=sehr mager
            case 18
            x=mager
            case 20
            x=ok

            mit anshcließender augabe?

            Soll denn bei 12 und bei 18 auch "ok" rauskommen?

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Grüße,

              wie wäre es mit break;losem

              case 12
              x=sehr mager
              case 18
              x=mager
              case 20
              x=ok

              mit anshcließender augabe?

              Soll denn bei 12 und bei 18 auch "ok" rauskommen?

              ich hätte narütlich >= schrieben sollen, also case bmi>=12, denn soweit ich switch verstehe, würde im fall von 20 x die werte von 18 und 12 zwar vorübergehend zugewiesen bekommen, dann aber vom case bmi>=20 überschrieben werden, wobei case bmi>=25 nicht mehr getriggert wird, und der wert von 20er fall bleiben würde.
              MFG
              bleicher

              --
              __________________________-

              FirefoxMyth
              1. Hi,

                wie wäre es mit break;losem

                case 12
                x=sehr mager
                case 18
                x=mager
                case 20
                x=ok

                mit anshcließender augabe?

                Soll denn bei 12 und bei 18 auch "ok" rauskommen?

                ich hätte narütlich >= schrieben sollen, also case bmi>=12, denn soweit ich switch verstehe, würde im fall von 20 x die werte von 18 und 12 zwar vorübergehend zugewiesen bekommen, dann aber vom case bmi>=20 überschrieben werden, wobei case bmi>=25 nicht mehr getriggert wird, und der wert von 20er fall bleiben würde.

                Du hast wohl nicht verstanden, wie switch/case funktioniert:

                es wird zu dem case gesprungen, der durch das switch(xxx) ausgewählt wird. Ab da wird der Code abgearbeitet, als wären die case-Label nicht vorhanden.
                Durch ein break kann das Abarbeiten der Liste abgebrochen werden.

                Bei
                a = 1;
                switch(a)
                {
                case 0:
                   b = 7;
                case 1:
                   b = 8;
                case 2:
                   b = 17;
                case 3:
                   b = 42;
                   break;
                case 4:
                   b = 111;
                }
                c = 2;

                werden also folgende Zuweisungen ausgeführt:
                a = 1;
                b = 8;
                b = 17;
                b = 42;
                c = 2;

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                1. Grüße,
                  hm - und was passiert mit rbeaks und wenn mehrere zutreffen? also 18 würde kleiner 20, kleiner 25 etc triggern oder nur den erstpassenden?
                  MFG
                  bleicher

                  --
                  __________________________-

                  FirefoxMyth
        3. Hi Felix.

            
          
          > switch (bmi) {  
          >     case bmi < 12: // (weiß nicht, ob ein bmi 0 sein kann, aber Du willst wohl true hier haben , oder?)  
          >         [...]  
          >     break;  
          >   
          >     case bmi < 18 && bmi > 12: // (jetzt haste die 12 vergessen)  
          >         [...]  
          >     break;  
          >   
          >     case bmi <= 18  && bmi >= 20:  
          >         [...]  
          >     break;  
          
          

          Das kannst Du dann auch etwas abzürzen:

            
          switch(true) {  
            
               case bmi < 12:  
                   [...]  
               break;  
            
               case bmi < 18  
                   [...]  
               break;  
            
               case bmi <= 20:  
                   [...]  
               break;  
               [...]  
          }  
          
          

          Viele Grüße,
          der Bademeister

        4. Hi.

          Bei Intervallen??

          warum nicht? Mit switch-Statements ist es immerhin strukturell logischer, als mit if-Statements.

          switch (bmi) {

          case bmi < 12:
                  [...]
              break;
              [usw.]
          }

          
          >   
          > Zumindest würde damit die if-else-Verkettung entfallen. Dass das alles andere als "best practice" ist, ist mir klar. Ich hätte da eher eine Art Array gebastelt:  
          >   
          > ~~~javascript
          
          var bmi_messages = [  
          
          >     {  
          >         range : [0, 11.999],  
          >         message : "Die Eingabe ist Ungültig! Die Körpergröße bitte als Fließkommazahl mit einem Punkt statt einem Komma eingeben."  
          >     },  
          >     [usw.]  
          >     {  
          >         range : [60, 999],  
          >         message : "Entweder sind sie extrem übergewichtig oder die Eingabe ist fehlerhaft."  
          >     }  
          > ];
          
          

          Ich habe zwar keine Ahnung von JavaScript, aber ich möchte dazulernen.

          Was spricht gegen die switch- Anweisung?

          Wie würdest du das Array dann auswerten? Oder ist bei diesem Array die Auswertung bereits durch das "range: [x, y]" gegeben? Wenn ja, wie erfolgt dann die Ausgabe?

          Schönen Sonntag noch!
          O'Brien

          --
          Frank und Buster: "Heya, wir sind hier um zu helfen!"
  3. @@Mainzel:

    nuqneH

    if (bmi >= 18 && bmi <= 20) {output += "Sie sind Untergewichtig.";}
       if (bmi >= 20 && bmi < 25) {output += "Ihr Gewicht ist gut, ein BMI von 22 ist optimal.";}

    Aha, bei einem BMI von 20 ist man also untergewichtig, aber das ist gut.

    if (bmi >= 25 && bmi <= 29) {output += "Sie sind etwas zu dick.";}
       if (bmi >= 30 && bmi <= 39) {output += "Sie sind stark Übergewichtig.";}

    Bei einem BMI von 29.5 ist man gar nichts.

    if (bmi >= 30 && bmi <= 39) {output += "Eine ärztliche Behandlung aufgrund ihres Übergewichts ist zu empfehlen.";}

    Warum zwei Fallunterscheidungen für denselben Fall?

    if (bmi >= 60) {output += "Entweder sind sie extrem UEbergewichtig oder die Eingabe ist fehlerhaft.";}

    Auch bei 39 < bmi < 60 fällt man durchs Raster.

    Bist du sicher, dass du bei den Intervallgrenzen sorgfältig gearbeitet hast?

    Es wird wohl nur jeweils einer der Fälle eintreten. Deshalb ist es sinnlos, bei einer erfüllten Bedingung noch alle nachfolgenden zu prüfen. Die nachfolgenden Bedingungen gehören also jeweils in den else-Zweig:

    if (bmi < 12) {}  
    else if (bmi < 18) {}  
    else if (bmi < 20) {}  
    else if (bmi < 25) {}  
    else if (bmi < 30) {}  
    else if (bmi < 60) {}  
    else {}
    

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)