<?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[Überprüfung eines mathematischen Terms]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine Aufgabe ist es einen Kellerautomat in C++ zu schreiben, welcher einen mathematischen Term auf Korrektheit überprüft.</p>
<p>Erlaubte Zeichen sind * und +.</p>
<p>Bsp.:<br />
5+22*4 = erlaubt<br />
5 2+3 = nicht erlaubt</p>
<p>Einen einfachen Kellerautomat mit Klammerausdrücken ( { { } } ) zu schreiben war nicht das Problem. Wie sollte ich den Kellerautomat am Besten aufbauen um einen mathematischen Term zu analysieren?</p>
<pre><code class="language-cpp">// Kellerautomat mit Klammerausdrücken

#include &lt;iostream&gt;

using namespace std;

int main(int argc, char *argv[])
{
    const int POP    = -1;
    const int ACCEPT = -2;
    const int ERROR  = -3;

    const int SIZE   = 3;   // Größe des Eingabealphabets

    int states[2][SIZE*2] =
    {
        {
            '(',  1,
            ')',  ERROR,
            '\0', ACCEPT
        },
        {
            '(',  1,
            ')',  POP,
            '\0', ERROR
        }
    };

    char s [80+1];

    int stack[100] = { 0 };
    int i          = 0;
    int action     = 0;
    int* tos       = stack;
    char* p        = s;

    cout&lt;&lt;&quot;Bitte Ausdruck eingeben: &quot;;
    cin&gt;&gt;s;

    *(tos++) = 0;

    do
    {
        action = ERROR;
        for (i = 0; i &lt; SIZE; i++)
        {
            if (states[*(tos-1)][i*2] == *p)
            {
                action = states[*(tos-1)][i*2+1];
                break;
            }
        }

        if (action == ERROR)
        {
            cout&lt;&lt;&quot;Unerwartetes Zeichen an Position &quot;&lt;&lt;p-s&lt;&lt;&quot;!&quot;;
            break;
        }

        else if (action == ACCEPT)
        {
            cout&lt;&lt;&quot;Ausdruck akzeptiert!&quot;;
            break;
        }

        else if (action == POP)
        {
            tos--;
        }

        else
        {
            *(tos++) = action;
        }

        // Eingabe erweitern
        p++;
    }

    while (action != ACCEPT);

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
<p>irgendwelche Ideen?</p>
<p>Danke,<br />
methos-</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174826/überprüfung-eines-mathematischen-terms</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Jul 2026 14:54:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174826.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Mar 2007 10:43:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Sun, 04 Mar 2007 10:43:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine Aufgabe ist es einen Kellerautomat in C++ zu schreiben, welcher einen mathematischen Term auf Korrektheit überprüft.</p>
<p>Erlaubte Zeichen sind * und +.</p>
<p>Bsp.:<br />
5+22*4 = erlaubt<br />
5 2+3 = nicht erlaubt</p>
<p>Einen einfachen Kellerautomat mit Klammerausdrücken ( { { } } ) zu schreiben war nicht das Problem. Wie sollte ich den Kellerautomat am Besten aufbauen um einen mathematischen Term zu analysieren?</p>
<pre><code class="language-cpp">// Kellerautomat mit Klammerausdrücken

#include &lt;iostream&gt;

using namespace std;

int main(int argc, char *argv[])
{
    const int POP    = -1;
    const int ACCEPT = -2;
    const int ERROR  = -3;

    const int SIZE   = 3;   // Größe des Eingabealphabets

    int states[2][SIZE*2] =
    {
        {
            '(',  1,
            ')',  ERROR,
            '\0', ACCEPT
        },
        {
            '(',  1,
            ')',  POP,
            '\0', ERROR
        }
    };

    char s [80+1];

    int stack[100] = { 0 };
    int i          = 0;
    int action     = 0;
    int* tos       = stack;
    char* p        = s;

    cout&lt;&lt;&quot;Bitte Ausdruck eingeben: &quot;;
    cin&gt;&gt;s;

    *(tos++) = 0;

    do
    {
        action = ERROR;
        for (i = 0; i &lt; SIZE; i++)
        {
            if (states[*(tos-1)][i*2] == *p)
            {
                action = states[*(tos-1)][i*2+1];
                break;
            }
        }

        if (action == ERROR)
        {
            cout&lt;&lt;&quot;Unerwartetes Zeichen an Position &quot;&lt;&lt;p-s&lt;&lt;&quot;!&quot;;
            break;
        }

        else if (action == ACCEPT)
        {
            cout&lt;&lt;&quot;Ausdruck akzeptiert!&quot;;
            break;
        }

        else if (action == POP)
        {
            tos--;
        }

        else
        {
            *(tos++) = action;
        }

        // Eingabe erweitern
        p++;
    }

    while (action != ACCEPT);

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
<p>irgendwelche Ideen?</p>
<p>Danke,<br />
methos-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238835</guid><dc:creator><![CDATA[methos-]]></dc:creator><pubDate>Sun, 04 Mar 2007 10:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Wed, 07 Mar 2007 00:00:02 GMT]]></title><description><![CDATA[<p>Es handelt sich um einen gültigen Term, wenn nach Jeder Zahl ein Operator und nach jedem Operator eine Zahl auftaucht und am Ende eine Zahl steht.</p>
<p>Dann brauchst du 2 Zustände.</p>
<p>1. letzter Teil war Operator<br />
2. letzter Teil war Zahl</p>
<p>Befindest du dich in Zustand 1. und findest noch einen Operator gibts nen Fehler.<br />
Befindest du dich in Zustand 2. und findest noch eine Zahl gibts nen Fehler.<br />
Befindest du dich am Ende der Terms und bist in Zustand 1., gibts nen Fehler.</p>
<p>Der Rest ergibt dann gültige Terme.</p>
<p>Also so im Groben müsste das so funktionieren <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/1240675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1240675</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 07 Mar 2007 00:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Thu, 08 Mar 2007 09:55:42 GMT]]></title><description><![CDATA[<p>Yacc/Bison würde dir die halbe Arbeit abnehmen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241517</guid><dc:creator><![CDATA[cheopz]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Sun, 11 Mar 2007 09:51:19 GMT]]></title><description><![CDATA[<p>aber es geht ja um verschachtelte terme oder?</p>
<p>d.h. die Anzhal der &quot;(&quot; und der &quot;)&quot; muzss gleich sein</p>
<p>und die &quot;(&quot; ist immer vor einer Zahl, und &quot;)&quot; ende immer dirket hinter eine zahl sonst fehler..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243218</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Sun, 11 Mar 2007 09:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Sun, 11 Mar 2007 10:52:50 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>und die &quot;(&quot; ist immer vor einer Zahl, und &quot;)&quot; ende immer dirket hinter eine zahl sonst fehler..</p>
</blockquote>
<p>Deiner Meinung nach ist also 3*(-25+17) kein zulässiger Ausdruck?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243235</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Sun, 11 Mar 2007 10:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Überprüfung eines mathematischen Terms on Sun, 11 Mar 2007 13:25:18 GMT]]></title><description><![CDATA[<p>Streng genommen hat er Zahl und nicht Ziffer gesagt. Im Gegenzug könnte man also dich fragen, ob -25 für dich keine Zahl ist <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="😉"
    /><br />
(Das macht BorisDieKlinges Aussage aber nicht unbedingt richtiger, man denke nur an verschachtelte Klammern.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243336</guid><dc:creator><![CDATA[minhen]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:25:18 GMT</pubDate></item></channel></rss>