Taschenrechner
-
Hallo,
habe hier nun auf der Arbeit meinen ersten Taschenrechner programmiert und wollte von euch mal wissen was ich eventuell noch verbessern koennte.
Ein Fehler ist mir schon aufgefallen undzwar hängt der Taschenrechner sich auf wenn man Zahlen mit einem Komma anstatt von einem Punkt eingibt fuer einen kleinen Tipp wie ich das Loesen koennte waere ich schoneinmal dankbar.Was noch zu sagen ist das ich kein Profi bin ich Programmiere erst seit kurzem und bin noch etwas ungeuebt^^
so hier der Quelltext:
#include <iostream> #include <stdio.h> #include <conio.h> #include <stdlib.h> using namespace std; double a; double b; double Ergebnis; int Auswahl; char antwort; int main() { antwort = 'j'; do{ cout<<"Ihr presoehnlicher Taschenrechner ;-)\n\n"<<endl; cout<<"Waehlen sie die gewuenschte Rechenoperation.\n\n"; cout<<"[1] Addition\n"; cout<<"[2] Subtraktion\n"; cout<<"[3] Multiplikation\n"; cout<<"[4] Division\n"; cout<<"[0] Programm Beenden\n\n"; cin>>Auswahl; system("cls"); if (Auswahl==1) { do{ cout<<"Sie haben sich fuer die Rechenoperation 'Addition' entschieden.\n\n"; cout<<"Geben sie die erste Zahl ein.\n"; cin>>a; cout<<"\n\n"; cout<<"Geben sie nun die zweite Zahl ein.\n"; cin>>b; cout<<"\n\n"; Ergebnis = a + b; cout<<"Das Ergebnis lautet: " <<Ergebnis; cout<<"\n\n"; cout<<"Moechten sie eine weitere Berechnung durchfuehren?\n\n<j/n>"; cin>>antwort; system("cls"); }while (antwort=='j'); } if (Auswahl==2) {cout<<"Sie haben sich fuer die Rechenoperation 'Subatraktion' entschieden.\n\n"; cout<<"Geben sie die erste Zahl ein.\n"; cin>>a; cout<<"\n\n"; cout<<"Geben sie nun die zweite Zahl ein.\n"; cin>>b; cout<<"\n\n"; Ergebnis = a - b; cout<<"Das Ergebnis lautet: " <<Ergebnis; cout<<"\n\n"; cout<<"Moechten sie eine weitere Berechnung durchfuehren?\n\n<j/n>"; cin>>antwort; system("cls");} if (Auswahl==3) {cout<<"Sie haben sich fuer die Rechenoperation 'Multiplikation' entschieden.\n\n"; cout<<"Geben sie die erste Zahl ein.\n"; cin>>a; cout<<"\n\n"; cout<<"Geben sie nun die zweite Zahl ein.\n"; cin>>b; cout<<"\n\n"; Ergebnis = a * b; cout<<"Das Ergebnis lautet: " <<Ergebnis; cout<<"\n\n"; cout<<"Moechten sie eine weitere Berechnung durchfuehren?\n\n<j/n>"; cin>>antwort; system("cls");} if (Auswahl==4) {cout<<"Sie haben sich fuer die Rechenoperation 'Subatraktion' entschieden.\n\n"; cout<<"Geben sie die erste Zahl ein.\n"; cin>>a; cout<<"\n\n"; cout<<"Geben sie nun die zweite Zahl ein.\n"; cin>>b; cout<<"\n\n"; Ergebnis = a / b; cout<<"Das Ergebnis lautet: " <<Ergebnis; cout<<"\n\n"; cout<<"Moechten sie eine weitere Berechnung durchfuehren?\n\n<j/n>"; cin>>antwort; system("cls");} if (Auswahl==0) {return 0; } }while (antwort!='j'); return 0; }
-
das mit dem Koma wirst du nicht verhindern können, weil die Syntax so definiert ist.
Es sei den du liest die Zahlen als String ein, dann kannst du auf die Eingaben reagieren.
- Für was ist die innere do-while-schleife bei der Addition?
- Die Zahlen würde ich einmal vorneweg einlesen und nicht in jeder if-Abfrage
- genauso die Ergebnisausgabe einmal ganz ans Ende
Somit hast du in den If-Abfrage nur noch die Berechnungen. Die würde ich dann in eine Switch-Case Abfrage bringen.
-
Und als nächstes lernen wir die switch()-Anweisung und die Aufgabe von Funktionen kennen

Das Problem mit Komma vs. Punkt hängt mit der Werte-Interpretation zusammen - die Amerikaner verwenden den Punkt als Dezimaltrennung (und das Komma zur Grupperierung von Tausendern). Das heißt, beim Komma bleibt die Eingabe stehen und kann es nicht mehr interpretieren.
Die einfachste Lösung ist es, den Rest der jeweiligen Eingabezeile mit ignore() zu entsorgen - allerdings wird dann z.B. 1,5 als 1 verarbeitet. Besser ist es, die komplette Zeile mit getline() einzulesen, eventuelle Kommas zu berichtigen und sie anschließend in eine Zahl umzuwandeln.
-
... wobei atof() dein Freund ist (nach einer etwaigen Umwandlung der Punktion).
-
Schonmal danke für die Hilfen werde mich dann mal da durcharbeiten

Wie gesagt bin Neuling hier und muss noch vielviel Lernen.
Und zum Schluss nocheinmal ein Danke an euch

-
das ist zwar compilerspezifisch, aber dennoch eine standardlösung für das punkt-problem:
#include <locale> #include <iostream> //... std::cin.imbue (std::locale("de_DE"));je nachdem musst du vielleicht std::locale("german") o.ä. verwenden.
für cout natürlich analog angewandt.
-
Bin mir nicht ganz sicher, aber ich glaube hiemit könnte man dein Komma-punkt-prob. lösen:
[cpp]string a, b; // statt "double a, b" // ... (cin-Abfrage) for (int i; i<a.length(); ++i) // sollte aus einem eingegebenen ',' { // ein '.' machen (lässt sich zur Ausgabe ggf. if (a[i] == ',') // wieder umdrehen) { a[i] = '.'; } } // gleiches mit dem String 'b' machen // anschließend kann die Berechnung weitergehen [/cpp]Damit könntest du dann Kommas statt Punkte in dein prog. eingeben.
Möglicherweise könnte man dann auch eine Typenumwandlung von String auf double vornehmen.
ansonsten würde ich noch vorschlagen, falls du weißt was Funktionen sind
, dein prog. mittels diesen,
übersichtlicher zu schreiben (ist bei großen progs. sehr wichtig, also: gewöhns dir gleich an!
).
-
Du solltest i wenigstens noch initialisieren.
Du könntest dir auch mal string::replace anschauen.
-
pseudo
// replace anything by anything void Replace(std::string &str, std::string A, std::string B) { std::size_t pos = 0; while((pos = str.find(A)) <= str.length()) str.replace(pos, A.length(), B.c_str(), B.length()); } std::string MyString = _T("12,23"); // later on Replace(MyString, _T(","), _T(".")); // 12.23 // and back Replace(MyString, _T("."), _T(",")); // 12,23 // and any other Replace(MyString, _T("12"), _T("13")); // 13,23 . . .
-
sry, hab ich wohl nen Fehler gemacht
