Switch Kette



  • #include <iostream>
    #include <cmath>
    
    using namespace std; 
    
    int main()
    {
    double zahl1, zahl2, zahl3, result;
    	  char rechenzeichen1, rechenzeichen2;
    
    	  cout << "Welche Rechenaufgabe wollen sie loesen?" <<endl;
    	  cin >> zahl1 >> rechenzeichen1 >> zahl2 >> rechenzeichen2 >> zahl3; 
    
    	switch (rechenzeichen1 , rechenzeichen2)
    	{
    		case '+' , '+': result = zahl1 + zahl2 + zahl3; break;
    

    Kann man eine solche "Switch-Kette" eingeben oder geht das nicht?
    Habe ich vll einen kleinen Denkfehler und es gibt einen Weg das zu umgehen?

    Zuvor habe ich die 2 Rechenzeichen unabhängig voneinander switchen lassen, doch ich habe festgestellt, dass dann die Punkt-vor-Strich Regel natürlich nicht mehr funktioniert...

    Wie kann ich das lösen?



  • Das geht nicht, rechenzeichen1 ist in dem Fall ein "statement with no effect":

    helloworldc++ schrieb:

    Wie kann ich das lösen?

    Wenn du es so machen willst, dann mit if:

    if (rechenzeichen1 == '+' && rechenzeichen2 == '+')
    {
    
    }
    


  • ok ich möchte dann jedoch alle 16 Möglichkeiten mit den 4 Grundrechenarten abdecken..
    somit müsste ich 15 mal else if hinzufügen, kann man das nicht abkürzen? Also z.B. irgendwie in einem Schritt machen!?


  • Mod

    Dank des beschränkten Wertebereichs der Eingabe bietet sich an, die Eingaben eindeutig in int abzubilden.

    z.B.

    constexpr int op2int(char op1, char op2) { return op1 * 256 + op2; }
    

    und somit

    switch (op2int(rechenzeichen1 , rechenzeichen2))
        {
            case op2int('+' , '+'): result = zahl1 + zahl2 + zahl3; break;
    


  • Scheint sehr simpel zu sein, aber kann mir das auch jemand erklären?
    Ich kenne die Operatoren die du verwendet hast z.T. noch nicht..



  • #include <iostream>
    
    double calc(double zahl1, double zahl2, char rz)
    {
        switch (rz)
        {
            case '+':
                return zahl1 + zahl2;
                break;
            case '-':
                return zahl1 - zahl2;
                break;
            case '*':
                return zahl1 * zahl2;
                break;
            case '/':
                return zahl1 / zahl2;
                break;
            default:
                {
                    //Fehler
                }
        }
        return 0;
    }
    
    int main()
    {
        double zahl1, zahl2, zahl3, ergebnis;
        char rz1, rz2;
    
        std::cout << "Welche Rechenaufgabe wollen sie loesen?" << std::endl;
        std::cin >> zahl1 >> rz1 >> zahl2 >> rz2 >> zahl3;
    
        if ((rz2 == '*' || rz2 == '/') && (rz1 != '*' && rz1 != '/')) 
            ergebnis = calc(zahl1, calc(zahl2, zahl3, rz2), rz1); 
        else 
            ergebnis = calc(calc(zahl1, zahl2, rz1), zahl3, rz2);
    
        std::cout << "Ergebniss:" << ergebnis << std::endl;
    }
    

    Wenn der zweite Operator Punkt und der erste Strich ist wird das Zweite zuerst ausgewertet, anders nicht.

    Vorab: war auf die Schnelle und kann sein, dass ich irgendeinen Sonderfall nicht berücksichtigt hab.
    Edit: Fehler korrigiert, danke an sebi.



  • Schöner Ansatz von Bitmapper. Ist aber glaube ich ein kleiner Fehler drin. Beispiel folgende Rechnung: 10-2*2. Dann wird zwar zuerst 2*2 gerechnet aber dann 4-10 weil du die Reihenfolge der Zahlen vertauscht hast. So dürfte es stimmen:

    if ((rz2 == '*' || rz2 == '/') && (rz1 != '*' && rz1 != '/'))
        ergebnis = calc(zahl1, calc(zahl2, zahl3, rz2), rz1);
    else
        ergebnis = calc(calc(zahl1, zahl2, rz1), zahl3, rz2);
    

Log in to reply