![]() |
Stringparser-Problem
hi,
ich habe mir einen kleine Stringpraser nachgebaut für +, -, * und / an sich nichts schweres, doch auch nach dem Studium dieses Artikels ![]() Hat jemand von euch sich schon mal über dieses Problem gedanken gemacht oder vllt einen Lösungsvorschlag? Hier ist noch mal der Code meines Prasers:
Delphi-Quellcode:
grüße
function Termberechnen(const Term: String):Extended;
var tmp1, tmp2: string; begin if Pos('+', Term) > 0 then begin tmp1:= Trim(Copy(Term,1,Pos('+', Term)-1)); tmp2:= Trim(Copy(Term,Pos('+', Term)+1, MaxInt)); result:= Termberechnen(tmp1)+Termberechnen(tmp2); end else begin if Pos('-', Term) > 0 then begin tmp1:= Trim(Copy(Term,1,Pos('-', Term)-1)); tmp2:= Trim(Copy(Term,Pos('-', Term)+1, MaxInt)); result:= Termberechnen(tmp1)-Termberechnen(tmp2); end else begin if Pos('*', Term) > 0 then begin tmp1:= Trim(Copy(Term,1,Pos('*', Term)-1)); tmp2:= Trim(Copy(Term,Pos('*', Term)+1, MaxInt)); result:= Termberechnen(tmp1)*Termberechnen(tmp2); end else begin if Pos('/', Term) > 0 then begin tmp1:= Trim(Copy(Term,1,Pos('/', Term)-1)); tmp2:= Trim(Copy(Term,Pos('/', Term)+1, MaxInt)); result:= Termberechnen(tmp1)/Termberechnen(tmp2); end else begin if Term <> '' then begin result:= StrToFloat(Term); end else begin result:= 0; end; end; end; end; end; end; guitar1 |
Re: Stringparser-Problem
Also ich würds mit der while- oder repeat/until-Schleife machen und den Term so lange durchgehen, bis dass keines der Zeichen mehr vorhanden ist.
Mfg |
Re: Stringparser-Problem
Dadurch, dass du in der Rekursion jeweils zu erst den vordersten Operator wählst, löst du die Formel letztlich von hinten nach vorne. Du solltest also nicht das erste, sondern das jeweils letzte Vorkommen der Operatoren als Trennstelle verwenden um eine Links->Rechts Ordnung zu erhalten.
|
Re: Stringparser-Problem
@Medium: Vielen Dank für den Hinweis mit von links nach rechts, das wars, ich hab mir jetzt ein Pos geschrieben welches hinten anfängt zu suchen und dann klappts auch :-D
hier für alle die das vllt mal gebrauchen können
Delphi-Quellcode:
function PosB(const AChar: Char; const str: String): Integer;
var i: Integer; begin result:= 0; for i := Length(Str)-1 downto 0 do begin if str[i] = AChar then begin result:= i; break; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz