![]() |
Delphi-Version: XE3
Parser - einfache Mathematische Formel
Hey,
ich versuche zur Zeit einen Parser für eine einfache Mathematische Formel (z.B: 2*4/3+5-4) zu schreiben, aber wenn ich z. B. 1*6*5 eingebe kommt 6 raus und nicht 30. :/ Weiß jemand wo ich den Fehler habe und hat vlt noch andere Verbesserungsvorschläge für den Parser? :)
Delphi-Quellcode:
PS: Und wie in dem Kommi zu sehen müsste sich ja i da oben verändern, tut es aber nicht. Oo
unit Logic;
interface uses System.Classes, System.SysUtils, StrUtils; type TBerechnung = class private { Private-Deklarationen } m_EingabeZahl: TStringList; m_EingabeEreignis: String; m_EingabeRechenoperator: String; public { Public-Deklarationen } procedure AddZahl(p_Parameter: String); procedure AddEreignis(p_Parameter: String); procedure PosExRechnen(m_EingabeZahl: TStringList); function GetErgebnis(): String; procedure Erstelle; procedure Loesche; procedure Parser(zwErgebnis: String; zErgebnis: Double; i: Smallint; opFolge: Integer); end; implementation procedure TBerechnung.Erstelle; begin m_EingabeZahl := TStringList.Create; end; procedure TBerechnung.Loesche; begin m_EingabeZahl.Free; end; procedure TBerechnung.AddZahl(p_Parameter: String); begin m_EingabeZahl.Add(p_Parameter); end; procedure TBerechnung.AddEreignis(p_Parameter: String); begin if p_Parameter = 'C' then begin m_EingabeZahl.Clear; m_EingabeEreignis := ''; m_EingabeRechenoperator := ''; end; //Parser if p_Parameter = '=' then begin PosExRechnen(m_EingabeZahl); end; end; procedure TBerechnung.Parser(zwErgebnis: String; zErgebnis: Double; i, opFolge: Integer); begin zwErgebnis := FloatToStr(zErgebnis); m_EingabeZahl.Delete(i); m_EingabeZahl.Delete(i); m_EingabeZahl[i - 1] := zwErgebnis; i := i - 2; //schauen, warum i nicht verändert if i = m_EingabeZahl.Count - 1 then begin opFolge := opFolge + 1; end; end; procedure TBerechnung.PosExRechnen(m_EingabeZahl: TStringList); var opFolge, arPos: Integer; i: Smallint; zErgebnis: Double; zwErgebnis: String; rOp: String; begin i := -1; opFolge := 1; while (i < m_EingabeZahl.Count - 1) do //Nacheinander (erst mal, dann durch,..) begin i := i + 1; rOp := m_EingabeZahl[i]; if (opFolge = 1) and (rOp = '*') then begin zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) * StrToFloat(m_EingabeZahl[i + 1])); Parser(zwErgebnis, zErgebnis, i, opFolge); end else if (opFolge = 2) and (rOp = '/') then begin zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) / StrToFloat(m_EingabeZahl[i + 1])); Parser(zwErgebnis, zErgebnis, i, opFolge); end else if (opFolge = 3) and (rOp = '+') then begin zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) + StrToFloat(m_EingabeZahl[i + 1])); Parser(zwErgebnis, zErgebnis, i, opFolge); end else if (opFolge = 4) and (rOp = '-') then begin zErgebnis := (StrToFloat(m_EingabeZahl[i - 1]) - StrToFloat(m_EingabeZahl[i + 1])); Parser(zwErgebnis, zErgebnis, i, opFolge); end; end; end; function TBerechnung.GetErgebnis; begin result := m_EingabeZahl.Text; end; end. Vielen Dank im Voraus Grüße ford42 :) |
AW: Parser - einfache Mathematische Formel
Moin,
wenn du Werte von Parametern verändern möchtest müssen diese schon als var deklariert werden... Dann kplappts auch mit dem i und dem zwErgebnis... |
AW: Parser - einfache Mathematische Formel
|
AW: Parser - einfache Mathematische Formel
![]() |
AW: Parser - einfache Mathematische Formel
Sicher geht es hier hauptsächlich darum das Programmieren zu erlernen, nicht das Kopieren. Wenn eine procedure oder function eine ihr übergebene Variable mit verändertem Wert wieder zurückgeben soll, muss das Wort "var" davor. Beispiel
Delphi-Quellcode:
procedure TuWas(var Zahl : Integer);
|
AW: Parser - einfache Mathematische Formel
Du suchst
![]() Es gibt auch in den Fmx Libraries einen Evaluator, ich finde den nicht auf die Schnelle, aber wenn du Fmx benutzt (und sehr wahrscheinlich funktionierts auch unter Vcl) dann solltest du mal danach suchen. Rollo |
AW: Parser - einfache Mathematische Formel
Zitat:
![]() |
AW: Parser - einfache Mathematische Formel
|
AW: Parser - einfache Mathematische Formel
Geht mit
![]()
Delphi-Quellcode:
LOL @LiveBindings Lösung...
program MathExample;
{$APPTYPE CONSOLE} uses dwsComp, dwsExprs; var s: string; compiler: TDelphiWebScript; prog: IdwsProgram; exec: IdwsProgramExecution; begin compiler := TDelphiWebScript.Create(nil); try repeat Readln(s); if s = '' then Exit; prog := compiler.Compile('Print(' + s + ')'); if prog.Msgs.HasErrors then Writeln(prog.Msgs.AsInfo) else begin exec := prog.Execute; Writeln(exec.Result.ToString); end; until False; finally compiler.Free; end; end. |
AW: Parser - einfache Mathematische Formel
Boah. Da fällt mir ein: "Wenn man die Lösung hat, hat man das Problem fast gelöst".
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 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