Definition während Laufzeit?



  • Hallo, ich habe ein Problem mit der grundsätzlichen Rangehenweise an eine Sache. Und zwar möchte ich, einfach gesagt eine Art Taschenrechner programmieren der auch mit mathematischen Funktionen umgehen können soll, wie z.B. dem Integrieren einer Funktion. Eine Methode zu schreiben die mir eine Funktion integriert ist kein Problem, ich mache das ungefähr nach dem Prinzip:

    double integrate(double x0,double a, double b)
    {
       ... 
       y=x0+2
       h=(b-a)/N
    
       for(int i=1;i<N;i++)
       {  
          y+=(x0+i*h)+2    //Hier heißt integrierende Funktion dann eben y(x)=x+2
       }
    }
    

    Irgenwie so! Mein Problem ist nun, dass ich gerne das Programm so gestalten möchte, dass wärend der Laufzeit die zu integrierende Funktion definiert werden kann, also obige Methode eine Konsoleneingabe z.B. der Form 4*x*x+x-3 integrieren kann. Dazu muss ich ja aber irgendwie den Eingegebenen String der ja aber Konstanten, Variablen und mathematischen Operatoren darstellen soll in die Methode reinkriegen, so dass die dieses eingegebene y(x) integrieren kann. Für Hilfe zur Rangehensweise an dieses Problem wäre ausgiebige Dankbarkeit garantiert! 😃



  • Keine Ahnung, obs was einfacheres gibt, beim Compilerbau macht man es mit
    http://de.wikipedia.org/wiki/Lexikalischer_Scanner
    http://de.wikipedia.org/wiki/Parser
    usw...



  • http://www.codeproject.com/KB/string/SParser.aspx

    Schau dir beispielsweise mal diesen Code an. Hilft dir sicherlich weiter. = )



  • vielleicht für dieses Problem ein wenig zu aufgeblasen aber im allgemeinen
    bietet sich boost-spirit an!



  • Ok, scheint doch keine ganz triviale Geschichte zu sein! Danke Euch allen schonmal, für die Antworten!



  • Nein, ist es wirklich nicht. C++ ist keine Scriptsprache, wo ein beliebiger String einfach in einen ausführbaren Ausdruck umgewandelt werden kann. C++ ist eine Compilersprache, das bedeuted dass jeder ausdruck in dem Moment wo du deine exe ausführst bereits ausgewertet ist. Du kannst also deinen Code nichtmehr nachträglich verändern.

    Du musst also nun Code schreiben, der die Aufgabe hat den eingelesenen String zu parsen und ihn in ein Format zu bringen das du dann verarbeiten kannst.

    Wie das Format aussieht? nun, das ist deine Sache. Für einfache Polynome würde sich aber ein einfaches array anbieten in dem du die koeffizienten speicherst.

    Die verarbeitende Funktion um einen Funktionswert auszurechnen wäre dann in etwa so:

    //koeffizienten des polynoms. position gibt grad an, also ist koeffizienten[0]
    //der koeffizient des konstanten teil des polynoms
    //x^2+2x+3 wäre also das array {3,2,1}
    std::vector<double> koeffizienten;
    
    double calc(int x)//funktionswert an stelle x
    {
        double xpow=1;
        double result=0;
        for(int i=0;i<koeffizienten.size();++i)
        {
            result+=koeffizienten[i]*xpow;
            xpow*=x;
        }
        return result;
    }
    

    wie du den String nun in den vector kriegst ist deine Sache, allerdings ist boost::spirit eigentlich eine gute wahl, weil es in diesem Fall recht schnell gemacht sein sollte.


Anmelden zum Antworten