<?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[Rekursiver Abstieg]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte gerne durch den rekursiven Abstieg mathemathische Rechenaufgaben lösen. Das klappt alles nur müsste ich das jetzt noch in eine Klasse packen die ich einmal fülle und dann immer wieder mit expr-&gt;getResult() aufrufen kann. Das ist daher wichtig, da sich das später auch auf Variablen etc. beziehen wird. Und expr sollte dann das Ergebnis mit dem neuen Variablenwert berechnen können.</p>
<p>Meine Klasse habe ich mir so ähnlich vorgestellt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

typedef std::list&lt;class Expression *&gt; ExpressionList;
enum Operation { ADD, SUB, MUL, DIV };

class Expression {
	public:
		Expression() { }
		virtual ~Expression() { }
		virtual int getResult() = 0;
};

class Number : public Expression {
	private:
		int m_int;

	public:
		Number(int num) { m_int = num; }

	public:
		virtual int getResult() { return m_int; }

};

class ExprType : public Expression {
	private:
		Operation m_op;
		ExpressionList m_exprList;

	public:
		ExprType(Operation op) { m_op = op; }
		virtual ~ExprType() {
			for (ExpressionList::iterator it = m_exprList.begin(); it != m_exprList.end(); ++it) {
				delete *it;
			}
		}

	public:
		void push(Expression *expr) { m_exprList.push_back(expr); }

	public:
		virtual int getResult() {
			int res = (m_op == ADD || m_op == SUB) ? 0 : 1;
			for (ExpressionList::iterator it = m_exprList.begin(); it != m_exprList.end(); ++it) {
				switch (m_op) {
					case ADD:
						res += (*it)-&gt;getResult();
						break;

					case SUB:
						res -= (*it)-&gt;getResult();
						break;

					case MUL:
						res *= (*it)-&gt;getResult();
						break;

					case DIV:
						res /= (*it)-&gt;getResult();
						break;
				}
			}
			return res;
		}
};

int main() {
		std::cout &lt;&lt; &quot;Mul:\n&quot;;
		ExprType *mul = new ExprType('*');
		mul-&gt;push(new Number(10));
		mul-&gt;push(new Number(20));
		mul-&gt;push(new Number(30));
		std::cout &lt;&lt; mul-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		std::cout &lt;&lt; &quot;Add:\n&quot;;
		ExprType *add = new ExprType('+');
		add-&gt;push(new Number(10));
		add-&gt;push(new Number(20));
		add-&gt;push(new Number(30));
		std::cout &lt;&lt; add-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		std::cout &lt;&lt; &quot;Mix:\n&quot;;
		std::cout &lt;&lt; mul-&gt;getResult() &lt;&lt; &quot; * &quot; &lt;&lt; add-&gt;getResult() &lt;&lt; &quot; = &quot;;
		ExprType *mix = new ExprType('*');
		mix-&gt;push(mul);
		mix-&gt;push(add);

		std::cout &lt;&lt; mix-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		//
		//	Der Speicher von mul und add wird durch mix wieder freigegeben!
		//
		delete mix;
	return 0;
}
</code></pre>
<p>Lassen sich meine Klassen mit dem rekursiven Abstieg verbinden so das ich damit meine Bedingung (s. Oben) erfülle oder laufe ich da in ein Problem?</p>
<p>Vielen dank im Voraus,<br />
MrY</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203564/rekursiver-abstieg</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 18:05:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203564.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jan 2008 21:03:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rekursiver Abstieg on Wed, 23 Jan 2008 21:03:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte gerne durch den rekursiven Abstieg mathemathische Rechenaufgaben lösen. Das klappt alles nur müsste ich das jetzt noch in eine Klasse packen die ich einmal fülle und dann immer wieder mit expr-&gt;getResult() aufrufen kann. Das ist daher wichtig, da sich das später auch auf Variablen etc. beziehen wird. Und expr sollte dann das Ergebnis mit dem neuen Variablenwert berechnen können.</p>
<p>Meine Klasse habe ich mir so ähnlich vorgestellt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

typedef std::list&lt;class Expression *&gt; ExpressionList;
enum Operation { ADD, SUB, MUL, DIV };

class Expression {
	public:
		Expression() { }
		virtual ~Expression() { }
		virtual int getResult() = 0;
};

class Number : public Expression {
	private:
		int m_int;

	public:
		Number(int num) { m_int = num; }

	public:
		virtual int getResult() { return m_int; }

};

class ExprType : public Expression {
	private:
		Operation m_op;
		ExpressionList m_exprList;

	public:
		ExprType(Operation op) { m_op = op; }
		virtual ~ExprType() {
			for (ExpressionList::iterator it = m_exprList.begin(); it != m_exprList.end(); ++it) {
				delete *it;
			}
		}

	public:
		void push(Expression *expr) { m_exprList.push_back(expr); }

	public:
		virtual int getResult() {
			int res = (m_op == ADD || m_op == SUB) ? 0 : 1;
			for (ExpressionList::iterator it = m_exprList.begin(); it != m_exprList.end(); ++it) {
				switch (m_op) {
					case ADD:
						res += (*it)-&gt;getResult();
						break;

					case SUB:
						res -= (*it)-&gt;getResult();
						break;

					case MUL:
						res *= (*it)-&gt;getResult();
						break;

					case DIV:
						res /= (*it)-&gt;getResult();
						break;
				}
			}
			return res;
		}
};

int main() {
		std::cout &lt;&lt; &quot;Mul:\n&quot;;
		ExprType *mul = new ExprType('*');
		mul-&gt;push(new Number(10));
		mul-&gt;push(new Number(20));
		mul-&gt;push(new Number(30));
		std::cout &lt;&lt; mul-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		std::cout &lt;&lt; &quot;Add:\n&quot;;
		ExprType *add = new ExprType('+');
		add-&gt;push(new Number(10));
		add-&gt;push(new Number(20));
		add-&gt;push(new Number(30));
		std::cout &lt;&lt; add-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		std::cout &lt;&lt; &quot;Mix:\n&quot;;
		std::cout &lt;&lt; mul-&gt;getResult() &lt;&lt; &quot; * &quot; &lt;&lt; add-&gt;getResult() &lt;&lt; &quot; = &quot;;
		ExprType *mix = new ExprType('*');
		mix-&gt;push(mul);
		mix-&gt;push(add);

		std::cout &lt;&lt; mix-&gt;getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; std::endl;

		//
		//	Der Speicher von mul und add wird durch mix wieder freigegeben!
		//
		delete mix;
	return 0;
}
</code></pre>
<p>Lassen sich meine Klassen mit dem rekursiven Abstieg verbinden so das ich damit meine Bedingung (s. Oben) erfülle oder laufe ich da in ein Problem?</p>
<p>Vielen dank im Voraus,<br />
MrY</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442377</guid><dc:creator><![CDATA[MrY]]></dc:creator><pubDate>Wed, 23 Jan 2008 21:03:26 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiver Abstieg on Wed, 23 Jan 2008 22:12:10 GMT]]></title><description><![CDATA[<p>MrY schrieb:</p>
<blockquote>
<p>Lassen sich meine Klassen mit dem rekursiven Abstieg verbinden so das ich damit meine Bedingung (s. Oben) erfülle oder laufe ich da in ein Problem?</p>
</blockquote>
<p>Die Frage lässt sich ohne deine Mithilfe nicht beantworten. ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> was sind die Bedingungen?)</p>
<p>Unabhängig davon, die switch-Konstruktion sieht nicht allzu gelungen aus. Die Operationen sollten besser alles verschiedene Knoten im <a href="https://www.google.de/search?&amp;q=Abstract%20Syntax%20Tree" rel="nofollow">Google: Abstract Syntax Tree</a> sein.</p>
<pre><code>Add : Function
{
  getResult()
  {
    evaluateArguments();
    return fold(argValues, 0, plus&lt;int&gt;);
  }
};

Mul : Function
{
  getResult()
  {
    evaluateArguments();
    return fold(argValues, 1, multiplies&lt;int&gt;);
  }
};

Sin : Function
{
  getResult()
  {
    checkArity();
    evaluateArguments();
    return sin(argValues[0]);
  }
};

// etc.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1442422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442422</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 23 Jan 2008 22:12:10 GMT</pubDate></item></channel></rss>