[C++ Rechner/Anfänger]



  • Hallo ich Lerne seit kurzem C++ und habe nun einen kleinen Rechner gecodet,
    der Rechner funktioniert auch soweit.
    Meine Frage ist nun die Ob sich das mal jemand anschauen könnte und mit
    vielleicht sagen kann was man verbessern könnte.

    main.cpp

    #include <iostream>
    #include <cstdio>
    #include "grundrechnung.h"
    using namespace std;
    
    int main()
    {
    	int auswahl;
    	int weiterRechnen = 0;
    
    	cout << "Rechner"
    		 << "\n-------------------------"
    		 << "\nFunktionsauswahl:"
    		 << "\nAddieren	=> 1"
    		 << "\nSubtrahieren	=> 2"
    		 << "\nMultiplizieren	=> 3"
    		 << "\nDividieren	=> 4"
    		 << "\nBeenden		=> 0"
    		 << "\n-------------------------"
    		 << "\nAuswahl: ";
    	cin >> auswahl;
    
    	double zahl1, zahl2;
    	double ergebnis;
    
    	switch( auswahl )
    	{		//switchA 
    		case 0:
    			return 0;
    			break;
    		case 1:
    			cout << "\nAddieren von zwei Zahlen\n"
    				 << "\nZahl1: ";
    			cin >> zahl1;
    			cout << "\nZahl2: ";
    			cin >> zahl2;
    			cout << endl;
    
    			ergebnis = addieren( zahl1, zahl2);
    
    			weiterRechnen = 1;
    			break;
    		case 2:
    			cout << "\nSubtrahieren von zwei Zahlen\n"
    				 << "\nZahl1: ";
    			cin >> zahl1;
    			cout << "\nZahl2: ";
    			cin >> zahl2;
    			cout << endl;
    
    			ergebnis = subtrahieren( zahl1, zahl2 );
    
    			weiterRechnen = 1;
    			break;
    		case 3:
    			cout << "\nMultiplizieren von zwei Zahlen\n"
    				 << "\nZahl1: ";
    			cin >> zahl1;
    			cout << "\nZahl2: ";
    			cin >> zahl2;
    			cout << endl;
    
    			ergebnis = multiplizieren( zahl1, zahl2 );
    
    			weiterRechnen = 1;
    			break;
    		case 4:
    			cout << "\nDividieren von zwei Zahlen\n"
    				 << "\nZahl1: ";
    			cin >> zahl1;
    			cout << "\nZahl2: ";
    			cin >> zahl2;
    			cout << endl;
    
    			ergebnis = dividieren( zahl1, zahl2 );
    
    			weiterRechnen = 1;
    			break;
    		default:
    			cout << "\nUngueltige Eingabe!!!" << endl;
    			break;
    	}		//switchA
    
    	switch( weiterRechnen )
    	{		//switchB
    		case 1:
    			while( 1 )
    			{		//while Schleife
    
    				char awahl;
    				int wahl;
    
    				cout << "\nMit Ergebnis weiterrechnen? (j/n)"
    					 << "\nAuswahl: ";
    				cin >> awahl;
    
    				if( awahl == 'j' ) wahl = 1;
    				if( awahl == 'n' ) wahl = 0;
    
    				switch( wahl )
    				{		//switchC
    					case 0:
    						return 0;
    						break;
    					case 1:
    						cout << "\n-------------------------"
    							 << "\nErgebnis:"
    							 << "\nAddieren	=> 1"
    							 << "\nSubtrahieren	=> 2"
    							 << "\nMultiplizieren	=> 3"
    							 << "\nDividieren	=> 4"
    							 << "\nBeenden		=> 0"
    							 << "\n-------------------------"
    							 << "\nAuswahl: ";
    						cin >> wahl;
    						cout << endl;
    						switch( wahl )
    						{		//switchD
    							case 1:
    								zahl1 = ergebnis;
    								cout << "\nErgebnis Addieren\n"
    									 << "\n" << ergebnis << endl
    									 << "\nZahl: ";
    								cin >> zahl2;
    								cout << endl;
    
    								ergebnis = addieren( zahl1, zahl2);
    								break;
    							case 2:
    								zahl1 = ergebnis;
    								cout << "\nErgebnis Subtrahieren\n"
    									 << "\n" << ergebnis << endl
    									 << "\nZahl: ";
    								cin >> zahl2;
    								cout << endl;
    
    								ergebnis = subtrahieren( zahl1, zahl2);
    								break;
    							case 3:
    								zahl1 = ergebnis;
    								cout << "\nErgebnis Multiplizieren\n"
    									 << "\n" << ergebnis << endl
    									 << "\nZahl: ";
    								cin >> zahl2;
    								cout << endl;
    
    								ergebnis = multiplizieren( zahl1, zahl2);
    								break;
    							case 4:
    								zahl1 = ergebnis;
    								cout << "\nErgebnis Dividieren\n"
    									 << "\n" << ergebnis << endl
    									 << "\nZahl: ";
    								cin >> zahl2;
    								cout << endl;
    
    								ergebnis = dividieren( zahl1, zahl2);
    								break;
    							default:
    								cout << "\nUngueltige Eingabe!!!" << endl;
    								break;
    						}		//switchD
    				}		//swichC
    			}		//while schleife
    
    		case 0:
    			system("pause");
    			return 0;
    			break;
    	}		//switchB
    }
    

    grundrechnung.h

    #include <iostream>
    using namespace std;
    
    double addieren( double summand1, double summand2 );
    
    double subtrahieren( double summand1, double summand2 );
    
    double multiplizieren( double summand1, double summand2 );
    
    double dividieren( double summand1, double summand2 );
    

    grundrechnung.cpp

    #include "grundrechnung.h"
    
    double addieren( double z1, double z2 )
    {
    	double ergebnis = z1 + z2;
    
    	cout << z1 << "+" << z2 << "= " << ergebnis << endl;
    	cout << endl;
    
    	return ergebnis;
    }
    
    double subtrahieren( double z1, double z2 )
    {
    	double ergebnis = z1 - z2;
    
    	cout << z1 << "-" << z2 << "= " << ergebnis << endl;
    	cout << endl;
    
    	return ergebnis;
    }
    
    double multiplizieren( double z1, double z2 )
    {
    	double ergebnis = z1 * z2;
    
    	cout << z1 << "*" << z2 << "= " << ergebnis << endl;
    	cout << endl;
    
    	return ergebnis;
    }
    double dividieren( double z1, double z2 )
    {
    	double ergebnis = z1 / z2;
    
    	cout << z1 << "/" << z2 << "= " << ergebnis << endl;
    	cout << endl;
    
    	return ergebnis;
    }
    

    edit: main.cpp verbessert

    mfg rufrider



  • Keine GoTos verwenden. Sowas ist hässlich und unübersichtlich.

    Du hast bei den Switch-Anweisungen kein default-wert angegeben.

    Das heißt, wenn ich "123" eingebe, fällt dein Programm am Boden.

    if( auswahl == 0 ) goto ende; //Eckelhaft...
    
        switch( auswahl )
        {
       //.....
        case 4:
            cout << "\nDividieren von zwei Zahlen\n"
                 << "\nZahl1: ";
            cin >> zahl1;
            cout << "\nZahl2: ";
            cin >> zahl2;
            cout << endl;
    
            ergebnis = dividieren( zahl1, zahl2 );
            break;
        //default:
        // std::cout << "Ungültige Eingabe!!!!!";
        }
    

    Wieso du '0' auch nicht als Case-Konstante angibst verstehe ich nicht. Da bräuchtest du nicht extra eine If-Abfrage.

    Und das mit GoTo ende; Könntest du gleich so machen:

    switch( auswahl )
        {
            //..............
    
    case 0:
    return 0;
    
        }
    

    Mehr finde ich nicht bzw. bin zu faul um dein Code zu optimieren.

    Ergo: Keine GoTos verwenden,... ned schön!

    Lg Mentras



  • Ich hab die Sachen mit dem goto und mit dem if verbessert.

    Und das mit dem goto werd ich mir merken.

    mfg



  • Hier ist mal eine "50 Zeilen"-Lösung als Beispiel, wie man es auch hätte implementieren können.

    #include <iostream>
    #include <map>
    #include <string>
    #include <utility>
    
    using std::cout;
    using std::cin;
    using std::map;
    using std::string;
    using std::pair;
    using std::make_pair;
    
    double my_add(double a, double b) {return a+b;}
    double my_sub(double a, double b) {return a-b;}
    double my_mul(double a, double b) {return a*b;}
    double my_div(double a, double b) {return a/b;}
    
    typedef double binfun_t(double,double);
    
    int main()
    {
      // Operator-Zeichen --> Funktion X Beschreibung
      typedef map<string,pair<binfun_t*,string> > bomap_t;
      bomap_t binops;
      binops["+"] = make_pair(&my_add,"Addition");
      binops["-"] = make_pair(&my_sub,"Subtraktion");
      binops["*"] = make_pair(&my_mul,"Multiplikation");
      binops["/"] = make_pair(&my_div,"Division");
    
      for (;;) {
        cout << "Was willst Du machen?\n";
        for (bomap_t::iterator beg=binops.begin(),
                               end=binops.end();
             beg!=end; ++beg)
        {
          cout << beg->first << " (" << beg->second.second << ")\n";
        }
        cout << "(Abbruch ueber andere Eingabe)\n";
        string eingabe;
        if (!(cin >> eingabe)) break;
        bomap_t::iterator it = binops.find(eingabe);
        if (it==binops.end()) break;
        binfun_t* bf = it->second.first;
        double a, b;
        cout << it->second.second << " von Zwei zahlen:\n";
        if (!(cin >> a)) break;
        if (!(cin >> b)) break;
        cout << a << it->first << b << '=' << bf(a,b) << "\n\n";
      }
    }
    

    HTH,
    SP


Anmelden zum Antworten