Ich kann nicht mehr C++



  • ich habe ein programm geschrieben und ich will das weiter entwickelt aber leider bekomme ich immer ein Fehler .
    das ist ein Taschenrechner :
    1- Der Funktioniert unter Windows aber nicht unter Linux
    2- Ich wurde gern mein programm weiter entwickelt das heißt der liest meine Funktion unter eine Datein Text und rechnen weiter .

    mein Programm Lautet .

    #include <iostream>      // Ein-/Ausgabe
    #include <string>        // Strings
    #include <map>           // map
    #include <cctype>        // isalpha() usw.
    #include <sstream>
    
    using namespace std;
    
    enum Token_value {
        NAME,        NUMBER,      END,
        PLUS='+',    MINUS='-',   MUL='*', DIV='/',
        PRINT=';',   ASSIGN='=',  LP='(',  RP=')'
    };
    
    Token_value curr_tok = PRINT;
    
    double term(bool);
    double prim(bool);
    double error(const string& s);
    Token_value get_token(void);
    
    double expr(bool get)         // Addieren und Substrahieren
    {
        double left = term(get);
    
        for (;;)    // "'forver', siehe unten
            switch (curr_tok) {
                case PLUS:
                    left += term(true);
                    break;
                case MINUS:
                    left -= term(true);
                    break;
                default:
                    return left;
            }
    }
    
    double term(bool get)        // Multipliziere und dividiere
    {
        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 number_value;
    string string_value;
    double expr(bool);
    
    map<string, double> table;
    
    double prim(bool get)       // behandelt Primaries
    {
        if (get)
            get_token();
    
        switch (curr_tok) {
            case NUMBER:              // Gleitkommakonstante
            {
                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:        // Einstelliges Minus
                return -prim(true);
            case LP:
            {
                double e = expr(true);
                if (curr_tok != RP) return error(") erwartet");
                get_token();      // Verschlucke ')'
                return e;
            }
            default:
            return error("primary erwartet");
        }
    }
    
    Token_value get_token()
    {
        char ch;
        do {    // Überspringe Whitespaces außer '\n'
            if(!cin.get(ch)) return curr_tok = END;
        } while (ch!='\n' && isspace(ch));    
        switch (ch) {
            case 0:
    //        case ':':
                return curr_tok=END;
            case ';':
            case '\n':
                return curr_tok=PRINT;
            case '*':
            case '/':
            case '+':
            case '-':
            case '(':
            case ')':
            case '=':
                 return curr_tok=Token_value(ch);
    //        case ':':
    //             return curr_tok=END; //:end oder:exit um das Prog. zu verlassen
            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:         // NAME, NAME=, oder Fehler
                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;
        }
    }
    
    int no_of_errors;
    
    double error(const string& s)
    {
        no_of_errors++;
        cerr << "Fehler: " << s << '\n';
        return 1;
    } 
    
    int main()
    {
        table["pi"] = 3.1415926535897932385;  // Vordefinierte Namen einfügen
        table["e"] = 2.7182818284590542354;
    
        while (cin) {
            get_token();
            if (curr_tok == END) break;
            if (curr_tok == PRINT) continue;
                cout << expr(false) << "\n";
        }
    
        return no_of_errors;
    }
    

    <edit>Bitte Code-Tags verwenden!</edit>



  • - Wenn du eine Frage hast, solltest du sie stellen
    - Code-Tags verbessern die Lesbarkeit
    - Fehlermeldung angeben



  • hui, is das nich der Stroustrop Taschenrechner?
    naja, wie dem auch sei, mal zu deiner Frage

    Jems schrieb:

    ich habe ein programm geschrieben und ich will das weiter entwickelt aber leider bekomme ich immer einen Fehler.

    Sehr interessant.
    Ich hab da auch ein Problem: Immer wenn ich bei meinem Windows da hinklick kommt irgendwie son Ding. Was soll ich da jetzt machen?
    => Bissl genauer bitte ...

    1- Der Funktioniert unter Windows aber nicht unter Linux

    Wenn dus 1:1 aus dem Buch abgeschrieben hast geht er unter linux sowohl als auch windows da hier nur Standard-Funktionen verwendet werden.
    Deshalb mein Rat: Schreibs nochmal ab oder Kompiliers seperat für beide Systeme (falls du das nicht getan hast)

    2- Ich wurde gern mein programm weiter entwickelt das heißt der liest meine Funktion unter eine Datein Text und rechnen weiter .

    ... was ? ..



  • ich habe ein programm geschrieben und ich will das weiter entwickelt aber leider bekomme ich immer ein Fehler .
    das ist ein Taschenrechner

    aha;-) glaub ich dir nicht;-) wenn du 2 zeilen änderst ist das nicht dein code;-)

    schau mal da (Stroustrop Taschenrechner):
    http://souptonuts.sourceforge.net/code/desktop_calc.cc.html

    compilier den mal unter win u linux...
    cu



  • wie kann mein programm von Fichier.txt



  • Es soll ein einfacher Taschenrechner simuliert werden, der die vier Grundrechenarten {+,-,*, /}
    beherrscht. Die Eingabe der Daten erfolgt über eine ASCIIDatei
    mit der Endung “.txt”, die der
    Rechner einliest. Nach der Eingabe berechnet der Taschenrechner die Formel, die ihm als ASCIIText
    übermittelt wurde. Für die Auswertung und Berechnung der Formel benutzt der Taschenrechner einen
    Stack. Auf Wunsch kann das programm jeweils den aktuellen Stackinhalt waehrend des
    Rechenvorgangs auf dem Bildschirm ausgeben. Nachdem die Formel berechnet wurde, wird der
    gesamte Eingabetext sowie das Ergebnis auf dem Bildschirm ausgegeben. Trat ein Fehler in der
    Eingabe auf, dann wird der Fehler angezeigt.



  • ich habe eine text dadein wo steht (2+5)*5
    wie kann ich von fichier.txt mein programm compilieren



  • und auch hier versteh ich die threadüberschrift net!
    😮


Anmelden zum Antworten