String lesen und verändern



  • Hallo,
    also folgendes Problem. Ich habe eine recht komplexe Gleichung die ich über C++ einlesen und ausrechnen will. So weit so gut. Der String wird eingelesen und dann als doubble verwendet zum rechnen. Die Variable muss leider als Doubble verwendet werden. Mein eigentliches Problem liegt in der Gleichung selbst und zwar wird diese von Matlab einfach ausgegeben und da stehen dann dinger drin wie sin(45/180*pi)^2. Dieses ^2 kennt C++ ja nicht unter Doubble. Wie kann ich da gegen vor gehn?
    Mein erster Gedanke war einen Parser zu basteln, allerdings habe ich damit keine Erfahrung und bei google habe ich nichts brauchbares gefunden. Ich müsste den Algorithmus auch so Programmieren das er sobald er dieses Zeichen findet "^" die rechenoperation davor nimmt und die Zahl danach und das in einen pow Befehl schreibt. Da bin ich ein wenig überfordert. Also so synthaxtechnisch.
    Mein 2. Gedanke war vielleicht eine neue Lybarie zu schreiben die ihm bei bringt was das mit dem ^ auf sich hat. Allerdings habe ich darin gleich null Erfahrung.

    Währe für jede Hilfe dankbar.

    M.f.G



  • Ich weiß nicht, ob es klug ist, mit solch komplexen Teil anzufangen. Hier im Magazin gibt es ein Artikel zum Compiler/Parserbau:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-201764.html



  • Naja das ist mehr oder minder Freiwillig :D.
    Ich habe ja schon Grunderfahrung und würde mich als LEICHT Fotgeschritten bezeichnen. Will das ja halt auch lernen:).
    Ich schau mir das mal an und meld mich wieder. Danke erstmal:)



  • Also nach ausreichendem Durchlesen habe ich festgestellt das das nicht ganz das richtige ist. Ich möchte, wenn es geht, das ganze gerne in mein Programm impliementieren und kein extra Programm haben. Ich habe noch geforscht, mir auch mal bei google die ergebnisse zu math parser angeschaut, aber irgendwie alles nicht das richtige. Ich weiss net mehr wirklich weiter.
    Es muss doch ne mäglichkeit geben C++ zu sagen was er bei dem Zeichen "^" in einer doublevariable machen soll.



  • Das ist ja nicht trivial. Denn es reicht ja zum Beispiel nicht stumpf von links nach rechts aufzulösen, da man auch auf die Operatorenbindung achten muss (zB 3+2*4). Einfacher umzusetzen ist da die polnische Notation.

    Ansonsten musst du dir einen Baum aufbauen aus dem Term. Angefangen bei dem Operator mit der schwächsten Bindung.

    Result = pow(TERM1, TERM2)
    TERM1 = sin(45/180*pi)
    TERM2 = 2

    TERM1 wird dann zu:
    Result = sin(TERM1)
    TERM1 = 45/180*pi

    TERM1 wird dann zu:
    Result = TERM1/TERM2
    TERM1 = 45
    TERM2 = 180*pi

    usw. bis nur noch atomare Ausdrücke da sind. Dann brauchst du den Baum nur noch ausführen. Musste so einen Kram mal in Ada für einen AST aus C-Code machen. War kein Spaß, will ich mich eigentlich auch nicht mehr mit beschäftigen. 😉



  • Kev-Man schrieb:

    Es muss doch ne mäglichkeit geben C++ zu sagen was er bei dem Zeichen "^" in einer doublevariable machen soll.

    Du mußt einen Parser bauen. Man kann zwar den Boost Spirit LL-Parser nehmen, das ist dann reines C++, aber trotzdem ist es ein Parser und kein "normales" Sprachkonstrukt.



  • Kev-Man schrieb:

    ...Mein eigentliches Problem liegt in der Gleichung selbst und zwar wird diese von Matlab einfach ausgegeben und da stehen dann dinger drin wie sin(45/180*pi)^2. Dieses ^2 kennt C++ ja nicht unter Doubble...

    Auch eine Stringinterpretierung vom Rest kennt C++ nicht, auch hier musst du bereits einen (und sei es noch so einfachen) Parser verwenden. Also auch ohne dein ^ brauchst du bereits etwas in der Art.

    cu André



  • pharmacy;



  • pharmacy;



  • mammamia;


Log in to reply