<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Taschenrechner_Anfänger]]></title><description><![CDATA[<p>Hallo Com!</p>
<p>Ich verzweifel. Ich hänge jetzt schon den ganzen Nachmittag und komm nicht drauf, was an diesem Code falsch sein soll.<br />
Es kommen keine Fehlermeldungen, aber egal was ich über das Konsolenfenster eingebe es kommt immer null dabei raus.<br />
Dieser Code ist aber 1 zu 1 aus dem Buch vom Stroustrup.</p>
<pre><code class="language-cpp">// Taschenrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////Globale Variablen////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

double number_value=0;
std::string string_value=&quot;&quot;;				//repräsentiert String-Wörter
int no_of_err=0;
std::map&lt;std::string, double&gt; 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&amp; s);		//Behandelt mögliche Error-Fälle

////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////Main-Funktion////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
	table[&quot;pi&quot;]=3.14159265358979;
	table[&quot;e&quot;]=2.718281828459045;
	char c;

	while(std::cin){
		get_token();
		if(current_token==END) break;
		if(current_token==PRINT) continue;
		std::cout&lt;&lt;expression(false)&lt;&lt;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(&quot;Division durch Null!&quot;);

			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 &amp;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(&quot;Es wird eine \&quot; ( \&quot; erwartet&quot;);
				get_token();					// wenn ja, dann verschlucke ')'
				return e;
			}

		default:
			return error(&quot;Primaerausdruck erwartet&quot;);
	}
}

Token_value get_token(){

	char ch;
	std::cin&gt;&gt;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&gt;&gt;number_value;
			return current_token = NAME;

		default:
			if(isalpha(ch)){
				std::cin.putback(ch);
				std::cin&gt;&gt;string_value;
				return current_token = NAME;
			}
			error(&quot;Falsches Token&quot;);
			return current_token = PRINT;
	}
}

int error(const std::string&amp; s){

	no_of_err++;
	std::cerr&lt;&lt;&quot;Fehler : &quot;&lt;&lt;s&lt;&lt;std::endl;
	return 1;
}
</code></pre>
<p>Danke im Voraus! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303241/taschenrechner_anfänger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 16:59:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303241.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 May 2012 18:38:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Taschenrechner_Anfänger on Tue, 08 May 2012 18:38:10 GMT]]></title><description><![CDATA[<p>Hallo Com!</p>
<p>Ich verzweifel. Ich hänge jetzt schon den ganzen Nachmittag und komm nicht drauf, was an diesem Code falsch sein soll.<br />
Es kommen keine Fehlermeldungen, aber egal was ich über das Konsolenfenster eingebe es kommt immer null dabei raus.<br />
Dieser Code ist aber 1 zu 1 aus dem Buch vom Stroustrup.</p>
<pre><code class="language-cpp">// Taschenrechner.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////Globale Variablen////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

double number_value=0;
std::string string_value=&quot;&quot;;				//repräsentiert String-Wörter
int no_of_err=0;
std::map&lt;std::string, double&gt; 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&amp; s);		//Behandelt mögliche Error-Fälle

////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////Main-Funktion////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
	table[&quot;pi&quot;]=3.14159265358979;
	table[&quot;e&quot;]=2.718281828459045;
	char c;

	while(std::cin){
		get_token();
		if(current_token==END) break;
		if(current_token==PRINT) continue;
		std::cout&lt;&lt;expression(false)&lt;&lt;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(&quot;Division durch Null!&quot;);

			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 &amp;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(&quot;Es wird eine \&quot; ( \&quot; erwartet&quot;);
				get_token();					// wenn ja, dann verschlucke ')'
				return e;
			}

		default:
			return error(&quot;Primaerausdruck erwartet&quot;);
	}
}

Token_value get_token(){

	char ch;
	std::cin&gt;&gt;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&gt;&gt;number_value;
			return current_token = NAME;

		default:
			if(isalpha(ch)){
				std::cin.putback(ch);
				std::cin&gt;&gt;string_value;
				return current_token = NAME;
			}
			error(&quot;Falsches Token&quot;);
			return current_token = PRINT;
	}
}

int error(const std::string&amp; s){

	no_of_err++;
	std::cerr&lt;&lt;&quot;Fehler : &quot;&lt;&lt;s&lt;&lt;std::endl;
	return 1;
}
</code></pre>
<p>Danke im Voraus! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209577</guid><dc:creator><![CDATA[Blutiger_Anfänger111]]></dc:creator><pubDate>Tue, 08 May 2012 18:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner_Anfänger on Tue, 08 May 2012 18:44:06 GMT]]></title><description><![CDATA[<p>Zeile 169</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209582</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 08 May 2012 18:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner_Anfänger on Tue, 08 May 2012 18:49:07 GMT]]></title><description><![CDATA[<p>Vielen lieben Dank Camper! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Jetzt funktionierts!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209586</guid><dc:creator><![CDATA[Blutiger_Anfänger111]]></dc:creator><pubDate>Tue, 08 May 2012 18:49:07 GMT</pubDate></item></channel></rss>