Taschenrechner Frage



  • Hallo zusammen,

    ich wollte gerne einen einfachen Taschenrechner schreiben der die 4 Grundrechenarten beherrscht.

    Ich würde in die Konsole dann gerne z.B. 3+5 oder 3/5 eingeben und das Ergebnis mit Enter anfordern. Ich kann nur einen Rechner erstellen den man z.B. so bedient: 4 5 Enter -> 9. Also die beiden Zahlen schreiben ohne den Operator. Jenachdem ob man summe=zahl1+zahl2 oder summe=zahl1/zahl2 eingegeben hat, wird es dann berechnet. Ich würde die Rechenart also direkt mit dem Operator den ich eingeben bestimmen.

    Mein Ansatz bisher sieht so aus:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    
    {
    
    	float zahl1, zahl2, summe; 
    	char operator; 
    
    	cin >> zahl1 >> "operator" >> zahl2; 
    
    	summe= 
    
    	cout << summe; 
    
    }
    

    ich weiß, dass es so absolut falsch ist. Aber ich komme grade einfach nicht weiter. Ich hoffe mir kann jemand einen Tipp geben, wie ich am beste vorgehe.

    Danke schonmal im voraus.



  • char op; //operator isn blöder name, is nämlich ein schlüsselwort
    int ergebnis, zahl1, zahl2; //oder lieber float, wegen /
    cin >> zahl1 >> op >> zahl2;
    switch(op) //kannst auf if nehmen, googel mal c++ switch
    {
        case '*': ergebnis = zahl1*zahl2; break;
        //usw.
    }
    


  • yes, danke dir. funktioniert jetzt so wie ichs mir vorgestellt hatte.



  • Komfortables Geschmacksmuster:

    #include <string>
    #include <sstream>
    #include <iostream>
    
    int main()
    {
    	std::cout << "Simple calculator.\n\n";
    
    	std::string input;
    	float lhs = 0.;
    	float rhs = 0.;
    	char op = 0;
    	double result = 0.;
    
    	for( ;; ) {
    
    		std::cout << "> ";
    		std::getline( std::cin, input );
    
    		if( input.find( "exit" ) != input.npos )
    			break;
    
    		std::stringstream ss( input );
    		if( !( ss >> lhs >> op >> rhs ) ) op = 0;
    
    		switch( op ) {
    
    			case '+': result = lhs + rhs; break;
    			case '-': result = lhs - rhs; break;
    			case '*': result = lhs * rhs; break;
    			case '/': result = lhs / rhs; break;
    			default:
    				std::cerr << "Input error.\n\n";
    				continue;
    		}
    
    		std::cout << lhs << ' ' << op << ' ' << rhs << " = " << result << "\n\n";
    	}
    
    	std::cout << "bye.\n\n";
    }
    


  • Mit meiner Klasse line_guard geht das auch ohne den Umweg über den stringstream:

    int main()
    {
      std::cout << "Simple calculator.\n\n";
    
      float lhs, rhs, result;
      char op;
    
      for( ;; ) {
        std::cout << "> ";
        line_guard g;
    
        if (std::cin >> std::skipws && std::cin.peek() == 'q')
          break;
    
        if (!(std::cin >> lhs >> op >> rhs) || !g.eol())
          op = '\0';
    
        switch (op) {       
        case '+': result = lhs + rhs; break;
        case '-': result = lhs - rhs; break;
        case '*': result = lhs * rhs; break;
        case '/': result = lhs / rhs; break;
        default:
          std::cerr << "Input error\n\n";
          continue;
        }
        std::cout << lhs << ' ' << op << ' ' << rhs << " = " << result << "\n\n";
      }
      std::cout << "bye.\n\n";
    }
    

    Ausserdem werden falsche Eingaben wie "1+2*3" abgefangen. Und wenn man ein eof sendet, verfängt sich das Programm nicht in einer Endlosschleife.



  • danke sind sehr hilfreiche antworten dabei.

    aber wie bekomme ich es jetzt hin, dass wie hier z.B.

    case '+': summe=zahl1+zahl2;
    		cout << "=" << summe << endl << endl; 
    		break;
    

    mein cout auf der gleichen zeile wie mein cin steht?



  • Mit Standard-C++ garnicht. Da musst Du entsprechende APIs deines Betriebssytems bitten.



  • gut, dann lass ich das vorerst ^^

    danke



  • Für Windows:

    #include <string>
    #include <sstream>
    #include <iostream>
    
    #include <windows.h> // platform-specific: GetStdHandle(), GetConsoleScreenBufferInfo(), SetConsoleCursorPosition()
    
    void gotoxy( short x, short y )
    {
    	HANDLE hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
        COORD coord = { x, y };
    	SetConsoleCursorPosition( hstdout, coord );
    }
    
    short wherey( )
    {
        HANDLE hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
    	CONSOLE_SCREEN_BUFFER_INFO csbi;	
    	GetConsoleScreenBufferInfo( hstdout, &csbi );
    	return csbi.dwCursorPosition.Y;
    }
    
    int main()
    {
        std::cout << "Simple calculator.\n\n";
    
        std::string input;
        float lhs = 0.;
        float rhs = 0.;
        char op = 0;
        double result = 0.;
    
        for( ;; ) {
    
            std::cout << "> ";
            std::getline( std::cin, input );
    
            if( input.find( "exit" ) != input.npos )
                break;
    
            std::stringstream ss( input );
            if( !( ss >> lhs >> op >> rhs ) ) op = 0;
    
    		short x = input.length() + 2;
    		short y = wherey() - 1;
    
            switch( op ) {
    
                case '+': result = lhs + rhs; break;
                case '-': result = lhs - rhs; break;
                case '*': result = lhs * rhs; break;
                case '/': result = lhs / rhs; break;
                default:
                    std::cerr << "Input error.\n\n";
                    continue;
            }
    
    		gotoxy( x, y );
            std::cout << " = " << result << "\n\n";
        }
    
        std::cout << "bye.\n\n";
    }
    

Anmelden zum Antworten