Patrick.Karre Geschrieben 1. Januar 2007 Geschrieben 1. Januar 2007 Hallo Leute, ich habe folgendes Problem, ich habe einen String mit einer Formel: a=10+5*10*5 In die Variable a soll das Ergebnis hinter dem gleichheitszeichen eingetragen werden. In diesem Fall also 260. Das Speichen in die Variable klappt soweit, nur das Rechnen leider nicht. Ich schneide immer einen Teil aus dem String aus, errechne diesen und schreibe ihn mit der Replace Funktion zurück, dabei wird leider nicht immer sauber ersetzt. Hier ist der Code zum errechnen: double calculate(string strEingabe) { // Überprüfung nach Klammern -> REKURSION int iPos = strEingabe.find_first_of('('); if (iPos != -1) { int iNext = strEingabe.rfind(')'); strEingabe.replace(iPos, iNext-iPos, doubleToString(calculate(strEingabe.substr(iPos+1, iNext-iPos-1)))); } // Berechnen der Eingabe. double dNumber=0, dFirstNumber=0, dLastNumber=0, dResult=0;; char cCalculator[4] = {'*', '/', '+', '-'}; for (int i=0; i < sizeof(cCalculator) / sizeof(cCalculator[0]); ++i) { iPos = strEingabe.find_first_of(cCalculator[i]); while (iPos != -1) { // Wir müssen nach den jeweiligen Operatoren suchen. int iLeft=0, iRight=0; for (int j=iPos-1; j >= 0; --j) { iLeft = j; if (IsOperator(strEingabe[j])) break; } for (int j=iPos+1; j <= strEingabe.length(); ++j) { iRight = j; if (IsOperator(strEingabe[j])) break; } // Wir holen uns den String zum berechnen und setzen diesen wieder in den restlichen String ein. dResult = calculator(atof(strEingabe.substr(iLeft, iPos).data()), atof(strEingabe.substr(iPos+1, iRight).data()), cCalculator[i]); strEingabe.replace(iLeft, iLeft+iRight, doubleToString(dResult)); // Nächste Position für den Start bestimmen. iPos = strEingabe.find_first_of(cCalculator[i], iPos+1); } } return atof(strEingabe.data()); } Wo liegt der Fehler, über eine Hilfe würde ich mich freuen. Beste Grüße und gutes neues Patrick
Klotzkopp Geschrieben 1. Januar 2007 Geschrieben 1. Januar 2007 Auf den ersten Blick würde ich sagen: Die Parameter von std::string::substr sind (Start, Anzahl), nicht (Start, Ende).
Patrick.Karre Geschrieben 1. Januar 2007 Autor Geschrieben 1. Januar 2007 Diese beiden Sachen werden allerdings sauber errechnet. Das Problem entsteht bei der Replace Funktion: Wenn z.B. a=10*5+10 eingegeben wird, klappt es ohne Probleme. Wenn aber a=10+5*10 eingegeben wird, kommt misst raus.
Klotzkopp Geschrieben 1. Januar 2007 Geschrieben 1. Januar 2007 Du benutzt sowohl substr als auch replace falsch. Lass dir doch mal die Zwischenergebnisse von substr ausgeben.
Patrick.Karre Geschrieben 2. Januar 2007 Autor Geschrieben 2. Januar 2007 Ich habe jetzt nochmal die Logig geändert und der MISST geht immer noch nicht. Ich lge die Datei in die Anlage, vielleicht kann mir da jemand nochmal helfen. Danke im VorausHausuebung2.zip
Klotzkopp Geschrieben 2. Januar 2007 Geschrieben 2. Januar 2007 Ich habe jetzt nochmal die Logig geändert und der MISST geht immer noch nicht.Dann wird es Zeit für Fehlersuche. Schritt eins: Funktionsaufrufe entschachteln, Zwischenergebnisse prüfen.
etreu Geschrieben 3. Januar 2007 Geschrieben 3. Januar 2007 Was meinst du mit Mist? Heist das einfach nur das dein Ergebnis falsch wird? Wenn ja, dann musst du noch irgendwie die Priorität der Operatoren berücksichtigen.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden