Patrick.Karre Geschrieben 1. Januar 2007 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Januar 2007 Teilen Geschrieben 1. Januar 2007 Auf den ersten Blick würde ich sagen: Die Parameter von std::string::substr sind (Start, Anzahl), nicht (Start, Ende). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Patrick.Karre Geschrieben 1. Januar 2007 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Januar 2007 Teilen Geschrieben 1. Januar 2007 Du benutzt sowohl substr als auch replace falsch. Lass dir doch mal die Zwischenergebnisse von substr ausgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Patrick.Karre Geschrieben 2. Januar 2007 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. Januar 2007 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 3. Januar 2007 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.