Golfi1812 Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 Hallo Leute, Ich lerne seit enigen Monaten C++ mit dem Buch: Einführung in die Programmierung mit C++ von Bjarne Stroustrup. Ich bin zur Zeit in Kapitel 6. Oft habe ich Schwierigkeiten gehabt und etwas nicht verstanden, dann habe ich das Kapitel solange wieder von vorne durchgearbeitet, bis ich es konnte. So habe ich es auch hier gemacht, doch ich verstehe einfach diese Funktion nicht ganz: 6.5.2.1 Ausdrücke: Erster Versuch double expression() { double left = term(); // liest einen Token ein und wertet ihn aus Token t = get_token(); // hole das nächste Token while(true) { switch(t.kind) { case '+': left += term(); // werte Term aus und addiere t = get_token(); break; case '-': left -= term(); // werte Term aus und subtrahiere t = get_token(); break; default: return left; // keine weiteren + oder –; Antwort zurückliefern } } [/PHP] Es ist direkt der erste Befehl: double left = term(); laut Kommentar wird hier ein Token eingelesen und ausgewertet. 1.Von wo wird der Token eingelesen? //Muss alo in der Variable left ein Token abgelegt sein? 2.Wohin wird er eingelesen? 3.Wer wertet ihn aus? //Sendet mit dem Befehl: "double left = term();" ,die variable left ihren Inhalt an term() und bekommt dann den Inhalt ausgewertet wieder zurück? Ich hoffe ihr könnt mir weiter helfen. Vielen Dank Zitieren
Klotzkopp Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 So habe ich es auch hier gemacht, doch ich verstehe einfach diese Funktion nicht ganz:Wenn du verstehen willst, was da passiert, musst du dir die Funktionen term() und get_token() ansehen, die müssen nämlich auch Bestandteil des Programms sein. Sendet mit dem Befehl: "double left = term();" ,die variable left ihren Inhalt an term() und bekommt dann den Inhalt ausgewertet wieder zurück? Da wird nichts "gesendet". Die Funktion term wird aufgerufen, und der Rückgabewert wird in left gespeichert. Zitieren
Golfi1812 Geschrieben 4. Mai 2011 Autor Geschrieben 4. Mai 2011 Danke! Zitat von Golfi1812 Sendet mit dem Befehl: "double left = term();" ,die variable left ihren Inhalt an term() und bekommt dann den Inhalt ausgewertet wieder zurück? Deine Antwort: Da wird nichts "gesendet". Die Funktion term wird aufgerufen, und der Rückgabewert wird in left gespeichert. Gut heißt das nun ,dass wenn zum Beispiel die doublevariable left den Wert 1.5 enthält, dass nun mit diesem Wert das Argument der Funktion term(); ist also term mit diesen 1.5 rechnet und dann z.b. 1 zurücksendet. Diese "1" wird nun in der double variable left abgelegt und wenn ich dann den Inhalt von left ausgeben lass wird 1 angezeigt? Habe ich das richtig verstanden? Zitieren
Guybrush Threepwood Geschrieben 4. Mai 2011 Geschrieben 4. Mai 2011 Nein term wird überhaupt nichts übergeben Zitieren
Golfi1812 Geschrieben 4. Mai 2011 Autor Geschrieben 4. Mai 2011 Woher kommt denn der Wert mit dem Term ausgeführt wird? Welcher wert ist das? Zitieren
Guybrush Threepwood Geschrieben 4. Mai 2011 Geschrieben 4. Mai 2011 Wenn du verstehen willst, was da passiert, musst du dir die Funktionen term() und get_token() ansehen, die müssen nämlich auch Bestandteil des Programms sein. . Zitieren
Golfi1812 Geschrieben 4. Mai 2011 Autor Geschrieben 4. Mai 2011 (bearbeitet) Das ist der gesamte Code: #include "std_lib_facilities.h" //------------------------------------------------------------------------------ class Token { public: char kind; // welche Kategorie von Token double value; // für Zahlen: ein Wert Token(char ch) // erstelle ein Token aus einem char :kind(ch), value(0) { } Token(char ch, double val) // erstelle ein Token aus einem char und einem double :kind(ch), value(val) { } }; //------------------------------------------------------------------------------ Token get_token() // lies ein Token aus cin { char ch; cin >> ch; // beachten Sie, dass >> Whitespace-Zeichen wie // Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt switch (ch) { //noch kein case ';': // für "Ausgeben" //noch kein case 'q': // für "Verlassen" case '(': case ')': case '+': case '-': case '*': case '/': return Token(ch); // jedes Zeichen repräsentiert sich selbst case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { cin.putback(ch); // lege die Ziffer zurück in den Eingabestream double val; cin >> val; // lies eine Gleitkommazahl return Token('8',val); // '8' repräsentiert "eine Zahl" } default: error("Ungueltiges Token"); } } //------------------------------------------------------------------------------ double expression(); // liest einen Ausdruck ein und wertet ihn aus //------------------------------------------------------------------------------ double term(); // liest einen Token ein und wertet ihn aus //------------------------------------------------------------------------------ double primary() // liest einen Faktor ein und wertet ihn aus { Token t = get_token(); switch (t.kind) { case '(': // behandle'(' Ausdruck ')' { double d = expression(); t = get_token(); if (t.kind != ')') error("')' erwartet"); return d; } case '8': // wir verwenden '8' zur Repräsentation einer Zahl return t.value; // liefere den Wert der Zahl zurück default: error("Faktor erwartet"); } } //------------------------------------------------------------------------------ int main() try { while (cin) cout << expression() << '\n'; keep_window_open(); } catch (exception& e) { cerr << e.what() << endl; keep_window_open(); return 1; } catch (...) { cerr << "Ausnahme\n"; keep_window_open(); return 2; } //------------------------------------------------------------------------------ double expression() { double left = term(); // liest einen Token ein und wertet ihn aus Token t = get_token(); // hole das nächste Tolen while(true) { switch(t.kind) { case '+': left += term(); // werte Term aus und addiere t = get_token(); break; case '-': left -= term(); // werte Term aus und subtrahiere t = get_token(); break; default: return left; // keine weiteren + oder –; Antwort zurückliefern } } } //------------------------------------------------------------------------------ double term() { double left = primary(); Token t = get_token(); // hole das nächste Tolen while(true) { switch (t.kind) { case '*': left *= primary(); t = get_token(); break; case '/': { double d = primary(); if (d == 0) error("Division durch null"); left /= d; t = get_token(); break; } default: return left; } } }[/PHP] In der Funktion term wird direkt wieder primary() aufgerufen. Aber ich verstehe einfach eins nicht.................... Was hat es mit dieser doublevariable namens left auf sich? Was wird in sie in den bestimmten Zeilen eingelesen und welchen Wert speichert sie wann und wo? Bitte klärt mich auf anhand der Zeilen wann und wo welche variable welchen Wert speichert und so weiter. Ich steh grade total auf dem Schlauch................ Bitte helft mir doch einfach und gebt euch etwas Mühe! Danke Bearbeitet 4. Mai 2011 von Golfi1812 Zitieren
Klotzkopp Geschrieben 5. Mai 2011 Geschrieben 5. Mai 2011 Was wird in sie in den bestimmten Zeilen eingelesen und welchen Wert speichert sie wann und wo? Bitte klärt mich auf anhand der Zeilen wann und wo welche variable welchen Wert speichert und so weiter.Da die Funktionen ihre Werte letztendlich von cin einlesen, kommt das darauf an, was der Benutzer eingibt. Bitte helft mir doch einfach und gebt euch etwas Mühe!Aber sonst geht's noch? Du verlierst kein Wort darüber, was das Programm tut. Du fragst uns nach dem Zweck von Funktionen, die du uns gar nicht gezeigt hast. Und dann beklagst du dich darüber, dass wir uns keine Mühe geben? Weißt du, was das Programm tut? Weißt du, was hier mit Grammatik gemeint ist? Zitieren
Guybrush Threepwood Geschrieben 5. Mai 2011 Geschrieben 5. Mai 2011 und gebt euch etwas Mühe! Evtl. solltest du dir die Mühe machen und dein Buch nochmal von vorne durcharbeiten da die Dinge die du hier fragsr ganz Elementare Dinge sind. Wenn du die schon nicht verstanden hast macht es keinen Sinn andere Themen durchzulesen... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.