Taschenrechner
-
Hallo zusammen,
unten der Code aus dem C++ Buch.
Es ist ein Taschenrechner.
Ich gebe die Formel per Tastatur ein und diese wird per Return an Ausdruck übergeben.
Kann mir jemand anhand der Formel:(3+4)*5 mal grob skizzieren wie diese Formel
weiterverarbeitet wird.
Irgendwo hängt es bei mir mit dem Verständniss.int main() { char ch; while(true) { // Abbruch mit break cout << "\nBitte einen mathematischen Ausdruck OHNE LEERZEICHEN eingeben, " "z.B. 4*(12+3)\n(Abbruch durch Eingabe von 'e')>>"; cin.get(ch); if(ch != 'e') cout << ausdruck(ch); else break; } }long ausdruck(char& 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& 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& c) { long f; if(c == '(') { cin.get(c); // ( überspringen f = ausdruck(c); if(c != ')' ) cout << "Rechte Klammer fehlt!\n"; //*** s.u. else cin.get(c); // ) überspringen } else f = zahl(c); return f; } long zahl(char& 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<cctype> voraus.*/ while(isdigit(c)) { // d.h. c >= '0' && c <= '9' z = 10*z + static_cast<long>(c-'0'); cin.get(c); } return z; }Danke vorab für eure Hilfe.

operator1
-
was ist das bitte für ein buch? isdigit ist eine funktion, kein makro. und das ganze rumgewurstle mit referenzen sieht sehr suspekt aus.
-
C++ Einführung und prof. Programmierung von U.Breymann.
operator1
-
asfdlol schrieb:
was ist das bitte für ein buch? isdigit ist eine funktion, kein makro. und das ganze rumgewurstle mit referenzen sieht sehr suspekt aus.
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).
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.
-
@operator1: 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.
-
Ich gebe die Formel ein ---> und dann enter.
Da kein e eingegeben ist wird ch an Ausdruck übergeben.
Wie verarbeitet Ausdruck jetzt den Term ??
Wie wird z.B. eine '(' am Anfang verarbeitet ???operator1
Der Code ist nicht komplett reingestellt worden.
Ist die 9. Auflage.
-
operator1 schrieb:
Wie wird z.B. eine '(' am Anfang verarbeitet ???
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.
Im Falle einer '(' am Anfang laeufst du beispielsweise so:
ausdruck:
-Zeile 3: Kein '-', weiter zu Zeile 7
-Zeile 8: Kein '+', weiter zu Zeile 10 (diesen Sprung hast du wahrscheinlich uebersehen!)
-Zeile 10: Weiter zu summand
summand:
-Zeile 25: Weiter zu faktor
faktor:
Zeile 40: Treffer, wir haben eine '('! Also geht es in den Anweisungsblock, wo das naechste Zeichen verarbeitet wird.Das Programm ist uebrigens ein Parser fuer eine Backus-Naur-Form fuer einfache mathematische Ausdruecke. Ich mag jetzt nicht das ganze Programm im Details auseinander nehmen, aber es geht ungefaehr so:
-Ein Ausdruck besteht aus einem oder mehreren Summanden, die mit '+' oder '-' verbunden sind.
-Ein Summand besteht ein oder mehrere Faktoren, die mit '*' oder '/' verbunden sind.
-Ein Faktor ist entweder eine Zahl oder ein Ausdruck, der in Klammern eingeschlossen ist
-Eine Zahl ist eine Folge von Ziffern
-Eine Ziffer ist das, was isdigit als Ziffer definiertDas Programm setzt diese Definitionen ziemlich wortwoertlich so um, wie ich sie hier beschrieben habe.
Hoffe, das hilft.
-
Genau den Sprung habe ich verpasst !!
Danke, jetzt verstehe ich die Auswertung.

operator1