erste gehversuche mit c++ (Taschenechner)
-
danke für den Hinweis...
muss ich mal drüber nachdenken wie ich das in den griff bekomme.also ist der wert 0 der da rauskommt nicht das ergebnis der rechenoption sondern ein false wert.
Also ich habe bis jetzt noch keine passende lösung dafür aber werde mich da schon reinfuchsen

danke MfG
-
d4rksider schrieb:
danke für den Hinweis...
muss ich mal drüber nachdenken wie ich das in den griff bekomme.also ist der wert 0 der da rauskommt nicht das ergebnis der rechenoption sondern ein false wert.
Also ich habe bis jetzt noch keine passende lösung dafür aber werde mich da schon reinfuchsen

danke MfG
eigentlich sollte das nicht mehr passieren wenn du deine variablen auf "0" initialisierst... -> wie oben schon geschrieben:
int x=0; etc...
ansonsten müsste ich jetzt nochmal schauen...
-
hmm weiß gerade nicht welche variablen du meinst ... sorry.
habe nämlich gar keine int variablen drin nur double.kannst du mir vll sagen welche funktion du meinst?
danke
-
d4rksider schrieb:
hmm weiß gerade nicht welche variablen du meinst ... sorry.
habe nämlich gar keine int variablen drin nur double.kannst du mir vll sagen welche funktion du meinst?
danke
sry ich meinte damit nich die "int" variablen sondern alle variablen die zahlen enthalten...

also auch double etc... mir gings eher ums prinzip...
-
z.B. hier...
double wurzelziehen(double a,char x) { double wurzel; if (x == 'w') { wurzel = sqrt (a); } return wurzel; }wenn if() greift ist deine variable "leer"...
normalerweise müsste das zwar dann NULL sein...
aber das ist je nach gültigkeit der variablen unterschiedlich...deswegen lieber das:
double wurzelziehen(double a,char x) { double wurzel=0; if (x == 'w') { wurzel = sqrt (a); } return wurzel; }noch besser wäre:
double wurzelziehen(double a,char x) { double wurzel=0; if (x == 'w') { wurzel = sqrt (a); }else{ cout << "fehler beim wurzel ziehen der Zahl: "<< a << endl; } return wurzel; }aber wie du es machst mit
-
alles klar

so habe nun
if ((grundrechenarten(zahl1,zahl2,zeichen)))verändert
und auch:
if (b != 0 && a != 0 )auch habe ich alle zahlen initialisiert.
es kommt leider immer noch nicht : Das Ergebnis ist:
aber werde wohl noch mal einer Nacht drüber schlafen und hoffen das ich dann nichts mehr übersehen werde.
danke für deine hilfe. Der nächte quelltex(s)t kommt bestimmt

Edit: beim tippen gerade deine Antwort gesehen:
gut zu wissen das man vieles erst initialisieren muss damit alles gut läuft.
werde ich mir merken
morgen schicke ich mal die aktualisierte version meiner kleinen rechenmaschine.bis denn
d4rksider
-
d4rksider schrieb:
alles klar

so habe nun
if ((grundrechenarten(zahl1,zahl2,zeichen)))verändert
und auch:
if (b != 0 && a != 0 )auch habe ich alle zahlen initialisiert.
es kommt leider immer noch nicht : Das Ergebnis ist:
aber werde wohl noch mal einer Nacht drüber schlafen und hoffen das ich dann nichts mehr übersehen werde.
danke für deine hilfe. Der nächte quelltex(s)t kommt bestimmt

Edit: beim tippen gerade deine Antwort gesehen:
gut zu wissen das man vieles erst initialisieren muss damit alles gut läuft.
werde ich mir merken
morgen schicke ich mal die aktualisierte version meiner kleinen rechenmaschine.bis denn
d4rksider
ok mach das ...
wenn es dir spaß macht und dich interessiert helfe ich gerne...eig passiert so etwas mit der "leeren" ausgabe wenn kein wert in der variablen steht und du sie ausgibst...
eig musst du das nicht unbedingt, in den meisten fällen macht das der compiler selbst...
jedoch bei rechenprogrammen habe ich festgestellt das es einfach fehlern vorbeugt auf 0 zu initialisieren... (bei strings,chars brauchst du so etwas z.B. gar nicht!)falls dich das interessiert mit den variablen ließ mal hier:
grundlegend:
http://www.willemer.de/informatik/cpp/var.htmgültigkeitsbereich und alles was damit zusammenhängt (z.B. wert ohne initalisierung)
http://www.willemer.de/informatik/cpp/geltungvar.htmhoff ich konnt dir paar tipps, anregungen, hilfen geben...
gerne wieder
...lg
-
moin,
hier mal meine aktualisierte version des Taschenrechners:
#include <iostream> #include <math.h> #include <string> #include <algorithm> using namespace std; bool grundrechenarten(double a, double b,char x, double &summe); bool wurzelziehen(double a,char x, double &summe); void textgrundrechenarten(double &a , double &b); void textwurzelziehen(double &a); void bedingung(double &a, double&b); int main() { double zahl1, zahl2; char zeichen; bool schleife1 {1}; double summe; do { cout << "Bitte waehlen Sie aus was Sie rechen wollen!" << endl; cout << "Um das Programm zu beenden druecken Sie n" << endl << endl; cout << "+" << endl; cout << "-" << endl; cout << "*" << endl; cout << "/" << endl << endl; cout << "erweiterte Rechenarten: " << endl; cout << "***********************************" << endl << endl; cout << "Wurzel ziehen (w)" << endl << endl; cout << "beenden (n)" << endl; cin >> zeichen; switch (zeichen) { case '+' : case '-' : case '*' : case '/' : textgrundrechenarten(zahl1, zahl2); break; case 'w' : textwurzelziehen(zahl1); break; case 'n' : cout << "Programm wird beendet!" << endl; schleife1 = 0; default : cout << "Die Eingabe ist ungültig!" << endl; break; } if (grundrechenarten(zahl1,zahl2,zeichen,summe)) { cout << "das Ergebnis ist: " << summe << endl; } else if (wurzelziehen(zahl1,zeichen,summe)) { cout << "Die Wurzel ist: " << summe << endl; } } while (schleife1); return 0; } bool grundrechenarten(double a, double b,char x, double &summe) { summe = 0; bool wahr = 1; if (x == '+') { summe = a + b; } else if (x == '-') { summe = a - b; } else if (x == '*') { summe = a * b; } else if (x == '/') { if (b != 0 || a !=0) { summe = a / b; } else { wahr = 0; } } else { cout << "Bitte geben Sie eine Zahl ein!" << endl; wahr = 0; } return wahr; } void textgrundrechenarten(double &a , double &b) { do { cout << "Geben Sie bitte Zahl 1 ein" << endl; cin >> a; bedingung(a,b); cout << "Geben Sie bitte Zahl 2 ein" << endl; cin >> b; bedingung(a,b); } while (cin.fail() || cin.bad()); } bool wurzelziehen(double a,char x, double &summe) { summe = 0; bool wahr = 1; if (x == 'w') { summe = sqrt (a); } return wahr; } void textwurzelziehen(double &a) { cout << "Geben Sie die Zahl ein, von dem Sie die Wurzel haben moechten" << endl << endl; cin >> a; } void bedingung(double &a, double &b) { if (cin.fail() || cin.bad()) { cin.clear(); cin.ignore(); cout << "Bitte geben Sie nur Zahlen ein" << endl << endl; } }habe jetzt mal die funktion mit einem bool wert erweitert und nun zeigt der Taschenrechner auch Ergebnisse an wenn eine Null rauskommt :-).
Nur noch die Erkennung mit den Buchstaben läuft nicht so wie ich das will...
-
Du musst dir ein bisschen klarer werden, was was tut und tuen soll.
Überleg dir im Kopf einfach immer ein Beispiel-Szenario und geh durch, wie dein Programm für dieses abläuft.
Im konkreten Beispiel: Deine bedingung-funktion überprüft zwar den stream auf Fehleingabe und weist den User darauf hin, aber lässt das Programm und die Eingabe dann in Ruhe weiterlaufen.
Desweiteren macht es keinen Sinn, dass diese Funktion die zwei double mitbekommt, wenn sie überhaupt nichts damit anstellt, meinst Du nicht?Zudem ist dein Programm einfach ... nicht stimmig, imho. Du selber sagst schon, dass du teilweise nicht mehr durchblickst. Und das wundert nicht, wenn du aus so einem simplem Programm so ein Wirr-Warr machst.
Reagiere in den entsprechenden case-marken mit der Ausrechnung des Ergebnises.
So wie du es momentan machst ist es erstens falsch und zweitens gezwungen allgemein, was hier einfach keinen Sinn ergibt.Ob man das Einlesen der Variabeln von der Berechnung trennen will, obwohl in den zwei unterschiedlichen Fällen eh unterschiedlicher Text ausgeben und unterschiedlich eingelesen wird ist auch zweifelhaft.
-
hier mal eine kleine änderung mit der Bedingung:
bool bedingung() { bool wahr = 0; if (cin.fail() || cin.bad()) { cin.clear(); cin.ignore(); wahr = 1; cout << "Es sind nur Zahlen gueltig!!!" << endl << endl; } return wahr; }und das einsetzen in eine andere funktion:
void textgrundrechenarten(double &a , double &b) { do { cout << "Geben Sie bitte Zahl 1 ein" << endl; cin >> a; } while (bedingung()); do { cout << "Geben Sie bitte Zahl 2 ein" << endl; cin >> b; } while (bedingung()); }scheint schon gut zu klappen...
aber wenn man z.B ddd eingibt kommt die antwort 3 mal^^
bezüglich das einlesen der Variablen in der einen funktion und das ausrechnen in der Anderen, ich dachte das wäre besser, da der text immer gleich bleibt und ich den Rechner ja noch um ein paar Rechenarten erweitern möchte...
Berichtigt mich wenn ich falsch liege
-
Du kannst das auch mit exceptinos lösen, d.h. wenn jemand durch 0 teilen will, einfach ne exception werfen. Und die Funktion dann in einen try block packen, im catch einfach die Fehlermeldung ausgeben "Sie können nicht durch 0 dividieren" oder sonst sowas.
Wenn ich das richtig verstanden habe, ist das ja das Problem in der grundrechen'Dings' Funktion.
LG