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! 🙂


  • Mod

    Zeile 169



  • Vielen lieben Dank Camper! 👍

    Jetzt funktionierts!


Anmelden zum Antworten