Programmierbeispiel - Taschenrechner in Klasse auslagern



  • Hallo,
    ich habe als Aufgabe ein Beispiel "Taschenrechner" bekommen, welches ich in eine Klasse auslagern muss. Meine Frage an Euch, habe ich das Beispiel korrekt gelöst oder gibt es eine bessere Variante? Die Klasse habe ich in diesem Beispiel noch nicht in eine Headerdatei- bzw eine Cpp-Datei geschrieben.

    #include <iostream>
    #include <string>
    
    using std::cout;
    using std::endl;
    using std::cin;
    using std::string;
    
    class Taschenrechner
    {
    public:
    	Taschenrechner();
    	~Taschenrechner();
    	void calc(double a, double b)
    	{
    		calculate(a, b);
    	}
    
    private:
    	void calculate(double a, double b)
    	{
    		cout << endl << "Ergebnisse:" << endl;
    		cout << a << " + " << b << " = " << a + b << endl;
    		cout << a << " - " << b << " = " << a - b << endl;
    		cout << a << " x " << b << " = " << a * b << endl;
    		if (b != 0)
    			cout << a << " / " << b << " = " << a / b << endl;
    		else
    			cout << "Durch 0 kann nicht geteilt werden!" << endl;
    	}
    };
    
    Taschenrechner::Taschenrechner()
    {
    	cout << "Das ist ein Taschenrechner!" << endl;
    	cout << "Bitte geben Sie zwei Zahlen fuer die Berechnung ein :" << endl << endl;
    }
    
    Taschenrechner::~Taschenrechner()
    {
    }
    
    int main()
    {
    	Taschenrechner rechner;
    	double zahl1, zahl2;
    	cout << "1. Zahl: "; cin >> zahl1;
    	cout << "2. Zahl: "; cin >> zahl2;
    
    	rechner.calc(zahl1, zahl2);
    
    	cin.get();
    	getchar();
    	return 0;
    }
    
    


  • Im Grunde ordentlich gelöst.

    Ein paar Stilfragen kann man noch diskutieren:

    Das hier

    using std::cout;
    using std::endl;
    using std::cin;
    using std::string;
    

    ist doch eher unüblich. Verwende im Quelltext einfach immer direkt "std::cout", "std::cin", etc.

    Darüber hinaus fällt mir noch etwas auf:

    Warum schreibst du die Ankündigung ( "dies ist ein Taschenrechner, geben Sie zwei Zahlen ein" ) im Konstruktor und die eigentlichen Aufrufe von "std::cin" dann außerhalb?

    Ich würde die Klasse rein funktional machen und alle Textausgaben/eingaben außerhalb der Klasse.


  • |  Mod

    Also ich würde nur sagen: Die Aufgabenstellung ist technisch gesehen gelöst. Da kommt das Schlüsselwort class drin vor und es hat irgendwie Ähnlichkeit mit einem Taschenrechner.

    Ansonsten ist die Aufgabe aber so absolut gar nicht ihrem Sinn nach bearbeitet worden. Die Klasse macht nichts. Sie hat keine Member, ihre einzige sinnvolle Methode könnte genausogut static sein. Diese einzige Methode hat auch keine klare Funktionalität. sie heißt calculate, aber ist Eingabe, Verarbeitung, Ausgabe, alles in einem.


  • |  Mod

    Um SeppJs Punkt zu komplementieren: Wenn eine Hausaufgabe nach einer Klasse fragt, ist der Zweck oft die verschiedenen Elemente einer Klasse zu demonstrieren, nämlich Kapselung, Membervariablen, und auch funktionale Kohäsion, naemlich eine klare individuelle Aufgabe, die deine Klasse erledigt . Momentan tut deine Klasse auch viel mehr, als ihre Beschreibung zulässt. Eine sehr treffliche Uebung waere folglich, die Ein- und Ausgabe (sprich I/O) von einer anderen Klasse erledigen zu lassen, und dem Taschenrechner lediglich das Parsen einer Eingabe zu überlassen.



  • Und wenn ich die Funktionalität komplett in die Klasse verlagere?
    Dann wäre alles unter private gekapselt.

    class Taschenrechner
    {
    public:
    	Taschenrechner();
    	~Taschenrechner();
    	void calc()
    	{
    		calculate();
    	}
    
    private:
    	void calculate()
    	{
    		cout << "Das ist ein Taschenrechner!" << endl;
    		cout << "Bitte geben Sie zwei Zahlen fuer die Berechnung ein :" << endl << endl;
    
    		double zahl1, zahl2;
    
    		cout << "1. Zahl: "; cin >> zahl1;
    		cout << "2. Zahl: "; cin >> zahl2;
    
    		cout << endl << "Ergebnisse:" << endl;
    		cout << zahl1 << " + " << zahl2 << " = " << zahl1 + zahl2 << endl;
    		cout << zahl1 << " - " << zahl2 << " = " << zahl1 - zahl2 << endl;
    		cout << zahl1 << " x " << zahl2 << " = " << zahl1 * zahl2 << endl;
    		if (zahl2 != 0)
    			cout << zahl1 << " / " << zahl2 << " = " << zahl1 / zahl2 << endl;
    		else
    			cout << "Durch 0 kann nicht geteilt werden!" << endl;
    	}
    };
    


  • Versuch doch sowas:

    class Taschenrechner
    {
    public:
          ...
          void setLeftValue( double );
          void setRightValue( double );
    
    
          double getAdditionResult() const;
          double getSubstractionResult() const;
          double getMultiplicationResult() const;
          double getDivisionResult() const;
    
    private:
         ...
    };
    

    (unvollständig)

    Dann hättest du zumindest eine einigermaßen mit Inhalt gefüllte Klasse.


  • |  Mod

    class Taschenrechner
    {
    private:
      Rechenwerk rechenwerk;
      Tastatur tastatur;
      Segmentanzeige segmentanzeige;
    public:
      // Etwas, um die Einzelkomponenten sinnvoll zusammen zu schalten
    };
    
    class Rechenwerk
    {
      // So ähnlich wie bei It0101
    };
    
    usw.
    

Anmelden zum Antworten