<?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]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>unten der Code aus dem C++ Buch.<br />
Es ist ein Taschenrechner.<br />
Ich gebe die Formel per Tastatur ein und diese wird per Return an Ausdruck übergeben.<br />
Kann mir jemand anhand der Formel:(3+4)*5 mal grob skizzieren wie diese Formel<br />
weiterverarbeitet wird.<br />
Irgendwo hängt es bei mir mit dem Verständniss.</p>
<pre><code>int main() {
  char ch;
    while(true) {                  // Abbruch mit break
    cout &lt;&lt; &quot;\nBitte einen mathematischen Ausdruck OHNE LEERZEICHEN eingeben, &quot;
      &quot;z.B. 4*(12+3)\n(Abbruch durch Eingabe von 'e')&gt;&gt;&quot;;
    cin.get(ch);
    if(ch != 'e')
      cout &lt;&lt; ausdruck(ch);
    else break;
  }
}
</code></pre>
<pre><code>long ausdruck(char&amp; c) {        // Übergabe per Referenz!
  long a;                      // Hilfsvariable für Ausdruck
  if(c == '-') {
    cin.get(c);              // - im Eingabestrom überspringen
    a = -summand(c);         // Rest an summand() übergeben
  }
  else {
    if(c == '+')
      cin.get(c);          // + überspringen
    a = summand(c);
  }
  while(c == '+' || c == '-')
    if(c == '+') {
      cin.get(c);           // + überspringen
      a += summand(c);
    }
    else {
      cin.get(c);           // - überspringen
      a -= summand(c);
    }
  return a;
}

long summand(char&amp; c) {
  long s  = faktor(c);
  while(c == '*' || c == '/')
    if(c == '*') {
      cin.get(c);          // * überspringen
      s *= faktor(c);
    }
    else {
      cin.get(c);          // / überspringen
      s /= faktor(c);
    }
  return s;
}

long faktor(char&amp; c) {
  long f;
  if(c == '(') {
    cin.get(c);                    // ( überspringen
    f = ausdruck(c);
    if(c != ')' )
      cout &lt;&lt; &quot;Rechte Klammer fehlt!\n&quot;; //*** s.u.
        else cin.get(c);               // ) überspringen
  }
  else f = zahl(c);
  return f;
}

long zahl(char&amp; c) {        
  long z = 0;
  /* isdigit() ist eine Funktion (genauer: ein Makro), das zu
    true ausgewertet wird, falls c ein Zifferzeichen ist. Die
    Verwendung setzt #include&lt;cctype&gt; voraus.*/
  while(isdigit(c))   { // d.h. c &gt;= '0' &amp;&amp; c &lt;= '9'
    z = 10*z + static_cast&lt;long&gt;(c-'0');
    cin.get(c);
  }
  return z;
}
</code></pre>
<p>Danke vorab für eure Hilfe. <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>
<p>operator1</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325001/taschenrechner</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 07:59:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325001.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Apr 2014 17:56:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 17:56:09 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>unten der Code aus dem C++ Buch.<br />
Es ist ein Taschenrechner.<br />
Ich gebe die Formel per Tastatur ein und diese wird per Return an Ausdruck übergeben.<br />
Kann mir jemand anhand der Formel:(3+4)*5 mal grob skizzieren wie diese Formel<br />
weiterverarbeitet wird.<br />
Irgendwo hängt es bei mir mit dem Verständniss.</p>
<pre><code>int main() {
  char ch;
    while(true) {                  // Abbruch mit break
    cout &lt;&lt; &quot;\nBitte einen mathematischen Ausdruck OHNE LEERZEICHEN eingeben, &quot;
      &quot;z.B. 4*(12+3)\n(Abbruch durch Eingabe von 'e')&gt;&gt;&quot;;
    cin.get(ch);
    if(ch != 'e')
      cout &lt;&lt; ausdruck(ch);
    else break;
  }
}
</code></pre>
<pre><code>long ausdruck(char&amp; c) {        // Übergabe per Referenz!
  long a;                      // Hilfsvariable für Ausdruck
  if(c == '-') {
    cin.get(c);              // - im Eingabestrom überspringen
    a = -summand(c);         // Rest an summand() übergeben
  }
  else {
    if(c == '+')
      cin.get(c);          // + überspringen
    a = summand(c);
  }
  while(c == '+' || c == '-')
    if(c == '+') {
      cin.get(c);           // + überspringen
      a += summand(c);
    }
    else {
      cin.get(c);           // - überspringen
      a -= summand(c);
    }
  return a;
}

long summand(char&amp; c) {
  long s  = faktor(c);
  while(c == '*' || c == '/')
    if(c == '*') {
      cin.get(c);          // * überspringen
      s *= faktor(c);
    }
    else {
      cin.get(c);          // / überspringen
      s /= faktor(c);
    }
  return s;
}

long faktor(char&amp; c) {
  long f;
  if(c == '(') {
    cin.get(c);                    // ( überspringen
    f = ausdruck(c);
    if(c != ')' )
      cout &lt;&lt; &quot;Rechte Klammer fehlt!\n&quot;; //*** s.u.
        else cin.get(c);               // ) überspringen
  }
  else f = zahl(c);
  return f;
}

long zahl(char&amp; c) {        
  long z = 0;
  /* isdigit() ist eine Funktion (genauer: ein Makro), das zu
    true ausgewertet wird, falls c ein Zifferzeichen ist. Die
    Verwendung setzt #include&lt;cctype&gt; voraus.*/
  while(isdigit(c))   { // d.h. c &gt;= '0' &amp;&amp; c &lt;= '9'
    z = 10*z + static_cast&lt;long&gt;(c-'0');
    cin.get(c);
  }
  return z;
}
</code></pre>
<p>Danke vorab für eure Hilfe. <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>
<p>operator1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393894</guid><dc:creator><![CDATA[operator1]]></dc:creator><pubDate>Thu, 10 Apr 2014 17:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 18:13:28 GMT]]></title><description><![CDATA[<p>was ist das bitte für ein buch? isdigit ist eine funktion, kein makro. und das ganze rumgewurstle mit referenzen sieht sehr suspekt aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393898</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 10 Apr 2014 18:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 18:19:11 GMT]]></title><description><![CDATA[<p>C++ Einführung und prof. Programmierung von U.Breymann.</p>
<p>operator1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393900</guid><dc:creator><![CDATA[operator1]]></dc:creator><pubDate>Thu, 10 Apr 2014 18:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 20:14:53 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>was ist das bitte für ein buch? isdigit ist eine funktion, kein makro. und das ganze rumgewurstle mit referenzen sieht sehr suspekt aus.</p>
</blockquote>
<p>1. Die Übergabe per Referenz macht er, weil die Variable in der aufgerufenen Funktion verändert und er die veränderte Variable später in der aufrufenden Funktion noch braucht. Ich sehe aber gerade, operator1 nicht den Originalcode gepostet hat (zumindest steht in meiner Auflage etwas anderes).</p>
<p>2. Soviel ich weiß, wurden isdigit und seine Kollegen früher auch mal als Makros definiert. Wir wissen jetzt gerade nicht, welche Auflage er liest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393917</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 10 Apr 2014 20:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 20:57:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27196">@operator1</a>: Wo hängt es denn bei dir genau? Was verstehst du nicht. Was nutzt du den für eine IDE. Nicht selbstgeschriebene Rekursionen nachzuvollziehen ist oft nicht einfach. Um dann etwas zu lernen, brauchst du Bleistift, Zettel und Debugger. Wenn du noch nicht mit einem Debugger vertraut bist, solltest du dir jetzt Microsoft Visual Studio Express 2013 für Windows Desktop installieren, ein Projekt erstellen und dein Quellcode hineinkopieren. Wenn du dann links neben eine Zeile klickst kannst du einen Breakpoint setzen. Lässt du das Programm laufen, hält es automatisch beim Breakpoint an. Dann kannst du mit F10 + F11 Schritt für Schritt weitergehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393927</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 10 Apr 2014 20:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 22:11:34 GMT]]></title><description><![CDATA[<p>Ich gebe die Formel ein ---&gt; und dann enter.<br />
Da kein e eingegeben ist wird ch an Ausdruck übergeben.<br />
Wie verarbeitet Ausdruck jetzt den Term ??<br />
Wie wird z.B. eine '(' am Anfang verarbeitet ???</p>
<p>operator1</p>
<p>Der Code ist nicht komplett reingestellt worden.<br />
Ist die 9. Auflage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393938</guid><dc:creator><![CDATA[operator1]]></dc:creator><pubDate>Thu, 10 Apr 2014 22:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 22:52:40 GMT]]></title><description><![CDATA[<p>operator1 schrieb:</p>
<blockquote>
<p>Wie wird z.B. eine '(' am Anfang verarbeitet ???</p>
</blockquote>
<p>Leider ist der Code durch die sparsame Setzung von geschweiften Klammern etwas schwer zu lesen (ich lasse zwar selber gerne mal Klammern um einzelne Zeilen weg, aber hier ist es - gepaart mit der sparsamen Leerzeilensetzung - uebertrieben). Daher musst du ganz genau gucken, wie das Programm verlaeuft.</p>
<p>Im Falle einer '(' am Anfang laeufst du beispielsweise so:<br />
ausdruck:<br />
-Zeile 3: Kein '-', weiter zu Zeile 7<br />
-Zeile 8: Kein '+', weiter zu Zeile 10 (diesen Sprung hast du wahrscheinlich uebersehen!)<br />
-Zeile 10: Weiter zu summand<br />
summand:<br />
-Zeile 25: Weiter zu faktor<br />
faktor:<br />
Zeile 40: Treffer, wir haben eine '('! Also geht es in den Anweisungsblock, wo das naechste Zeichen verarbeitet wird.</p>
<p>Das Programm ist uebrigens ein Parser fuer eine <a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form" rel="nofollow">Backus-Naur-Form</a> fuer einfache mathematische Ausdruecke. Ich mag jetzt nicht das ganze Programm im Details auseinander nehmen, aber es geht ungefaehr so:<br />
-Ein Ausdruck besteht aus einem oder mehreren Summanden, die mit '+' oder '-' verbunden sind.<br />
-Ein Summand besteht ein oder mehrere Faktoren, die mit '*' oder '/' verbunden sind.<br />
-Ein Faktor ist entweder eine Zahl oder ein Ausdruck, der in Klammern eingeschlossen ist<br />
-Eine Zahl ist eine Folge von Ziffern<br />
-Eine Ziffer ist das, was isdigit als Ziffer definiert</p>
<p>Das Programm setzt diese Definitionen ziemlich wortwoertlich so um, wie ich sie hier beschrieben habe.</p>
<p>Hoffe, das hilft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393942</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Apr 2014 22:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner on Thu, 10 Apr 2014 23:32:23 GMT]]></title><description><![CDATA[<p>Genau den Sprung habe ich verpasst !!<br />
Danke, jetzt verstehe ich die Auswertung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <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="👍"
    /> <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>operator1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393946</guid><dc:creator><![CDATA[operator1]]></dc:creator><pubDate>Thu, 10 Apr 2014 23:32:23 GMT</pubDate></item></channel></rss>