Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Erste Versuche zu Parsen um mit String zu rechnen (https://www.delphipraxis.net/93631-erste-versuche-zu-parsen-um-mit-string-zu-rechnen.html)

MarquiseDeSade 8. Jun 2007 14:41


Erste Versuche zu Parsen um mit String zu rechnen
 
Hallo DP´ler :lol:

Eine kurze Beschreibung was ich mir Überlegt habe. Ich möchte einen Taschenrechner so programmieren, dass der User durch klicken auf Buttons willkürliche Rechnungen durchführen kann.

Zum Beispiel:
2+22+4-258*635/741 (Die Eingabe erfolgt über Buttons, sowohl die Zahlen als auch Operatoren)

Nun besteht ja das Problem Punkt vor Strich.

Mein Ansatz:

Delphi-Quellcode:
var
  Form1: TForm1;

  speicher                         :string;
  plus,minus,mal,geteilt           :integer;

...
...
...

{Button für die Rechenarten}
{-----------------------------------------------------------}
procedure TForm1.Button_plusClick(Sender: TObject);

begin
  speicher:=speicher+edit1.text+'+';
  edit1.Text:='';
end;
procedure TForm1.Button_minusClick(Sender: TObject);
begin
  speicher:=speicher+edit1.text+'-';
  edit1.Text:='';
end;
procedure TForm1.Button_malClick(Sender: TObject);

begin
  speicher:=speicher+edit1.text+'*';
  edit1.Text:='';
end;
procedure TForm1.Button_geteiltClick(Sender: TObject);
begin
  speicher:=speicher+edit1.text+'/';
  edit1.Text:='';
end;
{-----------------------------------------------------------}

...
...
...
procedure TForm1.Button_gleichClick(Sender: TObject);

begin
speicher:=speicher+edit1.text;

//Übergabe der Position des Zeichens im String
plus:=pos('+',speicher);
minus:=pos('-',speicher);
mal:=pos('*',speicher);
geteilt:=pos('/',speicher);
Nun zu meinen Problemen:
Ich habe leider erst sehr wenige Grundkenntnisse und ich komme hier nicht weiter. Eigentlich habe ich vor, den String bis zu den jeweiligen Operatoren zu zerlegen und ihn als Integer einer Variable zu übergeben. Pos liefert mir aber nur das erste übereinstimmende Zeichen wieder. Wie löse ich also das Problem, wenn in einem String mehrere Plus-Zeichen auftauchen.

jfheins 8. Jun 2007 14:47

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Such mal nach Hier im Forum suchenparsen oder Hier im Forum suchenParser da solltest du einiges finden ;)

Du solltest zuerst einen binären Baum erstellen, der den Ausdrück repräsentiert, den kannst du dann ner (rekursieven) Funktion übergeben, die dir dann das Ergebnis ausrechnet ;)

Jakob Ullmann 8. Jun 2007 14:51

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Nimm doch die Kompo TParser (so heisen sicherlich viele) - die findest du bei www.torry.net. :spin2: :wink:

MarquiseDeSade 8. Jun 2007 15:36

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Zitat:

Zitat von jfheins
Such mal nach Hier im Forum suchenparsen oder Hier im Forum suchenParser da solltest du einiges finden ;)

Du solltest zuerst einen binären Baum erstellen, der den Ausdrück repräsentiert, den kannst du dann ner (rekursieven) Funktion übergeben, die dir dann das Ergebnis ausrechnet ;)

:?:

Ich finde, dass die Ergebnisse der Suchfunktion mir als Anfänger nicht genug her geben, um mein Problem davon abzuleiten und eine Lösung zu finden... :(

Gibt es vielleicht einen guten Beitrag, der einem die Grundlagen vermittelt? Würde ich mit Pos und Copy dem Problem Herr werden ? Ich probiere schon ein bissl rum, aber zufrieden bin ich noch nicht....



Zitat:

Zitat von Jakob Ullmann
Nimm doch die Kompo TParser (so heisen sicherlich viele) - die findest du bei www.torry.net. :spin2: :wink:

Ich lerne nichts, wenn ich mir fertige Sachen irgendwo herhole und sie dann noch nichtmal verstehe :zwinker:

sirius 8. Jun 2007 15:39

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Warst du schonmal auf dieser Seite?

MarquiseDeSade 8. Jun 2007 15:54

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Jap, war ich schon.... fand ich jetzt nicht so überragend :mrgreen:

Ich merke schon, es wird besser sein, ein wenig rumzuprobieren und dann konkrete Probleme zu posten.

sirius 8. Jun 2007 15:58

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Zitat:

Zitat von MarquiseDeSade
Jap, war ich schon.... fand ich jetzt nicht so überragend :mrgreen:

Echt? Das ist doch super erklärt!

Nimm dir doch einfach mal die paar Zeile Quellcode unter Grundprinzip (damit geht allerdings nur + und *) und schau mal im Debugger was passiert.

Die einzige Hürde, die du nehmen musst sind "rekursive Funktionen", also Funktionen die sichselber aufrufen (im Beispiel: "TermToReal")

MarquiseDeSade 8. Jun 2007 16:47

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Huhu :lol:

Mh, ich stoß hier bei dem Beispiel an meine Grenzen. Ich glaub ich such mir eine andere Möglichkeit, denn das Parsen scheint nicht mein Ding zu sein... zumal mir das alles zu aufwenig erscheint. Es muss doch eine einfachere Möglichkeit geben !! :cry:

Gremlin 8. Jun 2007 17:12

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Die Seite fand ich relativ interessant und passt zu deinem Thema

Hier gehts lang ;-)


a) Auch wenn du es am Anfang vielleicht nicht verstehst, dann lies es nochmal durch
b) goto a)

Khabarakh 8. Jun 2007 17:18

Re: Erste Versuche zu Parsen um mit String zu rechnen
 
Wenn du wirklich nur die vier Grundrechenarten und keine Klammern unterstützen willst, existiert in der Tat eine einfache Möglichkeit ohne Lexer oder Baum. Du benötigst eine Funktion
Delphi-Quellcode:
Parse(aTerm: string): Double bzw. Int
In dieser Funktion suchst du nach einem Operator, in dieser Reihenfolge: +,-,*,/. Ist die Suche erfolgreich, rufst du deine Funktion rekursiv mit den Teiltermen links und rechts vom Operator auf und verbindest die Ergebnisse durch den Operator. Für + also zum Bleistift:
Delphi-Quellcode:
Result := Parse(TermLinks) + Parse(TermRechts);
// Exit;
Sobald kein Operator mehr gefunden wurde, muss der restliche Term eine Zahl sein (oder eben nicht -> Exception).


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr.
Seite 1 von 2  1 2      

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