Ankündigung

Einklappen
Keine Ankündigung bisher.

Switch liefert bei Zahlenvergleich falschen Wert

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Switch liefert bei Zahlenvergleich falschen Wert

    Guten Abend,

    ich will das Ergebnis eines Tests in eine Note umrechnen:
    PHP-Code:
    $counterrichtig 0;
    $anzahlfragen 20;
    $quotient $counterrichtig $anzahlfragen;
    $datensatz "Note ";
    switch (
    $quotient) {
        case 
    $quotient >= .95:
            
    $datensatz .= "1+";
            break;
        case 
    $quotient >= .90:
            
    $datensatz .= "1";
            break;
        case 
    $quotient >= .85:
            
    $datensatz .= "1-";
            break;
        case 
    $quotient >= .80:
            
    $datensatz .= "2+";
            break;
        case 
    $quotient >= .75:
            
    $datensatz .= "2";
            break;
        case 
    $quotient >= .70:
            
    $datensatz .= "2-";
            break;
        case 
    $quotient >= .65:
            
    $datensatz .= "3+";
            break;
        case 
    $quotient >= .60:
            
    $datensatz .= "3";
            break;
        case 
    $quotient >= .55:
            
    $datensatz .= "3-";
            break;
        case 
    $quotient >= .50:
            
    $datensatz .= "4+";
            break;
        case 
    $quotient >= .45:
            
    $datensatz .= "4";
            break;
        case 
    $quotient >= .40:
            
    $datensatz .= "4-";
            break;
        case 
    $quotient >= .35:
            
    $datensatz .= "5+";
            break;
        case 
    $quotient >= .30:
            
    $datensatz .= "5";
            break;
        case 
    $quotient >= .25:
            
    $datensatz .= "5-";
            break;
        case 
    $quotient 0:
            
    $datensatz .= "6";
            break;
        }
    echo 
    $quotient ' - ' $datensatz
    Das klappt alles prima. Nur wenn jemand den Test völlig vergeigt, also keine Frage richtig hat ($quotient also den Wert 0 hat), liefert Switch die Note 1+. Hä????? Rästel, rätsel, rätsel ...

    AS

  • #2
    Ein switch-case ist da eher nicht so geeignet für. Nimm besser eine IF Abfrage.

    PHP-Code:
    if ($quotient >= 0.95) {
      
    $datensatz .= '1+';
    } else if (
    $quotient >= 0.9) {
      
    $datensatz '1';

    // Weitere else if
    // Am Ende else für default wert
    } else {
      
    $datensatz 'Irgendwas anderes';

    Kommentar


    • #3
      Switch-Fälle enthalten keine Anweisungen, die ausgewertet werden müssen. Sie nehmen einfache Zeichenfolgen, Boolesche Werte oder Zahlen zum Vergleich. Du wendest switch case halt falsch an und produzierts dadurch Blödsinn. Außerdem hast Du Note 6 falsch ausgewertet. Der Vergleich ist auch keiner. Dorf findet eine Zuweisung statt. Am Besten du beschäftigst Dich mal mit den Grundlagen der Sprache, wie man Vergleiche und Anweisungen definiert. Ist eigentlich traurig, dass Du das in 3 Jahren nicht hinbekommen hast.
      bitcoin.de <- Meine Freelancerwährung

      Kommentar


      • #4
        Zitat von Alpha Beitrag anzeigen
        Switch-Fälle enthalten keine Anweisungen, die ausgewertet werden müssen. (..)
        Blödsinn.

        Das Problem lässt sich ganz einfach beheben:

        PHP-Code:
        ...
        switch (
        true) {  // true statt $quotient
        ... 
        [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

        Kommentar


        • #5
          oder
          PHP-Code:
          $quotient $counterrichtig $anzahlfragen 100
          dann musst du natürlich die kommastelle(Punkt) weglassen

          Kommentar


          • #6
            Zitat von lottikarotti Beitrag anzeigen
            Blödsinn.

            Das Problem lässt sich ganz einfach beheben:

            PHP-Code:
            ...
            switch (
            true) { // true statt $quotient
            ... 
            in Verbindung mit
            PHP-Code:
            case $quotient == 0
            anstelle case $quotient = 0:

            Eleganter ist es aber über ein Array mit allen Note => Quotient und einer Schleife zu lösen anstelle von etlichen Bedingungen.


            Kommentar


            • #7
              bei #6 würde ich zustimmen, der Rest ist nur Rumgefusche.
              @ #4 Du widersprichst mir und beweist im Beispiel gleich darauf, dass ich recht hatte. Dass muss ich jetzt nicht verstehen.

              Nochmal zum mitmeiseln. Der Switch wird hier boolsch für alle Werte > 0 als TRUE ausgewertet und prüft ob der Case auch TRUE ist, also ob die Bedingung des Case TRUE ist. Das bedeutet letztlich, dass bei 0 die erste Bedingung im Case immer treffen muss, da diese zu FALSE ausgewertet wird und der erste Switch ebenfalls FALSE ist, also wird diese Position angesprungen.

              Aber egal wie man das macht, jede Lösung mit Switch-Case ist hässlich, schwer lesbar, ebenso wie eine endlose IF-Reihe. Daher würde ich auch für ein Array plädieren.
              bitcoin.de <- Meine Freelancerwährung

              Kommentar


              • #8
                Ich würde es am Ende wahrscheinlich auch mit einem Array Lösen, allerdings spricht auch nichts gegen ein IF Statement, da hier eine Konstante Bedingung besteht. Es ist unwahrscheinlich, dass es irgendwann die Note 7 gibt. Daher kann man hier laut Definition ohne Probleme mit einem IF Arbeiten, welches auch jeder Programmieranfänger auf einen Blick versteht. Bei einer Array Lösung, welche leichter zu erweitern ist, steigt aber auch die Code Komplexität an was den Code schwerer Lesbar gestaltet.

                Kommentar


                • #9
                  Zitat von jspit Beitrag anzeigen
                  in Verbindung mit
                  PHP-Code:
                  case $quotient == 0
                  Danke für den Hinweis, das habe ich übersehen. Diesen Fehler halt ich aber weniger für ein Problem mit switch als vielmehr für einen Flüchtigkeitsfehler oder ein Verständnisproblem hinsichtlich = und == / ===.

                  Zitat von Alpha Beitrag anzeigen
                  @ #4 Du widersprichst mir und beweist im Beispiel gleich darauf, dass ich recht hatte. Dass muss ich jetzt nicht verstehen.
                  Ich empfinde deine Erklärung bzgl. der Anwendung von switch als unpräzise, weshalb ich vermutlich falsch verstanden habe was du eigentlich sagen wolltest.

                  Grundsätzlich erwarten sowohl "switch" als auch "case" einfach nur einen Ausdruck (Expression) als Parameter. Bei switch spricht man hier von einer control expression, beim case von von einer case expression. Das ist seitens PHP auch nicht auf bestimmte Ausdrücke limitiert. Deshalb ist es völlig egal ob es sich bei diesen Ausdrücken um Zuweisungen (auch diese haben in PHP einen Rückgabewert) oder sonstige Ausdrücke (Funktionsaufrufe, Variablen, Vergleiche etc.) handelt. Unbedingt zu beachten ist natürlich auch, dass switch einen non-strict Vergleich zwischen control expression und case expression durchführt.

                  Ich verwende switch gerne um eine klare, optische Trennung zwischen den verschiedenen Fällen zu erzeugen und damit die Lesbarkeit des Codes in bestimmten Fällen zu verbessern. Meistens nutze ich dann aber switch(true) { .. }, weshalb ich die vom TE gezeigte Anwendung für grundsätzlich legitim halte.

                  Man kann switch auch ein wenig "exploiten" und bspw. sowas machen:

                  PHP-Code:
                  <?php

                  // setup, just ignore
                  class User {}
                  class 
                  Superuser extends User {}
                  class 
                  Customer extends User {}
                  function 
                  getUser(){ return [ new Superuser(), new Customer(), null ][rand(02)]; }

                  // poor man's pattern matching (don't do that at home)
                  switch($user getUser()){

                    case 
                  null// must be first due to non-strict comparison
                      
                  echo 'No user found';
                      break;

                    case 
                  $user instanceof Superuser:
                      echo 
                  "It's a superuser";
                      break;

                    case 
                  $user instanceof Customer:
                      echo 
                  "It's a customer";
                      break;

                  }
                  Bitte nicht nachmachen
                  [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                  Kommentar


                  • #10
                    Zitat von protestix Beitrag anzeigen
                    oder
                    PHP-Code:
                    $quotient $counterrichtig $anzahlfragen 100
                    dann musst du natürlich die kommastelle(Punkt) weglassen
                    Das hatte ich ursprünglich, hat aber auch nicht geklappt.

                    Kommentar


                    • #11
                      Zitat von Alpha Beitrag anzeigen
                      Switch-Fälle enthalten keine Anweisungen, die ausgewertet werden müssen. Sie nehmen einfache Zeichenfolgen, Boolesche Werte oder Zahlen zum Vergleich. Du wendest switch case halt falsch an und produzierts dadurch Blödsinn. Außerdem hast Du Note 6 falsch ausgewertet. Der Vergleich ist auch keiner. Dorf findet eine Zuweisung statt. Am Besten du beschäftigst Dich mal mit den Grundlagen der Sprache, wie man Vergleiche und Anweisungen definiert. Ist eigentlich traurig, dass Du das in 3 Jahren nicht hinbekommen hast.
                      Für solche Kommentare fehlt mir immer ein wenig das Verständnis. Klar, es gibt Leute, die nie Tippfehler machen. Gegenüber solchen Leuten ist das natürlich "traurig". Ach: "Boolesche Werte" schreibt man übrigens klein.

                      Kommentar


                      • #12
                        Zitat von lottikarotti Beitrag anzeigen
                        Danke für den Hinweis, das habe ich übersehen. Diesen Fehler halt ich aber weniger für ein Problem mit switch als vielmehr für einen Flüchtigkeitsfehler oder ein Verständnisproblem hinsichtlich = und == / ===.
                        Genau so ist es. Ich habe viel rumprobiert und nicht mehr auf das Ende der Case-Anweisungen geachtet, da Switch ja gleich zu Beginn ausstieg. Ursprünglich stand da mal
                        PHP-Code:
                        default: 
                        ohne jeden Vergleich.

                        Die Lösung von jspit klappt. Jetzt ist mir das klar. Meine Syntax stammt halt aus VB "Select Case $quotient ...". Daher auch der Tippfehler, da VB ja nicht zwischen = und ==/=== unterscheidet.

                        Danke für Eure Hilfe.

                        Kommentar


                        • #13
                          Zitat von ASenna Beitrag anzeigen
                          Die Lösung von jspit klappt. Jetzt ist mir das klar. Meine Syntax stammt halt aus VB "Select Case $quotient ...". Daher auch der Tippfehler, da VB ja nicht zwischen = und ==/=== unterscheidet.
                          .
                          Sehr schön du hast dir von der ganzen Diskussion also das mitgenommen, was die schlechtes von allen Alternativen ist. Eine Switch-Case Anweisung war und ist immer noch die nicht optimale Lösung, auch wenn sie funktionieren mag.

                          Kommentar


                          • #14
                            Zitat von Zeichen32 Beitrag anzeigen
                            Sehr schön du hast dir von der ganzen Diskussion also das mitgenommen, was die schlechtes von allen Alternativen ist. Eine Switch-Case Anweisung war und ist immer noch die nicht optimale Lösung, auch wenn sie funktionieren mag.
                            Was genau ist denn dein Problem mit switch/case?
                            [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                            Kommentar


                            • #15
                              Naja eine Switch-Case Anweisung ist dafür da eine Fall-Unterscheidung zu machen. Bei dem Beispiel wird der Fall aber auf TRUE gesetzt und die Case Anweisungen dann wie eine IF Abfrage genutzt.
                              Am Ende hast du 1) mehr Zeilen Code und 2) ein schwerer Lesbaren Code, da man erstmal verstehen muss warum da switch(true) steht.

                              Auch in der PHP Doku sieht man keinen Hinweis darauf, dass Switch-Case hierfür gedacht ist:
                              https://www.php.net/manual/de/contro...res.switch.php

                              Kommentar

                              Lädt...
                              X