Zusammengefassten String ausrechnen lassen



  • Hallo Experten,

    ich bräucht dringend eure Hilfe.

    In meinem Programm werden vier Zufallszahlen erzeugt und auf die Texteigenschaft von Labels ausgegeben.

    Danach hat man die Möglichkeit, sich eine eigene Rechnung zu "basteln". Dazu hat man alle vier Grundrechnungsoperatoren zur Verfügung.

    Man klickt auf die erste Zahl zB: 40, dann auf einen Operator zB: + bis man eine beliebige Rechnung mit vier Zahlen erstellt hat. zB 40 + 30 - 20 * 2.

    Jede dieser sieben Infornmationen ist auf die Texteigenschaft eines Labels abgespeichert.

    jetzt habe ich 4 werte der zahlen, in meinem fall auf die variablen hv1,hv2,hv3 und hv4 gespeichert.

    Über den code:
    this->lblErgebnisÜberprüfen->Text = String::Concat(hv1.ToString(),lblZeichen1->Text ,hv2.ToString(),lblZeichen2->Text, hv3.ToString(),lblZeichen3->Text , hv4.ToString());
    habe ich nun alle Informationen zu einem String zusammengetragen. (für die lblzeichenx->Texte steht jeweils einer der vier operatoren in der texteigenschaft (+, -, * oder /).

    wie kann ich jetzt auf eine neue variable, zB erg2, diesen String ausrechnen lassen, dass ich das Ergebnis als Zahlenwert erhalte?

    Habe es mit
    erg2 = Int32::Parse(lblErgebnisÜberprüfen->Text);
    versucht, doch das funktioniert nicht.

    Ich hoffe, derjenige der mir vielleicht weiterhelfen könnte, versteht was ich meine.

    Danke jetzt schon für eure Hilfe,

    jay



  • Hi

    bin was c++ angeht pur Anfängerin aber du solltest anstatt int32 nur int oder long eintragen.



  • Wenn ich dich richtig verstehe möchtest Du den String "40 + 30 - 20 * 2" einlesen, ausrechnen und das Ergebnis in eine Variable (Int32) abspeichern.

    Das ist nicht so einfach. Hier mal ein Einstiegspunkt:
    http://social.msdn.microsoft.com/Forums/de-AT/visualcsharpde/thread/d8e83be5-9cb5-40de-a84d-6153b370fa34
    http://www.codeproject.com/KB/cs/MathParser.aspx

    Ev. kannst Du das was Du erreichen möchtest aber auch auf anderem Weg durchführen, so dass Du das Problem umgehst.

    Simon



  • Danke für die raschen Antworten, helfen aber im Moment gerade nicht weiter. Das ist immer das Problem, man weiß genau wie mans machen will, aber wie sag ichs dem Rechner, dass er es auch so umsetzt.............:-(

    Kann man nicht irgendwie den String an eine Variable so weitergebn, dass er über diesen String automatisch das Ergebnis ausrechnet??

    ob ich jetzt erg2 händisch programmieren würde mit zB: erg2 = hv1+hv2-hv3*hv4
    sollte doch auch irgendwie machbar sein, wenn ich die Definition von erg2 bereits in einem String zusammengefasst habe, und die Texteigenschaft als Definition für erg2 herangezogen werden kann??



  • Verstehe nicht was Du meinst. Sorry.



  • Beispiel:

    meine vier zufallszahlen lauten 4, 8, 10 und 12.

    Auf der oberfläche sieht man jetzt zusätzlich zu den vier zahlen, alle 4 grundrechnungsoperatoren --> abgespeichert auf labels.

    man klickt jetzt mit der maus auf die 4 --> die 4 wird an die erste stelle geschrieben.

    dann klickt man zB auf das plus --> das pluszeichen wird hinter die 4 gesetzt.

    dann klickt man auf zB 10 --> jetzt stehen wir bei 4 + 10 usw.
    bis man zu einer rechnung mit vier zahlen gekommen ist.

    In diesem Beispiel könnte jetzt stehen:
    4 + 10 - 12 * 8,

    hv1 bekommt jetzt den wert4
    hv2 bekommt den wert 10
    hv3 bekommt den wert 12
    hv4 bekommt den wert 8

    labelzeichen1->text = "+"
    labelzeichen2->text = "-"
    labelzeichen3->text = "*"

    es könnte aber auch 10 - 4 + 8 / 12 durch den Benutzer angegeben worden sein. Dann würden sich die werte für hv1 - hv4 und für die lblzeichen1-3 dementsprechend ändern.

    ( zusätzlich als info: in dem programm geht es darum, dass man ein fertiges Ergebnis angezeigt bekommt. Dieses Ergebnis setzt sich aus meinen vier Zufallszahlen zusammen. Nun muss der Benutzer alle vier Zahlen inkl. den Rechenoperatoren so anordnen, dass er über seine erstellte Rechnung, zum richtigen Ergebnis kommt. Daher brauche ich auch so dringend das Ergebnis, der selbst erstellten Rechnung, damit ich das vorgegebene Ergebnis mit dem selbsterrechneten Ergebnis vergleichen kann.)

    mit dem Befehl wie vorhin scho erwähnt:
    this->lblErgebnisÜberprüfen->Text = String::Concat(hv1.ToString(),lblZeichen1->Text ,hv2.ToString(),lblZeichen2->Text, hv3.ToString(),lblZeichen3->Text , hv4.ToString());
    bekomme ich jetzt die ganze zusammengestellte Rechnung auf einen string in texteigenschaft von lblErgebnisÜberprüfen abgespeichert.

    Wenn ich den lblErgebnisÜberprüfen->Text anzeigen lasse, bekomme ich auch die komplett zusammengestellte Rechnung gezeigt: In dem Fall 4+10-12*8.

    "4+10-12*8" ist jetzt mein gespeicherter String.

    Jetzt will ich auf eine neue Variable, in meinem Fall erg2, diesen String ausrechnen lassen, so dass ich zum Ergebnis als Wert komme, dass ich mit dem Ergebnis dieser beliebigen Rechnung weitermachen kann.

    Ich weiß nicht wie ichs anders darstellen sollte, ich hoffe dass hilft dir weiter, um genau zu wissen, was ich meine.

    Thx



  • Versuch doch mal den erwähnten MathParser zu verwenden.
    Simon



  • Der Matheparser von Codeproject hat aber viele Nachteile (u.a. daß er die Operatorpräzedenzen nicht richtig erkennt).

    Daher empfehle ich mal meine eigenen zwei Parser:
    - natives C++ (bzw. VCL): http://www.c-plusplus.net/forum/p1780654#1780654
    - .NET (C#): Parser für mathematische Formeln

    Edit: es gibt auch noch die Möglichkeit, mittels CodeDOM den Code zu parsen, compilieren und ausführen zu lassen, s. z.B. Formeleditor (auch in C#, aber läßt sich ja einfach nach C++/CLI übersetzen -)


Anmelden zum Antworten