AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parser - einfache Mathematische Formel

Ein Thema von ford42 · begonnen am 6. Okt 2015 · letzter Beitrag vom 9. Okt 2015
Antwort Antwort
Seite 1 von 2  1 2      
ford42

Registriert seit: 2. Okt 2015
60 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 11:52
Delphi-Version: XE3
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:
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 = 'Cthen
    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.
PS: Und wie in dem Kommi zu sehen müsste sich ja i da oben verändern, tut es aber nicht. Oo

Vielen Dank im Voraus
Grüße ford42
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
257 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 12:21
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...
Dirk
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#3

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 12:36
einen einfachen Math-Parser gibt es nicht. Entweder ganz oder gar nicht.
siehe RPN
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 12:53
Hier hab ich (unter # 37) mal einen 08/15 Parser gepostet.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 13:01
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

procedure TuWas(var Zahl : Integer);
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 18:26
Du suchst so etwas ?

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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Parser - einfache Mathematische Formel

  Alt 6. Okt 2015, 19:06
einen einfachen Math-Parser gibt es nicht. Entweder ganz oder gar nicht.
Doch. Hier.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#8

AW: Parser - einfache Mathematische Formel

  Alt 8. Okt 2015, 15:34
Das hier meinte ich.

Alles schon im Paket enthalten

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Parser - einfache Mathematische Formel

  Alt 8. Okt 2015, 17:04
Geht mit DelphiWebScript kinderleicht:

Delphi-Quellcode:
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.
LOL @LiveBindings Lösung...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Parser - einfache Mathematische Formel

  Alt 8. Okt 2015, 20:31
Boah. Da fällt mir ein: "Wenn man die Lösung hat, hat man das Problem fast gelöst".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz