Rechenprogramm mit strings
-
Mechanics schrieb:
Kellerautomat schrieb:
Sorry Werner, aber meinen Ansatz finde ich da viel schöner.

Doch, den Code von Werner finde ich schon sehr schick. Aber ich denke, das wird für den TE auch etwas schwer zu verdauen sein...
Ja, da hast Du Recht. Das mit Templates kann man natürlich auch weglassen, mir ging es eben eher darum, auf die Verwendung von std::istream statt char* hinzuweisen.
Kellerautomat schrieb:
Der Hauptgrund ist wohl, dass ich ctest nicht verstehe.
Ja - und genau das ist auch einer der Knackpunkte.
Nur - es fragt kein Mensch hier im Forum, wie man das nächste Zeichen aus einem std::istream abfragt, ohne es 'zu lesen'. Aber jeden Monat kommt jemand mit der Frage wie man einen mathematischen Ausdruck aus einem String heraus holt, und mehr als zwei pro Woche fragen wie man aus einem (meist kurz vorher mit getline gelesenen) String Zahlen oder andere Werte heraus bekommt.
Und die Antwortenden gehen meist auch immer drauf ein. Sie geben auch i.A. die passenden Antworten in Richtung Parser, und entsprechend Algorithmen, nur der Hinweis auf den std::istream, der für den Input gebaut wurde, das kommt selten. Wobei der std::istream weder alles kann, noch einfach zu handeln ist.Bei std::istream ist wohl einiges beim Marketing schief gelaufen.
Gruß
Werner
-
Mechanics schrieb:
.. Aber ich denke, das wird für den TE auch etwas schwer zu verdauen sein...
Ok - hier noch mal eine einfacherer Fassung:
#include <iostream> struct Term // Produkt oder Ausdruck mit Division { Term( int& target ) : target_( &target ) {} int* target_; }; struct Expression // der ganze Ausdruck, hier: Summe oder Differenz { Expression( int& target ) : target_( &target ) {} int* target_; }; std::istream& operator>>( std::istream& in, Term t ) { typedef int Wert; Wert x1; in >> x1; for( char op; in >> op; ) { switch( op ) { case '*': { Wert x2; if( in >> x2 ) x1 *= x2; } break; case '/': { Wert x2; if( in >> x2 ) x1 /= x2; } break; default: in.putback( op ); *t.target_ = x1; return in; } } return in; } std::istream& operator>>( std::istream& in, Expression e ) { typedef int Wert; Wert x1; in >> Term( x1 ); for( char op; in >> op; ) { switch( op ) { case '+': { Wert x2; if( in >> Term( x2 ) ) x1 += x2; } break; case '-': { Wert x2; if( in >> Term( x2 ) ) x1 -= x2; } break; default: in.putback( op ); // kein Operator '+' '-', dann Zeichen zurück in den stream *e.target_ = x1; return in; // fertig } } return in; } int main() { using namespace std; for( int x; cout << "\nGeben Sie die Rechnung ein (Beenden mit ';'): ", cin >> Expression( x); cin.ignore( 1, '\n' ) ) cout << "= " << x<< endl; return 0; }hallo astir,
ist das verständlich?@Edit: Tippfehler '/n' -> '\n'
-
Hey,
danke, aber glaub erklären könnte ich das nicht....wir haben auch soetwas noch gar nicht gemacht.
Ich hab grad ganz andere Probleme. Erst funktioniert alles schön und dann kommt auf einmal beim Debuggen folgendes: "Das aufgerufene Projekt wurde von den Clients getrennt".
Kann mir jemand sagen was da heißt, bzw. was ich evtl. falsch gemacht habe?Ist egrade echt alles deprimierend
