Taschenrechner



  • Ich komme nicht durch weil bei Stroustrup C++
    kann mann nur von Taste eingeben
    ich wurde gern von Datei rechnen .

    Jems



  • Jems schrieb:

    kann mann nur von Taste eingeben
    ich wurde gern von Datei rechnen .
    Jems

    Mach's erst mal mit cin. Es sollte kein Problem sein, das hinterher auf einen anderen Eingabestream umzustellen.



  • ich habe schon gemacht und ich klapp nicht weiter

    Jems



  • Jems schrieb:

    ich habe schon gemacht und ich klapp nicht weiter

    Du sollst auch nicht klappen.

    Wo genau klemmt's denn? Fehlermeldung?



  • MFK schrieb:

    Jems schrieb:

    ich habe schon gemacht und ich klapp nicht weiter

    Du sollst auch nicht klappen.

    😃 😃 😃



  • Was genau klappt denn nicht? Für die Umstellung von cin auf File-Eingabe mußt du legiglich die verwendeten Streams umstellen:

    ifstream fin("Input.txt");
    
    // anschließend alle Vorkommen von cin ändern nach fin
    // eventuell solltest du die Eingaben auf den Bildschirm reflektieren
    


  • das ist mein programm
    und geht bei mir nicht wenn ich von datein rechnen will

    #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;
    
       cout<<"forme eingeben \n"<<"\n";
    
        while (cin) {
            get_token();
            if (curr_tok == END) break;
    
            if (curr_tok == PRINT) continue;
    
           cout << expr(false) << "\n";
        }
    
        return no_of_errors;
    
    }
    


  • Erstmal kannst du die Funktionen get_token() und error() auch als void deklarieren - ich sehe zumindest keine Stelle, an der der Rückgabewert von Interesse ist (dann mußt du die Rückgabe in get_token() jedoch ändern zu "curr_tok=xxx;return;").

    Und das zweite: Was funktioniert nicht, wenn du von Datei rechnen willst? "geht nicht" ist eine miserable Fehlerbeschreibung.



  • Hat jemand gegen geld ein Lösung ?

    ich bin Dümmy



  • Eine Lösung wofür? Du hast noch nicht einmal erklärt, wo dein Problem ist.

    PS: Versuch mal folgendes:

    #include <fstream>
    ifstream fin;
    
    // alle Taschenrechner-Funktionen übernehmen
    // in get_token() ersetze cin durch fin
    
    int main(int argc,char*argv[]);
    {
      if(argc>=1)
        fin.open(argv[1]);
      else
        exit(0);
    
      while(fin) {
        get_token();
        if (curr_tok == END) break;
        if (curr_tok == PRINT) continue;
        cout << expr(false) << "\n";
      }
      return no_of_errors;
    }
    


  • error

    2 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp 'ifstream' is used as a type, but is not defined as a type.
    8 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `{' token

    18 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `<<' token



  • Jems schrieb:

    2 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp 'ifstream' is used as a type, but is not defined as a type.

    *grübelt* *denkt etwas länger nach* ups, da fehlt wohl ein using dazwischen. (aber du solltest auch etwas nachdenken, nur abschreiben kann ja jeder)

    Jems schrieb:

    8 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `{' token

    Da steht doch ganz klar, wo der Fehler liegt - vor dem "{", laso höchstwahrscheinlich am Ende der vorigen Zeile.

    Jems schrieb:

    18 C:\Dokumente und Einstellungen\chimi\Desktop\SansNom1.cpp syntax error before `<<' token

    Hast du den Schnipsel so compiliert oder in deinen vorhandenen Quelltext eingearbeitet?



  • wie kann ich 1 programm auf 2 programm einfugen ?

    #include <fstream>
    ifstream fin;
    
    // alle Taschenrechner-Funktionen übernehmen
    // in get_token() ersetze cin durch fin
    
    int main(int argc,char*argv[]);
    {
      if(argc>=1)
        fin.open(argv[1]);
      else
        exit(0);
    
      while(fin) {
        get_token();
        if (curr_tok == END) break;
        if (curr_tok == PRINT) continue;
        cout << expr(false) << "\n";
      }
      return no_of_errors;
    }
    
    #include <iostream>      // Ein-/Ausgabe
    #include <string>        // Strings
    #include <map>           // map
    #include <cctype>        // isalpha() usw.
    #include <sstream>
    #include <fstream>
    
    ifstream fin;
    
    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;
    } 
    
    // alle Taschenrechner-Funktionen übernehmen
    // in get_token() ersetze cin durch fin
    
    int main(int argc,char*argv[]);
    {
      if(argc>=1)
        fin.open(argv[1]);
      else
        exit(0);
    
      while(fin) {
        get_token();
        if (curr_tok == END) break;
        if (curr_tok == PRINT) continue;
        cout << expr(false) << "\n";
      }
      return no_of_errors;
    
    }
    


  • Jems schrieb:

    wie kann ich 1 programm auf 2 programm einfugen ?

    Häh?

    #include <iostream>      // Ein-/Ausgabe
    #include <string>        // Strings
    #include <map>           // map
    #include <cctype>        // isalpha() usw.
    #include <sstream>
    #include <fstream>
    
    ifstream fin;
    
    using namespace std;
    

    die letzten beiden Zeilen würde ich ja andersrum schreiben 😉

    int main(int argc,char*argv[]);
    {
      //...
    }
    

    Lies dir die Fehlermeldungen deines Compilers durch, dann sollte es funktionieren.



  • Lern erstmal Deutsch.


Anmelden zum Antworten