String in Rechenzeichen
-
hallo ich plane grad einen variablenrechner
da soll man nen term eingeben (mit variablen(aber des is jetzt egal) und dann kann man den öfters ausrechnenich hab schon geschafft jedes zeichen des terms in nen einzelnen String zu packen, aber wie kann man wenn jetzt ein String in ein Rechenzeichen umwandeln, da gibts ja kein Format
also wenn jetzt:s[1] = "1"; s[2] = "+"; s[3] = "2";die s[1] und s[3] zu interger is ja gein problem aber was mach ich mit dem s[2]

also bye mollitz
-
Hallo
du kannst nicht aus dem Zeichen einfach eine Rechenoperation machen. Das must du sozusagen per Hand auswählen
int Ergebnis; int Zahl1,Zahl2; char Zeichen = '+'; switch (Zeichen) { '+' : Ergebnis = Zahl1 + Zahl2; break; '-' : Ergebnis = Zahl1 - Zahl2; break; ... }bis bald
akari
-
so hab ich's mir auch schon überlegt
allerdings was ist wenn der term jetzt so ist:
1+3+y+2*1/3-43+1
bye mollitz
-
Dann mußt Du ein wenig mehr Gehirnschmalz einsetzen und zuerst feststellen, in welcher Reihenfolge die Operationen ausgeführt werden müssen (Punktrechnung vor Strichrechnung). Am Prinzip, das akari gezeigt hat, ändert sich dadurch nichts.
Wenn Du akaris Code in eine Funktion packst und jeweils den Operator und die Werte übergibst und als Rückgabewert jeweils die Teilsumme erhälst, bist Du schon fast fertig.
-
sowas hab ich vor längerem zum Spaß mal programmiert, kann man natürlich noch
beliebig erweitern hier nur die Variante mit +, -, *, /ShowMessage(Calc("1 +5*6+4"));double __fastcall TForm1::Calc(AnsiString sF) { double dReturn=0; sF = NoSpace(sF); char cOperator; int iPos = -1, iTempPos; iTempPos = sF.AnsiPos("*"); if (iTempPos > 0) iPos = iTempPos; iTempPos = sF.AnsiPos("/"); if (iTempPos > 0) iPos = iTempPos; iTempPos = sF.AnsiPos("+"); if (iTempPos > 0) iPos = iTempPos; iTempPos = sF.AnsiPos("-"); if (iTempPos > 0) iPos = iTempPos; if (iPos > 0) { cOperator = sF.c_str()[iPos -1]; AnsiString sLeft = sF.SubString(1, iPos -1); AnsiString sRight = sF.SubString(iPos +1, sF.Length()); /* ShowMessage("Left: '" + sLeft + "' Right: '" + sRight + "'"); */ switch (cOperator) { case '+': dReturn = Calc(sLeft) + Calc(sRight); break; case '-': dReturn = Calc(sLeft) - Calc(sRight); break; case '*': dReturn = Calc(sLeft) * Calc(sRight); break; case '/': dReturn = Calc(sLeft) / Calc(sRight); break; } } else { return sF.ToDouble(); } return dReturn; } AnsiString __fastcall TForm1::NoSpace(AnsiString sIn) { AnsiString sReturn = ""; for (int i = 0; i < sIn.Length(); i++) { char cChar = sIn.c_str()[i]; if (cChar != ' ') sReturn = sReturn + sIn.c_str()[i]; } return sReturn; }
-
Hallo
außerdem ist im Forum zum Thema "Taschenrechner" auch einiges zu finden.
bis bald
akari
-
was ist mit geklammerten ausdrücken? z.b. (1 + 2) * 3 = ? oder werden die nicht unterstützt?

-
Am besten, man benutzt dafür einen Top-Down-Parser, anstatt selbst irgendwelche Pseudo-Parser-Routinen zu schreiben... (siehe auch EBNF-Grammatik)