problem mit uebung beim bjarne stroustrup
-
hi,
bin grad beim 6. kapitel und verstehe die 20 uebung nicht so ganz.vielleicht kann mir einer erklaeren, wie ich eine funktion ohne argumente deklarieren kann; denn ohne argumente hab ich ja auch keine zahl zum berechnen.ein paar denkanstoesse, wie die aufgabe zu loesen waere, waeren auch ganz nett.dann hab ich mir auch natuerlich gleich die naechste aufgabe angeschaut, #21, aber was ist eine symbol-struktur?
ich hoffe, dass ich hier nicht im falschen forum fuer solche sachen bin und mir jemand helfen kann.gruesse
-
Da ich keine Lust habe, meinen Struppi rauszukramen, wäre es vielleicht hilfreich wenn du die Aufgabenstellung posten würdest.
-
kein problem:
#20
Ermoeglichen Sie es dem Anwender, Funktionen innerhalb des Taschenrechners zu definieren.Tip:Definieren Sie eine Funktion als Folge von Operationen, genau wie der Anwender sie eingegeben haette.Eine solche Folge kann entweder als Zeichenkette oder als Liste von Token gespeichert werden.Wenn die Funktion aufgerufen wird, lesen Sie die Liste und fuehren sie aus.Falls die vom Anwender definierte Funktion Argumente haben soll, muss eine Schreibweise dafuer definiert werden.#21
Ueberarbeiten Sie den Taschenrechner so, dass eine symbol-Struktur anstelle der statischen Variablen number_value und string_value benutzt wird.hoffe, dass du mir jetzt weiterhelfen kannst.
-
Ich hab meinen Strourtroup wieder verkauft, weil es als Einsteigerbuch ungeeignet
ist, aber hat jemand mal den Taschenrechner aus Kapitel6 abgetippt? Und vllt sogar
mit solchen Möglichkeiten wie die Übungsaufgaben?
Wenn ja, wäre an dem Code interressiert
-
@SirLant:definitiv kein einsteigerbuch; muss ich dir recht geben.
aber falls es dir oder denen, die mir helfen ein bisschen weiterhilft poste ich hier mal den code fuer den taschenrechner, bei dem die aufgabe, dass er die zeilennummer bei fehlern mit angibt schon erledigt ist; nur halt die zwei fragen, die ich gepostet habe ueberfordern mein vestaendnis.
#include <iostream> #include <string> #include <map> #include <cctype> using namespace std; double number_value; string string_value; map<string, double> table; enum Token_value { NAME, NUMBER, END, PLUS = '+', MINUS = '-', MUL= '*', DIV = '/', PRINT = ';', ASSIGN = '=', LK = '(', RK = ')' }; Token_value curr_tok = PRINT; int no_of_errors; int no_of_lines; double error(const string& s) { ++no_of_errors; --no_of_lines; cerr << "Fehler: " << s << '\n'; cerr << "In Zeile " << no_of_lines << '\n'; no_of_lines += 3; return 1; } Token_value get_token() { char ch; do { if(!cin.get(ch)) return curr_tok = END; }while(ch != '\n' && isspace(ch)); switch(ch) { case '\n': no_of_lines += 2; case ';': return curr_tok = PRINT; case 0: return curr_tok = END; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok = Token_value(ch); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok = NUMBER; default: if(isalpha(ch)) { string_value = ch; while(cin.get(ch) && isalnum(ch)) string_value.push_back(ch); cin.putback(ch); return curr_tok = NAME; } error("Falsches Token"); return curr_tok = PRINT; } } double expr(bool get); double prim(bool get) { if(get) get_token(); switch(curr_tok) { case NUMBER: { double v = number_value; get_token(); return v; } case NAME: { double& v = table[string_value]; if(get_token() == ASSIGN) v = expr(true); return v; } case MINUS: return -prim(true); case LK: { double e = expr(true); if(curr_tok != RK) return error(") erwartet"); get_token(); return e; } default: return error("primary erwartet"); } } double term(bool get) { double left = prim(get); for(;;) switch(curr_tok) { case MUL: left *= prim(true); break; case DIV: if(double d = prim(true)) { left /= d; break; } return error("Division durch 0"); default: return left; } } double expr(bool get) { double left = term(get); for(;;) switch(curr_tok) { case PLUS: left += term(true); break; case MINUS: left -= term(true); break; default: return left; } } int main() { table["pi"] = 3.1415926535897932385; table["e"] = 2.7182818284590452354; while(cin) { get_token(); if(curr_tok == END) break; if(curr_tok == PRINT) continue; cout << expr(false) << '\n'; } return no_of_errors; }
-
SirLant schrieb:
Ich hab meinen Strourtroup wieder verkauft, weil es als Einsteigerbuch ungeeignet ist
Du hast also vor, ewig Einsteiger zu bleiben?