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!?
-
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);