Taschenrechner_Anfänger
-
Hallo Com!
Ich verzweifel. Ich hänge jetzt schon den ganzen Nachmittag und komm nicht drauf, was an diesem Code falsch sein soll.
Es kommen keine Fehlermeldungen, aber egal was ich über das Konsolenfenster eingebe es kommt immer null dabei raus.
Dieser Code ist aber 1 zu 1 aus dem Buch vom Stroustrup.// Taschenrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include <iostream> #include <string> #include <map> #include <cctype> //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////Globale Variablen//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// double number_value=0; std::string string_value=""; //repräsentiert String-Wörter int no_of_err=0; std::map<std::string, double> table; //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////Auswahl der verschiedenen Tokens///////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MULTIPLY='*', DIVIDE='/', PRINT=';', ASSIGN='=', LBRACK='(', RBRACK=')' }; Token_value current_token= PRINT; //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////Funktionsprototypen////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// double expression (bool get); //Addition und Subtraktion double term (bool get); //Multiplikation und Division double primary (bool get); //Behandelt primäre Ausdrücke Token_value get_token (); //Eingabefunktion (Die wird Hardcore) int error (const std::string& s); //Behandelt mögliche Error-Fälle //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////Main-Funktion//////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// int main() { table["pi"]=3.14159265358979; table["e"]=2.718281828459045; char c; while(std::cin){ get_token(); if(current_token==END) break; if(current_token==PRINT) continue; std::cout<<expression(false)<<std::endl; } return no_of_err; } //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////Funktionsdefinitionen//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// double expression(bool get){ double left =term(get); for(;;) switch(current_token){ case PLUS: left += term(true); break; case MINUS: left -= term(true); break; default: return left; } } double term(bool get){ double left = primary(get); for(;;) switch(current_token){ case MULTIPLY: left *= primary(true); break; case DIVIDE: if(double d = primary(true)){ left /= d; break; } return error("Division durch Null!"); default: return left; } } double primary(bool get){ if(get) get_token(); switch(current_token){ case NUMBER: //erlaubt Gleitkommadarstellung z.B. 1.32e+12 { double v = number_value; get_token(); return v; } case NAME: { double &v = table[string_value]; if(get_token()==ASSIGN) v = expression(true); return v; } case MINUS: return -primary(true); //unäres Vorzeichen case LBRACK: { double e = expression(true); if(current_token != RBRACK) return error("Es wird eine \" ( \" erwartet"); get_token(); // wenn ja, dann verschlucke ')' return e; } default: return error("Primaerausdruck erwartet"); } } Token_value get_token(){ char ch; std::cin>>ch; switch(ch){ case 0: return current_token=END; case ';': case '*': case '/': case '-': case '+': case '(': case ')': case '=': return current_token = Token_value(ch); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': std::cin.putback(ch); std::cin>>number_value; return current_token = NAME; default: if(isalpha(ch)){ std::cin.putback(ch); std::cin>>string_value; return current_token = NAME; } error("Falsches Token"); return current_token = PRINT; } } int error(const std::string& s){ no_of_err++; std::cerr<<"Fehler : "<<s<<std::endl; return 1; }Danke im Voraus!

-
Zeile 169
-
Vielen lieben Dank Camper!

Jetzt funktionierts!