<?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[C++ Mathematischer Ausdruck in Laufzeit klammern lassen]]></title><description><![CDATA[<p>Hallo,<br />
ich komme hier einfach nicht weiter. Ich soll in mein Programm einen Mathematischen Ausdruck eingeben (mit + - und <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> zum Beispiel:<br />
2*4-6*a und daraus soll werden ((2*4)-(6*a))<br />
Dies soll aber nicht mit einem Baum gelöst werden. Ich danke dann über einen Stack, aber nur wie... Hat jemand mal einen Denkanstoß für mich?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305411/c-mathematischer-ausdruck-in-laufzeit-klammern-lassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 22:12:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305411.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Jun 2012 09:57:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Mathematischer Ausdruck in Laufzeit klammern lassen on Thu, 28 Jun 2012 09:57:44 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich komme hier einfach nicht weiter. Ich soll in mein Programm einen Mathematischen Ausdruck eingeben (mit + - und <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> zum Beispiel:<br />
2*4-6*a und daraus soll werden ((2*4)-(6*a))<br />
Dies soll aber nicht mit einem Baum gelöst werden. Ich danke dann über einen Stack, aber nur wie... Hat jemand mal einen Denkanstoß für mich?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228091</guid><dc:creator><![CDATA[Minnifutzi]]></dc:creator><pubDate>Thu, 28 Jun 2012 09:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Mathematischer Ausdruck in Laufzeit klammern lassen on Thu, 28 Jun 2012 10:13:25 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/p1642138" rel="nofollow">http://www.c-plusplus.net/forum/p1642138</a><br />
<a href="http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins" rel="nofollow">http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins</a><br />
<a href="http://www.c-plusplus.net/forum/p936252#936252" rel="nofollow">http://www.c-plusplus.net/forum/p936252#936252</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228098</guid><dc:creator><![CDATA[Denkanstoß]]></dc:creator><pubDate>Thu, 28 Jun 2012 10:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Mathematischer Ausdruck in Laufzeit klammern lassen on Thu, 28 Jun 2012 11:06:03 GMT]]></title><description><![CDATA[<p>Wir sind gerade beim Thema Stacks, also ich denke mal ich soll das darüber lösen und nicht über Parsing.</p>
<p>Die Aufgabe lautet direkt:<br />
Einen ungeklammerten mathematischen Ausdruck unter Beachtung der Vorrangregeln in einen<br />
vollständigen dyadischen Ausdruck umwandelt und das Ergebnis auf dem Bildschirm ausgibt!</p>
<p>Und daraus dann einen Ausdrucksbaum entwerfen.</p>
<p>Ich hab versucht es über 2 Stacks zu lösen. Einer für die Operanten einen für die Operatoren - denkt ihr es wäre auch so lösbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228113</guid><dc:creator><![CDATA[Minnifutzi]]></dc:creator><pubDate>Thu, 28 Jun 2012 11:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Mathematischer Ausdruck in Laufzeit klammern lassen on Thu, 28 Jun 2012 11:52:13 GMT]]></title><description><![CDATA[<p>der <a href="http://en.wikipedia.org/wiki/Recursive_descent_parser" rel="nofollow">Recursive Descent Parser</a>, der im ersten Link erwähnt wird, arbeitet mit dem Programmstack.<br />
Und der <a href="http://de.wikipedia.org/wiki/Shunting-yard-Algorithmus" rel="nofollow">Shunting-Yard-Algorithmus</a> erzeugt aus dem algebraischen Ausdruck mit Hilfe eines Stacks die <a href="http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation" rel="nofollow">UPN</a>, die wieder mit Hilfe eines Stacks aufgelöst werden kann (war der dritte Link von oben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228127</guid><dc:creator><![CDATA[Denkanstoß]]></dc:creator><pubDate>Thu, 28 Jun 2012 11:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Mathematischer Ausdruck in Laufzeit klammern lassen on Thu, 28 Jun 2012 19:18:18 GMT]]></title><description><![CDATA[<p>Denkanstoß schrieb:</p>
<blockquote>
<p><a href="http://www.c-plusplus.net/forum/p1642138" rel="nofollow">http://www.c-plusplus.net/forum/p1642138</a></p>
</blockquote>
<p>Vielleicht ist es für Minnifutzi nicht hilfreich, aber mit Hilfe des Expression-Parsers auf den oben verlinkt ist, kann man die gestellte Aufgabe tatsächlich lösen. Man muss sich bloß einen passenden Type T definieren und die vier Grundrechenarten passend implementieren.</p>
<p>Das ganze sieht so aus:</p>
<pre><code class="language-cpp">#include &quot;expression.h&quot; // -&gt; &lt;http://www.c-plusplus.net/forum/p1642138#1642138&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

template&lt; typename T &gt;
std::string to_string( const T&amp; x )
{
    std::ostringstream buf;
    buf &lt;&lt; x;
    return buf.str();
}

template&lt; typename T &gt;
struct Foo
{
    explicit Foo( const T&amp; x = T() )
        : value_( to_string( x ) )
    {}
    Foo&amp; operator=( const T&amp; x )
    {
        value_ = to_string( x );
        return *this;
    }
    Foo&amp; operator+=( const Foo&amp; b )
    {
        value_ += '+' + b.value_;
        return *this;
    }
    Foo&amp; operator-=( const Foo&amp; b )
    {
        value_ += '-' + b.value_;
        return *this;
    }
    Foo&amp; operator*=( const Foo&amp; b )
    {
        value_ = '(' + value_ + '*' + b.value_ + ')';
        return *this;
    }
    Foo&amp; operator/=( const Foo&amp; b )
    {
        value_ = '(' + value_ + '/' + b.value_ + ')';
        return *this;
    }
    Foo operator-() const
    {
        return Foo( '-' + value_ );
    }
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Foo&amp; foo )
    {
        T x;
        if( in &gt;&gt; x )
            foo = Foo( x );
        return in;
    }
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, Foo&amp; foo )
    {
        return out &lt;&lt; foo.value_;
    }
private:
    Foo( const std::string&amp; s ) : value_( s ) {}
    std::string value_;
};

int main()
{
    using namespace std;
    cin &gt;&gt; noskipws;
    for( Foo&lt; int &gt; x; cout &lt;&lt; &quot;&gt; &quot;, cin &gt;&gt; ws &gt;&gt; expression( x ); )
        cout &lt;&lt; &quot;    Ergebnis: &quot; &lt;&lt; x &lt;&lt; endl;
    return 0;
}
</code></pre>
<pre><code>&gt; 2*4-6*8
    Ergebnis: (2*4)-(6*8)
&gt; 13+4*5*6+987*2
    Ergebnis: 13+((4*5)*6)+(987*2)
&gt;
</code></pre>
<p>Ich find's immer wieder erstaunlich, was mit diesen Template-Konstruktionen alles so geht, obwohl das beim Entwurf gar nicht vorgesehen war. (siehe auch <a href="http://www.c-plusplus.net/forum/p1989618#1989618" rel="nofollow">hier</a>)</p>
<p>Gruß<br />
Werner</p>
<p>PS.: im Expression-Parser müssen dazu drei Zeilen ausgetauscht werden. Von Zeile 104 bis 106 muss es heißen:</p>
<pre><code class="language-cpp">const bool minus = !ctest( in, '+' ) &amp;&amp; ctest( in, '-' );
    in &gt;&gt; Term&lt; T &gt;( m_value );
    if( minus ) m_value = -m_value;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2228261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228261</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 28 Jun 2012 19:18:18 GMT</pubDate></item></channel></rss>