switch me off!



  • Hallo,

    die Aufgabe war, eine if else Verschachtelung in switch zu übersetzen.

    
    #include <iostream>
    using namespace std;
    // von if else zu switch
    int main() {
        unsigned short a,b;
        cout << "Erste Ziffer (1..3): ";
        cin >> a;
        cout << "Zweite Ziffer (1..3): ";
        cin >> b;
    
        switch (a) { (0 == a || a > 3 )
          
          case true:
              cout <<"Unzulaessige Eingabe, Programm beendet."
                   << endl;
          break;
    
          case false:
              cout << (1 == a && 1 == b) << "Elf!"
                   << (1 == a && 2 == b) << " Zwölf"
                   << (1 == a && 3 == b) << " Dreizehn"
                   << endl;
          break;
    
          case false:
              cout << (2 == a && 1 == b) << "Einundzwanzig!"
                   << (2 == a && 2 == b) << " Zweiundzwanzig"
                   << (2 == a && 3 == b) << " Dreiundzwanzig"
                   << endl;
          break;
    
          case false:
              cout << (3 == a && 1 == b) << "Einunddreissig"
                   << (3 == a && 2 == b) << " Zweiunddreissig"
                   << (3 == a && 3 == b) << " Dreiunddreissig"
                   << endl;
          break;
      }
        return 0;
    }
    

    Der Compiler erzählt was von erwarteten Semikolon in Zeile 14.
    Es muss aber einen anderen Grund haben, da dort ja eigentlich keins hinkommt.

     switch (a) { (0 == a || a > 3 )
    

    Ist das möglich oder Unsinn?
    Sollte ich ein zweites switch für b machen ?

    Danke
    Lou



  • @Lou-Cyphr3 was sagt denn dein Lehrbuch über die Verwendung von switch?



  •  switch (a) { (0 == a || a > 3 ) // das ist Quatsch
     switch ((0 == a || a > 3 )) {  // habs jetzt so gemacht. Vllt auch Quatsch?
    
    Das Lehrbuch gibt ein Programm nur mit zwei case vor true and false
    
    ich bräuchte aber mehre false um auf das gewünschte Ergebnis zukommen.
    
    Weil mir mein Compiler nun alle Möglichkeiten bei false ausgibt.
    
    
    
    


  • @Lou-Cyphr3 sagte in switch me off!:

    Das Lehrbuch gibt ein Programm nur mit zwei case vor true and false

    Dann ist das Buch bescheiden.

    https://de.m.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturen#switch



  • @DirkB Es gibt schon noch ein bisschen mehr zu lesen mit.

    Der Teufel steckt im Detail.
    Ich habe jetzt noch diverse Versuche mit den Case Konstanten angestellt.

    Bin ich mit false und true auf dem richtigen Weg oder irre ich?

    Danke Lou


  • Gesperrt

    @Lou-Cyphr3 sagte in switch me off!:

    Bin ich mit false und true auf dem richtigen Weg oder irre ich?

    Geht so nicht. Du brauchst auch ein switch(b)

    switch(a)
    {
       case ...
       switch(b)
       {
           ...
       }
       break;
       case ...
       switch(b)
       {
           ...
       }
       break;
       ...
    }
    

    ^^so etwa.



  • @RBS2 ein switch(a*10+b) geht auch



  • mh
    ich habs jetzt so.

    
    #include <iostream>
    using namespace std;
    // von if else zu switch
    int main() {
        unsigned short a,b;
        cout << "Erste Ziffer (1..3): ";
        cin >> a;
        cout << "Zweite Ziffer (1..3): ";
        cin >> b;
    
        switch ((0 == a || a > 3 )) {
          case true:
              cout <<"Unzulaessige Eingabe, Programm beendet."
                   << endl;
          break;}
    
          switch ((0 == b || b > 3)) {
            case false:
              cout << (1 == a && 1 == b) << "Elf!"
                   << (1 == a && 2 == b) << " Zwölf"
                   << (1 == a && 3 == b) << " Dreizehn"
                   << endl;
                   break;}
    
          switch ((0 == b || b > 3)) {
            case false:
              cout << (2 == a && 1 == b) << "Einundzwanzig!"
                   << (2 == a && 2 == b) << " Zweiundzwanzig"
                   << (2 == a && 3 == b) << " Dreiundzwanzig"
                   << endl;
                   break;}
    
          switch ((0 == b || b > 3)) {
            case false:
            cout   << (3 == a && 1 == b) << "Einunddreissig"
                   << (3 == a && 2 == b) << " Zweiunddreissig"
                   << (3 == a && 3 == b) << " Dreiunddreissig"
                   << endl;
                 }
    
    
        return 0;
    }
    

    Ich muss irgendein Logikfehler drin haben.
    Es gibt mir schon irgendwie das richtige Ergebnis aus.
    Doch eher wie ne Wahrheitstabelle und hinter dem richtigen Ausdruck ne 1 und
    sonst null.


  • Gesperrt

    @Lou-Cyphr3 sagte in switch me off!:

    Doch eher wie ne Wahrheitstabelle und hinter dem richtigen Ausdruck ne 1 und
    sonst null.

    Das kommt wenn man das Ergebnis eines logischen Ausdrucks ausgibt. Sorry, aber dein Programm ist totaler Bullshit.



  • @Lou-Cyphr3 Deine Unterlagen zum lernen bringen dich nicht weiter. Darum vergiss diese, nimm andere.

    switch wertet den Ausdruck in den () - als integer - aus und springt zum entsprechenden case.
    Meist steht in den () nur eine Variable, nie jedoch ein logischer Ausdruck (dafür nimmt man if)


  • Gesperrt

    switch/case ist im Prinzip eine andere Schreibweise für:

    if (a == x)  // case x
        mach dies;
    else if (a == y) // case y
        mach jenes;
    else if (a == z) // case z
        mach anderes;
    ...
    ...
    else /* default, alle anderen Fälle  */
        mach was wenn nichts zutrifft;
        
    


  • @RBS2 Ich möchte noch anmerken, dass das genau dann gilt, wenn jedes case mit einem break; Statement terminiert wird (was man i. d. R. auch so macht).



  • Und soweit ich weiß funktionieren bei den cases auch nur Zahlen bzw. was als Zahlen interpretiert werden kann. Besser gesagt integralen Zahlen. else if ermöglicht zum Beispiel den Vergleich von zwei Strings, was bei switch case nicht funktioniert. Schreibt, wenn ich falsch liege 🙂



  • @Zhavok ja, enum/enum class geht auch.

    Wenn man unbedingt strings switchen will:

    constexpr std::uint32_t fnv32(std::string_view s) {
        std::uint32_t hash{2166136261u};
        for (std::size_t i = 0; i < s.size(); ++i) {
            hash = 16777619u * (hash ^ s[i]);
        }
        return hash;
    }
    
    std::string s = "foo";
    switch (fnv32(s)) {
    case fnv32("foo"):
       // ...
        break;
    case fnv32("bar"):
        // ...
        break;
    // ....
    }
    


  • Hahaha. Das ist das beste Beispiel Strings zu vergleichen um andere Entwickler zu ärgern, die das dann lesen müssen. Aber trotzdem interessant die Methode, den String einfach zu hashen 🙂



  • Warum? Ist doch sogar ganz gut lesbar.



  • Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein == oder .compare() liest man einfach schneller drüber. Aber wenn man unbedingt switch/case nutzen will, sicher ein guter Weg 🙂


  • Gesperrt

    @Zhavok sagte in switch me off!:

    Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein ==

    == bei Strings vergleicht ihre Adressen. Das geht schief wenn man mit Gleichheit gleichen Inhalt meint. Da muss schon ein strcmp() oder sowas her.



  • @RBS2 @DirkB

    Danke für die Tipps und die netten Worte.

    #include <iostream>
    using namespace std;
    
    int main() {
        unsigned short a,b;
        cout << "Erste Ziffer (1..3): ";
        cin >> a;
        cout << "Zweite Ziffer (1..3): ";
        cin >> b;
    
        switch (a) {
          case 1 :
    
              switch (b){
                   case 1 :
                        cout << "Elf" << endl;
                            break;
    
                   case 2 :
                         cout << "zwölf" << endl;
                            break;
                   case 3 :
                         cout << "Dreizehn" << endl;
                            break;
    
                  default : cout << "falsche Eingabe." << endl;
                        }
                      }
    
        return 0;
    }
    

    So sollte es zufrieden stimmen.


  • Gesperrt

    @Lou-Cyphr3 sagte in switch me off!:

    So sollte es zufrieden stimmen.

    Für den Fall a==1. Das ist schon mal ein Anfang.


Anmelden zum Antworten