Taschenrechner
-
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.