<?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[(nochmal) Taschenrechner Stroustrup Kapitel 7]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich geh vielen sicher auf den Wecker, aber trotzdem brauch ich nochmal Hilfe. Ich bin immer noch am Taschenrechner von Stroustrup, diesmal Kapitel 7.</p>
<p>Die Grundrechenarten +-*/ und ! sind drin und funktionieren einwandfrei (soweit ich das getest habe). Negative Zahlen klappen ebenfalls. Im letzten Schritt wollte ich die Möglichkeit einbauen, dass der Nutzer eigene Variablen definieren und damit rechnen kann.</p>
<p>Mein Code entspricht dem aus dem Stroustrup-Buch und trotzdem klappt es nicht. Einzig die Fakultätsberechnung ist hier aus dem Forum. Daher habe ich sie auskommentiert. War aber leider nicht die Fehlerursache.</p>
<p>Beim Debuggen habe ich bemerkt, dass die Variablen gar nicht erstellt werden - soll heißen, die dort im Code gesetzten Haltepunkte werden gar nicht angetastet. Irgendwie fehlt wohl eine Schnittstelle.</p>
<pre><code>#include &quot;std_lib_facilities.h&quot;

struct Token{
	char kind;
	double value;
	string name;
	Token(char ch):kind(ch),value(0){}
	Token(char ch,double val):kind(ch),value(val){}
	Token(char ch, string n):kind(ch),name(n){}
};

class Token_stream {
public:
   Token_stream();			// erstelle einen Token_stream, der aus cin liest 
   Token get();				// lies ein Token ein (get() ist anderswo definiert)
   void putback(Token t);	// lege ein Token zurück 
   void ignore(char c);
private:
   bool full;				// befindet sich ein Token im Puffer?
   Token buffer;			// hier legen wir ein Token ab, das mit putback() 
							// zurückgestellt wurde
};

//Erstellung eines Name-Wert-Paares zur Speicherung von konstanten Werten,
//die der Nutzer selbst eingeben kann
class Variable{
public:
	string name;
	double value;

	Variable(string n, double val):name(n),value(val){}
};

//Definition eines Vektors für Variablen
vector&lt;Variable&gt; var_table; //Typ: Variable (siehe Definition class Variable)

//Definition der Konstanten
const char name = 'a';
const char let = 'L';
const string declkey = &quot;let&quot;;

const char number = '8'; // t.kind == number bedeutet, dass t ein Zahl-Token ist
const char quit   = 'q'; // t.kind == quit bedeutet, dass t ein Verlassen-Token ist
const char print  = ';'; // Ausgeben-Token
const char prompt = '&gt;'; // Eingabeauforderung
const char result = '='; // Ergebnisanzeige

// Der Konstruktor setzt full auf false, um anzuzeigen, dass der Puffer leer ist:
Token_stream::Token_stream()
:full(false), buffer(0)    // kein Token im Puffer
{
}

// Die Memberfunktion putback() stellt ihr Argument zurück in den Puffer von Token_stream:
void Token_stream::putback(Token t)
{
    if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
    buffer = t;       // kopiere t in den Puffer
    full = true;      // Puffer ist jetzt voll
}

Token Token_stream::get()
{
    if (full) {       // gibt es bereits ein fertiges Token?
        // Token aus dem Puffer entfernen
        full=false;
        return buffer;
    } 

    char ch;
    cin &gt;&gt; ch;				// beachten Sie, dass &gt;&gt; Whitespace-Zeichen wie 
							// Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt

    switch (ch) {
    case print:				// für &quot;Ausgeben&quot;
    case quit:				// für &quot;Verlassen&quot;
	case let:
	case name:
	case '(':	
	case ')': 
	case '+':
	case '-': 
	case '*':
	case '/': 
	case '{': 
	case '}': 
	case '!': 
	case '%':
	case '=':
        return Token(ch);	// jedes Zeichen repräsentiert sich selbst 
    case '.':				// Gleitkommliteral kann mit einem Punkt . beginnen
    case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);			 // lege die Ziffer zurück in den Eingabestream
            double val;
            cin &gt;&gt; val;					 // lies eine Gleitkommazahl 
            return Token(number,val);   
        }
    default:
		if(isalpha(ch))
		{
			cin.putback(ch);
			string s;
			s += ch;

			while(cin.get(ch) &amp;&amp; (isalpha(ch) || isdigit(ch)))
				s += ch;
			cin.putback(ch);

			if(s == declkey)
				return Token(let);		//Schlüsselwort für Deklarationen
			return Token(name,s);
		}
        error(&quot;Ungueltiges Token&quot;);
    }
}

void Token_stream::ignore(char c)
			// c repräsentiert eine gesuchte Token-Kategorie
{
	//erster Blick in den Puffer
	if (full &amp;&amp; c == buffer.kind)
	{
		full = false;
		return;
	}
	full = false;

	//Eingabe durchsuchen
	char ch = 0;
	while(cin &gt;&gt; ch)
		if(ch == c) return;
}

//------------------------------------------------------------------------------

double fak (double val)	 //berechnet rekursiv die Fakultät einer Zahl
						 // rekursiv: Die Funktion ruft sich selbst auf
{
	if (val &gt; 1) 
	{
		return fak(val-1) * val;
    }
	else
		return 1;
}

//------------------------------------------------------------------------------

Token_stream ts;        // stellt get() und putback() zur Verfügung  

//------------------------------------------------------------------------------

double expression();    // Deklaration, damit primary() expression() aufrufen kann

//------------------------------------------------------------------------------

double factorial();		// Deklaration, damit term() factorial() aufrufen kann

//------------------------------------------------------------------------------

bool is_declared(string var) // gibt es bereits var?
{
	for(int i=0;i&lt;var_table.size(); i++)
		if(var_table[i].name == var) return true;
	return false;
}

double define_name(string var, double val) // (var, val) hinzufügen
{
	if(is_declared(var)) error(var,&quot;doppelt deklariert&quot;);
	var_table.push_back(Variable(var,val));
	return val;
}

//------------------------------------------------------------------------------

// behandelt Zahlen und Klammern 
double primary()
{
    Token t = ts.get();

    switch (t.kind) {
	case '{': 
		 {    
            double d = expression();
            t = ts.get();
			if (t.kind != '}') error(&quot;'}' expected&quot;);
            return d;
        }
    case '(':    // behandle'(' Ausdruck ')'
        {    
            double d = expression();
            t = ts.get();
            if (t.kind != ')') error(&quot;')' expected&quot;);
            return d;
        }
	case number:     
		return t.value; // liefert den Zahlenwert zurück
	case '-':
		return -primary();
	case '+':
		return primary();
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}

//------------------------------------------------------------------------------

// behandelt *, /
double term()
{
    double left = primary();
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
			break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
		case '%':
			{
				double d = primary();
				int i1 = int(left);
				if(i1 != left) error(&quot;Linker Operand von Modulo % ist keine ganze Zahl&quot;);

				int i2 = int(d);
				if(i2 != d) error(&quot;Rechter Operand von Modulo % ist keine ganze Zahl&quot;);
				if(i2 == 0) error(&quot;Divison durch Null&quot;);
				left = i1%i2;
				t = ts.get();
				break;
			}
		default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;
        }
    }
}

//------------------------------------------------------------------------------

// behandelt + und –
double expression()
{
    double left = term();       // liest einen Token ein und wertet ihn aus
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {    
        switch(t.kind) {
        case '+':
            left += term();    // werte Term aus und addiere
            t = ts.get();
            break;
        case '-':
            left -= term();    // werte Term aus und subtrahiere
            t = ts.get();
            break;
        default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;       // keine weiteren + oder –; Antwort zurückliefern
        }
    }
}

//------------------------------------------------------------------------------

//behandelt die Fakultät als Faktor!
// jetzt alle primary() durch factorial() ersetzen
/*double factorial()
{
    double n = primary(); // Hier rekursiv weiter zu primary

    Token t = ts.get();

    while(t.kind == '!') 
	{
        n = fak(n);
		t = ts.get();
    }

    ts.putback(t);

    return n;
}*/

//--------------------------------------------------------------------------------
//Deklaration: Stellt sicher, dass auf let ein Name folgt, dann =, dann Ausdruck

double declaration()
	//Voraussetzung: let gesehen, nun Behandlung name = ausdruck
	//deklariere eine Variable namens &quot;name&quot; mit dem Anfangswert &quot;ausdruck&quot;
{
	Token t = ts.get();
	if(t.kind!=name) 
		error(&quot;Die Deklaration erwartet einen Namen.&quot;);
	string var_name = t.name;

	Token t2 = ts.get();
	if(t2.kind != '=') 
		error(&quot;Das = fehlt in der Deklaration von&quot;, var_name);

	double d = expression();
	define_name(var_name,d);
	return d;

}

//-----------------------------------------------------------------------
//Anweisung behandelt Ausdrücke und Deklarationen

double statement()
{
	Token t = ts.get();
	switch(t.kind)
	{
	case let:
		return declaration();
	default:
		ts.putback(t);
	return expression();
	}
}

//---------------------------------------------------------------------------------
//Aufräumen nach Tippfehler und Neustart
void clean_up_mess()
{
	ts.ignore(print);
}

//---------------------------------------------------------------------------------
//Durchsucht den Vektor var_table nach Namen und gibt die zugehörigen Werte zurück
double get_value(string s)
{
	for(int i =0 ; i &lt; var_table.size() ; i++)
	{
		if(var_table[i].name == s)
			return var_table[i].value;
		error(&quot;get: Nicht definierte Variable&quot;,s);
	}
}

//------------------------------------------------------------------------------
//Weist Variablen im Vektor var_table einen (neuen) Wert zu
void set_value(string s, double d)
{
	for(int i=0; i &lt; var_table.size(); i++)
	{
		if(var_table[i].name == s)
		{
			var_table[i].value = d;
			return;
		}

		error(&quot;set: Nicht definierte Variable&quot;,s);
	}

}

//-----------------------------------------------------------------------------
//Schleife zur Auswertung der Ausdrücke

void calculate()
{
	while (cin) 
	try{
		cout &lt;&lt; prompt;
        Token t = ts.get();
		while(t.kind == print) t = ts.get();
		if (t.kind == quit) return;

		ts.putback(t);
        cout &lt;&lt; result &lt;&lt; statement() &lt;&lt; endl;
    }
	catch (exception&amp; e) 
	{
    cerr &lt;&lt; &quot;Fehler: &quot; &lt;&lt; e.what() &lt;&lt; '\n'; 
			//keep_window_open();
	clean_up_mess();
	}
}

//-----------------------------------------------------------------------------

int main()
try
{    
	calculate();

	keep_window_open();
	return 0;
}
catch (...) {
    cerr &lt;&lt; &quot;Hoppla: unbekannte Ausnahme!\n&quot;; 
			// keep_window_open();
	cout &lt;&lt; &quot;Um das Fenster zu schliessen ~ eingeben.\n&quot;;
	char ch;
	while(cin &gt;&gt; ch)
		if(ch == '~') return 2;
    return 2;
}
</code></pre>
<p>Ich sitze echt schon 2 Tage dran und finde es einfach nicht. Ist auch etwas viel und damit unübersichtlich geworden. Falls jemand helfen kann, wär ich wirklich dankbar. Ein Hinweis genügt mir hoffentlich schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311218/nochmal-taschenrechner-stroustrup-kapitel-7</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 16:43:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311218.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Nov 2012 20:16:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (nochmal) Taschenrechner Stroustrup Kapitel 7 on Thu, 29 Nov 2012 20:16:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich geh vielen sicher auf den Wecker, aber trotzdem brauch ich nochmal Hilfe. Ich bin immer noch am Taschenrechner von Stroustrup, diesmal Kapitel 7.</p>
<p>Die Grundrechenarten +-*/ und ! sind drin und funktionieren einwandfrei (soweit ich das getest habe). Negative Zahlen klappen ebenfalls. Im letzten Schritt wollte ich die Möglichkeit einbauen, dass der Nutzer eigene Variablen definieren und damit rechnen kann.</p>
<p>Mein Code entspricht dem aus dem Stroustrup-Buch und trotzdem klappt es nicht. Einzig die Fakultätsberechnung ist hier aus dem Forum. Daher habe ich sie auskommentiert. War aber leider nicht die Fehlerursache.</p>
<p>Beim Debuggen habe ich bemerkt, dass die Variablen gar nicht erstellt werden - soll heißen, die dort im Code gesetzten Haltepunkte werden gar nicht angetastet. Irgendwie fehlt wohl eine Schnittstelle.</p>
<pre><code>#include &quot;std_lib_facilities.h&quot;

struct Token{
	char kind;
	double value;
	string name;
	Token(char ch):kind(ch),value(0){}
	Token(char ch,double val):kind(ch),value(val){}
	Token(char ch, string n):kind(ch),name(n){}
};

class Token_stream {
public:
   Token_stream();			// erstelle einen Token_stream, der aus cin liest 
   Token get();				// lies ein Token ein (get() ist anderswo definiert)
   void putback(Token t);	// lege ein Token zurück 
   void ignore(char c);
private:
   bool full;				// befindet sich ein Token im Puffer?
   Token buffer;			// hier legen wir ein Token ab, das mit putback() 
							// zurückgestellt wurde
};

//Erstellung eines Name-Wert-Paares zur Speicherung von konstanten Werten,
//die der Nutzer selbst eingeben kann
class Variable{
public:
	string name;
	double value;

	Variable(string n, double val):name(n),value(val){}
};

//Definition eines Vektors für Variablen
vector&lt;Variable&gt; var_table; //Typ: Variable (siehe Definition class Variable)

//Definition der Konstanten
const char name = 'a';
const char let = 'L';
const string declkey = &quot;let&quot;;

const char number = '8'; // t.kind == number bedeutet, dass t ein Zahl-Token ist
const char quit   = 'q'; // t.kind == quit bedeutet, dass t ein Verlassen-Token ist
const char print  = ';'; // Ausgeben-Token
const char prompt = '&gt;'; // Eingabeauforderung
const char result = '='; // Ergebnisanzeige

// Der Konstruktor setzt full auf false, um anzuzeigen, dass der Puffer leer ist:
Token_stream::Token_stream()
:full(false), buffer(0)    // kein Token im Puffer
{
}

// Die Memberfunktion putback() stellt ihr Argument zurück in den Puffer von Token_stream:
void Token_stream::putback(Token t)
{
    if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
    buffer = t;       // kopiere t in den Puffer
    full = true;      // Puffer ist jetzt voll
}

Token Token_stream::get()
{
    if (full) {       // gibt es bereits ein fertiges Token?
        // Token aus dem Puffer entfernen
        full=false;
        return buffer;
    } 

    char ch;
    cin &gt;&gt; ch;				// beachten Sie, dass &gt;&gt; Whitespace-Zeichen wie 
							// Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt

    switch (ch) {
    case print:				// für &quot;Ausgeben&quot;
    case quit:				// für &quot;Verlassen&quot;
	case let:
	case name:
	case '(':	
	case ')': 
	case '+':
	case '-': 
	case '*':
	case '/': 
	case '{': 
	case '}': 
	case '!': 
	case '%':
	case '=':
        return Token(ch);	// jedes Zeichen repräsentiert sich selbst 
    case '.':				// Gleitkommliteral kann mit einem Punkt . beginnen
    case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);			 // lege die Ziffer zurück in den Eingabestream
            double val;
            cin &gt;&gt; val;					 // lies eine Gleitkommazahl 
            return Token(number,val);   
        }
    default:
		if(isalpha(ch))
		{
			cin.putback(ch);
			string s;
			s += ch;

			while(cin.get(ch) &amp;&amp; (isalpha(ch) || isdigit(ch)))
				s += ch;
			cin.putback(ch);

			if(s == declkey)
				return Token(let);		//Schlüsselwort für Deklarationen
			return Token(name,s);
		}
        error(&quot;Ungueltiges Token&quot;);
    }
}

void Token_stream::ignore(char c)
			// c repräsentiert eine gesuchte Token-Kategorie
{
	//erster Blick in den Puffer
	if (full &amp;&amp; c == buffer.kind)
	{
		full = false;
		return;
	}
	full = false;

	//Eingabe durchsuchen
	char ch = 0;
	while(cin &gt;&gt; ch)
		if(ch == c) return;
}

//------------------------------------------------------------------------------

double fak (double val)	 //berechnet rekursiv die Fakultät einer Zahl
						 // rekursiv: Die Funktion ruft sich selbst auf
{
	if (val &gt; 1) 
	{
		return fak(val-1) * val;
    }
	else
		return 1;
}

//------------------------------------------------------------------------------

Token_stream ts;        // stellt get() und putback() zur Verfügung  

//------------------------------------------------------------------------------

double expression();    // Deklaration, damit primary() expression() aufrufen kann

//------------------------------------------------------------------------------

double factorial();		// Deklaration, damit term() factorial() aufrufen kann

//------------------------------------------------------------------------------

bool is_declared(string var) // gibt es bereits var?
{
	for(int i=0;i&lt;var_table.size(); i++)
		if(var_table[i].name == var) return true;
	return false;
}

double define_name(string var, double val) // (var, val) hinzufügen
{
	if(is_declared(var)) error(var,&quot;doppelt deklariert&quot;);
	var_table.push_back(Variable(var,val));
	return val;
}

//------------------------------------------------------------------------------

// behandelt Zahlen und Klammern 
double primary()
{
    Token t = ts.get();

    switch (t.kind) {
	case '{': 
		 {    
            double d = expression();
            t = ts.get();
			if (t.kind != '}') error(&quot;'}' expected&quot;);
            return d;
        }
    case '(':    // behandle'(' Ausdruck ')'
        {    
            double d = expression();
            t = ts.get();
            if (t.kind != ')') error(&quot;')' expected&quot;);
            return d;
        }
	case number:     
		return t.value; // liefert den Zahlenwert zurück
	case '-':
		return -primary();
	case '+':
		return primary();
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}

//------------------------------------------------------------------------------

// behandelt *, /
double term()
{
    double left = primary();
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
			break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
		case '%':
			{
				double d = primary();
				int i1 = int(left);
				if(i1 != left) error(&quot;Linker Operand von Modulo % ist keine ganze Zahl&quot;);

				int i2 = int(d);
				if(i2 != d) error(&quot;Rechter Operand von Modulo % ist keine ganze Zahl&quot;);
				if(i2 == 0) error(&quot;Divison durch Null&quot;);
				left = i1%i2;
				t = ts.get();
				break;
			}
		default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;
        }
    }
}

//------------------------------------------------------------------------------

// behandelt + und –
double expression()
{
    double left = term();       // liest einen Token ein und wertet ihn aus
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {    
        switch(t.kind) {
        case '+':
            left += term();    // werte Term aus und addiere
            t = ts.get();
            break;
        case '-':
            left -= term();    // werte Term aus und subtrahiere
            t = ts.get();
            break;
        default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;       // keine weiteren + oder –; Antwort zurückliefern
        }
    }
}

//------------------------------------------------------------------------------

//behandelt die Fakultät als Faktor!
// jetzt alle primary() durch factorial() ersetzen
/*double factorial()
{
    double n = primary(); // Hier rekursiv weiter zu primary

    Token t = ts.get();

    while(t.kind == '!') 
	{
        n = fak(n);
		t = ts.get();
    }

    ts.putback(t);

    return n;
}*/

//--------------------------------------------------------------------------------
//Deklaration: Stellt sicher, dass auf let ein Name folgt, dann =, dann Ausdruck

double declaration()
	//Voraussetzung: let gesehen, nun Behandlung name = ausdruck
	//deklariere eine Variable namens &quot;name&quot; mit dem Anfangswert &quot;ausdruck&quot;
{
	Token t = ts.get();
	if(t.kind!=name) 
		error(&quot;Die Deklaration erwartet einen Namen.&quot;);
	string var_name = t.name;

	Token t2 = ts.get();
	if(t2.kind != '=') 
		error(&quot;Das = fehlt in der Deklaration von&quot;, var_name);

	double d = expression();
	define_name(var_name,d);
	return d;

}

//-----------------------------------------------------------------------
//Anweisung behandelt Ausdrücke und Deklarationen

double statement()
{
	Token t = ts.get();
	switch(t.kind)
	{
	case let:
		return declaration();
	default:
		ts.putback(t);
	return expression();
	}
}

//---------------------------------------------------------------------------------
//Aufräumen nach Tippfehler und Neustart
void clean_up_mess()
{
	ts.ignore(print);
}

//---------------------------------------------------------------------------------
//Durchsucht den Vektor var_table nach Namen und gibt die zugehörigen Werte zurück
double get_value(string s)
{
	for(int i =0 ; i &lt; var_table.size() ; i++)
	{
		if(var_table[i].name == s)
			return var_table[i].value;
		error(&quot;get: Nicht definierte Variable&quot;,s);
	}
}

//------------------------------------------------------------------------------
//Weist Variablen im Vektor var_table einen (neuen) Wert zu
void set_value(string s, double d)
{
	for(int i=0; i &lt; var_table.size(); i++)
	{
		if(var_table[i].name == s)
		{
			var_table[i].value = d;
			return;
		}

		error(&quot;set: Nicht definierte Variable&quot;,s);
	}

}

//-----------------------------------------------------------------------------
//Schleife zur Auswertung der Ausdrücke

void calculate()
{
	while (cin) 
	try{
		cout &lt;&lt; prompt;
        Token t = ts.get();
		while(t.kind == print) t = ts.get();
		if (t.kind == quit) return;

		ts.putback(t);
        cout &lt;&lt; result &lt;&lt; statement() &lt;&lt; endl;
    }
	catch (exception&amp; e) 
	{
    cerr &lt;&lt; &quot;Fehler: &quot; &lt;&lt; e.what() &lt;&lt; '\n'; 
			//keep_window_open();
	clean_up_mess();
	}
}

//-----------------------------------------------------------------------------

int main()
try
{    
	calculate();

	keep_window_open();
	return 0;
}
catch (...) {
    cerr &lt;&lt; &quot;Hoppla: unbekannte Ausnahme!\n&quot;; 
			// keep_window_open();
	cout &lt;&lt; &quot;Um das Fenster zu schliessen ~ eingeben.\n&quot;;
	char ch;
	while(cin &gt;&gt; ch)
		if(ch == '~') return 2;
    return 2;
}
</code></pre>
<p>Ich sitze echt schon 2 Tage dran und finde es einfach nicht. Ist auch etwas viel und damit unübersichtlich geworden. Falls jemand helfen kann, wär ich wirklich dankbar. Ein Hinweis genügt mir hoffentlich schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275906</guid><dc:creator><![CDATA[Lieschen Müller]]></dc:creator><pubDate>Thu, 29 Nov 2012 20:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to (nochmal) Taschenrechner Stroustrup Kapitel 7 on Fri, 30 Nov 2012 08:35:06 GMT]]></title><description><![CDATA[<p>Das ist ein tatsächlich ein wenig viel Code...<br />
Wenn ich mir allerdings den Teil anschaue, in dem Variablen eingeführt werden, fällt mir auf, dass <code>ch</code> zweimal in den String gepackt wird.</p>
<p>Lieschen Müller schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Token Token_stream::get()
{
    //...
    default:
		if(isalpha(ch))
		{
			cin.putback(ch);
			string s;
			s += ch;

			while(cin.get(ch) &amp;&amp; (isalpha(ch) || isdigit(ch)))
				s += ch;
			cin.putback(ch);

			if(s == declkey)
				return Token(let);		//Schlüsselwort für Deklarationen
			return Token(name,s);
		}
    //...
}
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2275992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275992</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 30 Nov 2012 08:35:06 GMT</pubDate></item><item><title><![CDATA[Reply to (nochmal) Taschenrechner Stroustrup Kapitel 7 on Fri, 30 Nov 2012 19:04:59 GMT]]></title><description><![CDATA[<p>Stimmt!! Danke, das habe ich total übersehen. Hätte halt nicht einfach abschreiben sollen.</p>
<p>Es fehlte auch noch eine Zeile in primary()</p>
<pre><code>double primary()
{
    Token t = ts.get();
    switch (t.kind) {
        //...
    case name:
        return get_value(t.name); // liefere Wert der Variablen zurück
       //...
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}
</code></pre>
<p>Jetzt klappt's. Vielen Dank, Furble Wurble.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276205</guid><dc:creator><![CDATA[Lieschen Müller]]></dc:creator><pubDate>Fri, 30 Nov 2012 19:04:59 GMT</pubDate></item></channel></rss>