Taschenrechner
-
ich habe eine Aufgabe
Aufgabenbeschreibung
soll ein einfacher Taschenrechner simuliert werden, der die vier Grundrechenarten {+,-,*, /} beherrscht. Die Eingabe der Daten erfolgt über eine ASCII Datei mit der Endung “.txt”, die der Rechner einliest. Nach der Eingabe berechnet der Taschenrechner die Formel, die ihm als ASCIIText übermittelt wurde. Für die Auswertung und Berechnung der Formel benutzt der Taschenrechner einen Stack. Auf Wunsch kann das programm jeweils den aktuellen Stackinhalt waehrend des Rechenvorgangs auf dem Bildschirm ausgeben. Nachdem die Formel berechnet wurde,wird der gesamte Eingabetext sowie das Ergebnis auf dem Bildschirm ausgegeben. Trat ein Fehler in der
Eingabe auf, dann wird der Fehler angezeigt.Beispiel
Eingabe: (5 + 4) * 7wer kann mir helfen das zu realisieren
-
Stroustrup "Die C++ Programmiersprache", da ist ein Rechner drinne, viel Spaß ...
-
Ich komme nicht durch weil bei Stroustrup C++
kann mann nur von Taste eingeben
ich wurde gern von Datei rechnen .Jems
-
Jems schrieb:
kann mann nur von Taste eingeben
ich wurde gern von Datei rechnen .
JemsMach's erst mal mit cin. Es sollte kein Problem sein, das hinterher auf einen anderen Eingabestream umzustellen.
-
ich habe schon gemacht und ich klapp nicht weiter
Jems
-
Jems schrieb:
ich habe schon gemacht und ich klapp nicht weiter
Du sollst auch nicht klappen.
Wo genau klemmt's denn? Fehlermeldung?
-
MFK schrieb:
Jems schrieb:
ich habe schon gemacht und ich klapp nicht weiter
Du sollst auch nicht klappen.
-
Was genau klappt denn nicht? Für die Umstellung von cin auf File-Eingabe mußt du legiglich die verwendeten Streams umstellen:
ifstream fin("Input.txt"); // anschließend alle Vorkommen von cin ändern nach fin // eventuell solltest du die Eingaben auf den Bildschirm reflektieren
-
das ist mein programm
und geht bei mir nicht wenn ich von datein rechnen will#include <iostream> // Ein-/Ausgabe #include <string> // Strings #include <map> // map #include <cctype> // isalpha() usw. #include <sstream> using namespace std; enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; Token_value curr_tok = PRINT; double term(bool); double prim(bool); double error(const string& s); Token_value get_token(void); double expr(bool get) /* Addieren und Substrahieren*/ { double left = term(get); for (;;) /* "'forver', siehe unten*/ switch (curr_tok) { case PLUS: left += term(true); break; case MINUS: left -= term(true); break; default: return left; } } double term(bool get) /*Multipliziere und dividiere */ { double left = prim(get); for (;;) switch (curr_tok) { case MUL: left *= prim(true); break; case DIV: if (double d = prim(true)) { left /= d; break; } return error("Division durch 0."); default: return left; } } double number_value; string string_value; double expr(bool); map<string, double> table; double prim(bool get) /* behandelt Primaries*/ { if (get) get_token(); switch (curr_tok) { case NUMBER: /* Gleitkommakonstante*/ { double v = number_value; get_token(); return v; } case NAME: { double& v = table[string_value]; if (get_token() == ASSIGN) v = expr(true); return v; } case MINUS: /* Einstelliges Minus */ return -prim(true); case LP: { double e = expr(true); if (curr_tok != RP) return error(") erwartet"); get_token(); /*Verschlucke ')'*/ return e; } default: return error("primary erwartet"); } } Token_value get_token() { char ch; do { /* Überspringe Whitespaces außer '\n' */ if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case 0: // case ':': return curr_tok=END; case ';': case '\n': return curr_tok=PRINT; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok=Token_value(ch); // case ':': // return curr_tok=END; //:end oder:exit um das Prog. zu verlassen */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER; default: /* NAME, NAME=, oder Fehler */ if (isalpha(ch)) { string_value = ch; while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch); cin.putback(ch); return curr_tok=NAME; } error("Falsches Token"); return curr_tok=PRINT; } } int no_of_errors; double error(const string& s) { no_of_errors++; cerr << "Fehler: " << s << '\n'; return 1; } int main() { table["pi"] = 3.1415926535897932385; /*Vordefinierte Namen einfügen */ table["e"] = 2.7182818284590542354; cout<<"forme eingeben \n"<<"\n"; while (cin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr(false) << "\n"; } return no_of_errors; }
-
Erstmal kannst du die Funktionen get_token() und error() auch als void deklarieren - ich sehe zumindest keine Stelle, an der der Rückgabewert von Interesse ist (dann mußt du die Rückgabe in get_token() jedoch ändern zu "curr_tok=xxx;return;").
Und das zweite: Was funktioniert nicht, wenn du von Datei rechnen willst? "geht nicht" ist eine miserable Fehlerbeschreibung.
-
Hat jemand gegen geld ein Lösung ?
ich bin Dümmy
-
Eine Lösung wofür? Du hast noch nicht einmal erklärt, wo dein Problem ist.
PS: Versuch mal folgendes:
#include <fstream> ifstream fin; // alle Taschenrechner-Funktionen übernehmen // in get_token() ersetze cin durch fin int main(int argc,char*argv[]); { if(argc>=1) fin.open(argv[1]); else exit(0); while(fin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr(false) << "\n"; } return no_of_errors; }
-
error
2 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp 'ifstream' is used as a type, but is not defined as a type.
8 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `{' token18 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `<<' token
-
Jems schrieb:
2 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp 'ifstream' is used as a type, but is not defined as a type.
*grübelt* *denkt etwas länger nach* ups, da fehlt wohl ein using dazwischen. (aber du solltest auch etwas nachdenken, nur abschreiben kann ja jeder)
Jems schrieb:
8 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `{' token
Da steht doch ganz klar, wo der Fehler liegt - vor dem "{", laso höchstwahrscheinlich am Ende der vorigen Zeile.
Jems schrieb:
18 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `<<' token
Hast du den Schnipsel so compiliert oder in deinen vorhandenen Quelltext eingearbeitet?
-
wie kann ich 1 programm auf 2 programm einfugen ?
#include <fstream> ifstream fin; // alle Taschenrechner-Funktionen übernehmen // in get_token() ersetze cin durch fin int main(int argc,char*argv[]); { if(argc>=1) fin.open(argv[1]); else exit(0); while(fin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr(false) << "\n"; } return no_of_errors; }
#include <iostream> // Ein-/Ausgabe #include <string> // Strings #include <map> // map #include <cctype> // isalpha() usw. #include <sstream> #include <fstream> ifstream fin; using namespace std; enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; Token_value curr_tok = PRINT; double term(bool); double prim(bool); double error(const string& s); Token_value get_token(void); double expr(bool get) /* Addieren und Substrahieren*/ { double left = term(get); for (;;) /* "'forver', siehe unten*/ switch (curr_tok) { case PLUS: left += term(true); break; case MINUS: left -= term(true); break; default: return left; } } double term(bool get) /*Multipliziere und dividiere */ { double left = prim(get); for (;;) switch (curr_tok) { case MUL: left *= prim(true); break; case DIV: if (double d = prim(true)) { left /= d; break; } return error("Division durch 0."); default: return left; } } double number_value; string string_value; double expr(bool); map<string, double> table; double prim(bool get) /* behandelt Primaries*/ { if (get) get_token(); switch (curr_tok) { case NUMBER: /* Gleitkommakonstante*/ { double v = number_value; get_token(); return v; } case NAME: { double& v = table[string_value]; if (get_token() == ASSIGN) v = expr(true); return v; } case MINUS: /* Einstelliges Minus */ return -prim(true); case LP: { double e = expr(true); if (curr_tok != RP) return error(") erwartet"); get_token(); /*Verschlucke ')'*/ return e; } default: return error("primary erwartet"); } } Token_value get_token() { char ch; do { /* Überspringe Whitespaces außer '\n' */ if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case 0: // case ':': return curr_tok=END; case ';': case '\n': return curr_tok=PRINT; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok=Token_value(ch); // case ':': // return curr_tok=END; //:end oder:exit um das Prog. zu verlassen */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER; default: /* NAME, NAME=, oder Fehler */ if (isalpha(ch)) { string_value = ch; while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch); cin.putback(ch); return curr_tok=NAME; } error("Falsches Token"); return curr_tok=PRINT; } } int no_of_errors; double error(const string& s) { no_of_errors++; cerr << "Fehler: " << s << '\n'; return 1; } // alle Taschenrechner-Funktionen übernehmen // in get_token() ersetze cin durch fin int main(int argc,char*argv[]); { if(argc>=1) fin.open(argv[1]); else exit(0); while(fin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr(false) << "\n"; } return no_of_errors; }
-
Jems schrieb:
wie kann ich 1 programm auf 2 programm einfugen ?
Häh?
#include <iostream> // Ein-/Ausgabe #include <string> // Strings #include <map> // map #include <cctype> // isalpha() usw. #include <sstream> #include <fstream> ifstream fin; using namespace std;
die letzten beiden Zeilen würde ich ja andersrum schreiben
int main(int argc,char*argv[]); { //... }
Lies dir die Fehlermeldungen deines Compilers durch, dann sollte es funktionieren.
-
Lern erstmal Deutsch.