[geschlossen] Problem beim Taschenrechner mit rekursiven Abstieg



  • Ich habe meinen Text nochmal überarbeitet. Hoffe das er nun leserlicher ist. ps ist mein erster Beitrag in einem Forum.

    Hallo,
    Ich benutzt das Buch C++ Einführung und professionelle Programmierung von Ulrich Breymann. Jedesfalls geht es im Kapittel 4.2.8 um das Programmiren eines Taschenrechner mithilfe der rekursiven Abstieg. Jedenfalls wird Hierfür ein Ableitungsbaum beutztt der so aussieht.

    Ausdruck     
                                 |
                  ------------Summand ----------
                 |              |               |
                Faktor           *             Faktor
             -------|------                        |
            |       |      |                      Zahl
           "("      |      ")"                       |    
                    |                              Ziffer
         ---------Ausdruck-------                    |
        |           |            |                   4
    Summand         +          Summand
         |                         |
       Faktor                    Faktor
          |                          |
         Zahl                       Zahl
           |                          |
         Ziffer                     Ziffer
         |    |                         |
         1    2                         3
    

    Hierbei wird (12+3)*4 ausgerechnet.

    im Buch steht nun diese Programmcode;

    using namespace std;

    int main (void){
    
    char ch;
    while(true){
    
    cout << " \n>>";
    cin.get(ch);
    
    if(ch != 'e')
    cout << ausdruck (ch);
    
    else break;
    
    }
    
    }
    
    long ausdruck(char& c) {              // übergabe per Referenz
    
    long a;                               // hilfsvariable
    
    if (c == '-'){                        // - im Eingabestom überspringen
    cin.get(c);
    a = -summand(c);                      // rest an summand() übergeben
    }
    
    if (c == '+'){
    
    cin.get(c);                             // + überspringen
    a = summand(c);
    }
    
    while (c== '+'|| c == '-'){             //aufgepasst
    
    if(c == '+'){
    cin.get(c)                              // + überspringen
    a += summand (c);
    }
    
    else {
    cin.get(c);                            // - überspringen
    a -= summand(c);
    }
    
    return a;
    
    }                                   // ende von while
    
    }                                   // ende der Funktion
    
    long summand (char & c){
    
    long s = faktor(c);
    while (c == '*' || c == '/'){
    
    if (c=='*') {
    cin.get(c); // * übersprinegn
    s *= faktor(c);
    }
    
    else {
    cin.get(c); // / übersprinegn
    s /= faktor(c);
    }
    
    }                                     // ende der Schleife
    
    return s;
    
    }                                     // ende der Funktion
    
    long faktor(char & c){
    long f;
    
    if (c == '('){
    cin.get(c);                                // ( übersprinegn
    f = ausdruck (c);
    
    if( c != ')'){
    cout << "Rechte Klammer fehlt!\n";
    else cin.get(c) ;                         // ) übersprinegn
    
    }
    else f = zahl (c);
    return f;
    
    }                                     
    
    long zahl (char & c) {
    
    long z = 0;
    while(isdigit(c)){                           // d.h. c >= '0' && c <= '9'
    
    /*isdigit() ist eine Fuktion was zu true ausgewertet wird falls c ein ziffernzeichen ist. Muss #inlcude <cctype> verwenden.*/
    
    z = 10*z + long (c- '0');
    cin.get(c);
    }
    
    return z;
    
    }
    

    Nun heißt es, dass es den Leser über lassen wird das Programm zum laufen zu bringen, zu vervollständigen, einschließlich trennung von Prototypen und Definitionen.

    Mir gelingt dies aber nicht. Könnt ihr mir hierbei bitte helfen und mir nochmal das ganze Prinzip genauer erklären. Danke

    Die eigentliche Aufgabe ist es das Programm zum laufen zu bringen.
    Das Problem ist Hierbei die Tatsache, dass es bei mir nicht die Aufgabe richtig berechnet. Es funktioniert also nicht trichtig außerdem fehlen noch die Funktionsprototypen.



  • Wenn du nicht in der Lage bist, den Code hier richtig darzustellen, brauchst du auch keine Hilfe erwarten.



  • Da hast du wohl das falsche Unterforum erwischt, denn hier ist C++/CLI, eine .NET Sprache. Bei deinem Code handelt es sich um C++, da bist du im ISO C++ Forum gut aufgehoben (mit etwas Glück wird dein Beitrag verschoben).

    Mir gelingt dies aber nicht.

    Erkläre uns wo du stehst - was geht nicht? Kompiliert es nicht? Linkt es nicht? Stürzt es ab? Tut es nicht das was es sollte?

    Falls dein Programm lauffähig ist, empfehle ich dir es mit einem Debugger (z.B. mit Visual Studio) zu untersuchen. Damit kannst du Zeile für Zeile durchgehen und kannst die aktuellen Werte überprüfen.

    Edit:
    Doppelpost, hier gehts weiter: https://www.c-plusplus.net/forum/333995


Log in to reply