Calculator
-
Hi
Ich bin noch(wie mein Name auch so schön zum Ausdruck bringt...^^) relativ unerfahren in der Materie und hab heute versucht meine 1. Klasse zu schreiben.
Allgemeine(konstruktive) Kritik zum Aufbau usw ist audrüklich erwünscht....
header Datei:
#ifndef _CALCULATOR_ #define _CALCULATOR_ #include <iostream> using namespace std; class calculator { public: double init(double, double, int); void print(void); private: double result, n1, n2; double addition(double, double); double subtract(double, double); double multiply(double, double); double divide(double, double); } #endif //_CALCULATOR_Funktionen:
#include "calculator.h" #include <iostream> using namespace std; double calculator::init(double x, double y, int operation) { calculator::n1=x; calculator::n2=y; switch(operation) { case 1: addition(double &n1, double &n2); break; case 2: subtract((double &n1, double &n2;) break; case 3: multiply((double &n1, double &n2;) break; case 4: divide((double &n1, double &n2;) break; default: break; } } void calculator::print(void) { cout<<result<<endl; } //jetzt die Rechenoperationen selbst double calculator::addition(double &calculator::n1, double &calculator::n2) { calculator::result=n1+n2; } double calculator::subtract(double &calculator::n1, double &calculator::n2) { calculator::result=n1-n2; } double calculator::multiply(double &calculator::n1, double &calculator::n2) { calculator::result=n1*n2; } double calculator::divide(double &calculator::n1, double &calculator::n2) { calculator::result=n1/n2; }main:
int main() { cout<<"Calculator 0.1 launched"<<endl; cout<<"Zum beenden beliebigen Buchstaben eingeben."<<endl; cout<<"Bitte geben sie die beiden Operanden und die Rechenart(1 fuer +,2 fuer -,3 fuer *, 4 fuer //) ein."<<endl<<"Bestätigen sie die Eingabe jeweils mit [ENTER]"<<endl; double a, b; int c; while(cin>>a>>b>>c) { if((c==1)||(c==2)||(c==3)||(c==4)) { calculator::init(a, b, c); calculator::print(); } else { cout<<"Ungueltige Eingabe!"<<endl; continue; } } return 0; }beginner
-
Sieht ja schon gut aus, aber ein paar Anmerkungen noch:
- niemals "using namespace ..." in Header-Dateien! (bei dir auch nicht nötig, da du keine std-Datentypen benutzt)
- pack den include<iostream> nur dort hin, wo du ihn auch benutzt (bei dir also in main.cpp)
- gib den Funktionsparametern in den Header-Dateien auch Namen (z.B. init(double x, double y, int operation) )
- innerhalb deiner Methoden (Klassenfunktionen) brauchst du den Klassennamen nicht zu schreiben (bei dir z.B. statt "calculator::n1 = x" einfach "n1 = x" )- dein Compiler müßte aber noch Fehler melden:
- Funktionen werden nur mit Parametern(ohne Datentypen aufgerufen), z.B in init: addition(n1, n2);
- Funktionsdefinitionen sind falsch:
double calculator::addition(double &n1, double &n2)
{
...
}Aufgabe: benutze enums für die Operationen!
Viel Spaß noch beim C++ lernen!
-
...und kein calculator-objekt in der main. das funzt doch niemals so
-
Wie net schon richtig bemerkt hat, erzeugst du kein Objekt deiner Klasse in der main. Um das zu können brauchst du in der Klasse einen Konstruktor. Dieser ersetzt dann eigentlich deine calculator::init. In der main unten siehst du den Aufruf des Konstruktors, der ein Klassenobjekt mit dem Namen berechnung erzeugt.
Dann brauchst du eigentlich in deiner Klasse keine Variable result, weil du ja mit deinen Funktionen double addition(double, double),double subtract(double, double), double multiply(double, double) und double divide(double, double) ja schon Rückgabewerte vorsiehst.
Ich hab mal ne kleine Datei geschrieben, wo ich ein paar Änderungen vorgenommen hab. Ich hab sie aber noch nicht ausprobiert, also alles ohne Gewähr.#include "calculator.h" #include <iostream> using namespace std; calculator::calculator(double a, double b, int c):op1_(a),op2_(b),rechenart_(c) { switch(getrechenart()) { case 1: cout << addition(getopeins(),getopzwei()); break; case 2: cout << subtract(getopeins(),getopzwei()); break; case 3: cout << multiply(getopeins(),getopzwei()); break; case 4: cout << divide(getopeins(),getopzwei()); break; } } double calculator::addition(const double& n1,const double& n2) { return (n1+n2); } double calculator::subtract(const double& n1,const double& n2) { return (n1-n2); } double calculator::multiply(const double& n1,const double& n2) { return (n1*n2); } double calculator::divide(const double& n1,const double& n2) { return (n1/n2); } int calculator::getrechenart() const { return rechenart_; } double calculator::getopeins() const { return op1_; } double calculator::getopzwei() const { return op2_; } int main() { cout<<"Calculator 0.1 launched"<<endl; cout<<"Zum beenden beliebigen Buchstaben eingeben."<<endl; cout<<"Bitte geben sie die beiden Operanden und die Rechenart(1 für +, 2 für -, 3 für *,4 für //) ein."<<endl<<"Bestätigen sie die Eingabe jeweils mit [ENTER]"<<endl; double a, b; int c; while(cin>>a>>b>>c) { if((c==1)||(c==2)||(c==3)||(c==4)) { calculator berechnung(a, b, c); } else { cout<<"Ungueltige Eingabe!"<<endl; continue; } } return 0; }Hier noch eine von mir ein wenig abgeänderte header-Datei. Die größte Änderung ist eigentlich, dass ich mit Memberfunktionen die Klassenvariablen auslese.
#ifndef _CALCULATOR_ #define _CALCULATOR_ class calculator { public: calculator(double, double, int); double addition(const double&,const double&); double subtract(const double&,const double&); double multiply(const double&,const double&); double divide(const double&,const double&); int getrechenart() const; double getopeins() const; double getopzwei() const; private: double op1_, op2_; int rechenart_; } #endif //_CALCULATOR_Ich hab den Code noch nicht ausprobiert, es können also durchaus noch Fehler auftreten.
MfG JS