Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mit Strings rechnen (https://www.delphipraxis.net/88062-mit-strings-rechnen.html)

naudoc 9. Mär 2007 14:36


Mit Strings rechnen
 
Hallo,

ich will einen Rechner programmieren, mit dem man rechnen kann wenn eine einzige Eingabe in ein Editfeld macht. Also zum Beispiel '(3+4)*5'.
Ich habe mir geacht mit OnKeyPress koennte ich jeder Rechenzeichen als String erfassen, und jede Ziffernfolge als Zahl.
Bespiel '33+4': a[1] := 33; s[1] := +; a[2] := 4;
Wie rechne ich das jetzt?

mfG

ibp 9. Mär 2007 14:38

Re: Mit Strings rechnen
 
such mal hier im forum mit dem stichwort "parser"

naudoc 9. Mär 2007 14:59

Re: Mit Strings rechnen
 
Hi,

Daraus werd ich nicht schlau... 1000Artikel und meines Erachtgens nach keiner der meine Frage beantwortet. Kannst du es mir nicht selber beantworten?
Danke!

mfG

BenjaminH 9. Mär 2007 15:09

Re: Mit Strings rechnen
 
Zitat:

Zitat von naudoc
Daraus werd ich nicht schlau... 1000Artikel und meines Erachtgens nach keiner der meine Frage beantwortet. Kannst du es mir nicht selber beantworten?

Wenns denn so einfach wäre..
Ich verwende wenn ich sowas brauche den Kompilierenden Matheparser von Dax. Der hat ein paar Fehlerchen drin, die man aber gut selbst entfernen kann(zumindest die auf die ich damals gestoßen bin)
Selbst so etwas zu programmieren ist wie du, wenn du dir das ansiehst, wohl merkst sehr aufwändig und es gibt kein einfaches "Rezept" dafür.
Als erstes musst du den String auftrennen. Dann Operanden erstellen, usw. usw. Wenns einfach sein soll, such mal nach Hier im Forum suchenPos und Hier im Forum suchenPosEx damit kannst du den String durchsuchen und ihn zerlegen.
Danach musst du dann die Ergebnisse auswerten. z.b. mit einer Case Struktur.

Alles in allem wird das ein bisschen dauern. Trotzdem viel Erfolg.

naudoc 9. Mär 2007 15:14

Re: Mit Strings rechnen
 
Verstehst du mich falsch oder ich dich.
Der String ist aufgespaltet, nur wie bekomme ich den String '+' in die rechnung //ergebnis := 33 + 4// ??

mfG

hoika 9. Mär 2007 15:24

Re: Mit Strings rechnen
 
Hallo,


>> '33+4': a[1] := 33; s[1] := +; a[2] := 4;

i s[1]='+' then
begin
ergebnis:= IntToStr(a[1]) + IntToStr(a[2]);
end;


Unter Delphi kannsz du sowas nicht einfach "selber rechnen".
Das musst du tippern.
Das Problem ist aber, dass z.B.
33+4*5 nicht in der Reihenfolge deines "Parsens" berechnet werden darf(Punkt vor Strich).

Ein Parser zerlegt diesen Strin etwa

PLUS(33, MUL(4,5))

und berechnet von Innen nach Aussen.
Intern ist es ein Baum, der hier bei MUL anfängt als Knoten.

Wenn du das nicht verstehst, les einen der Artikel,
wenn du den nicht verstehst, nen anderen ;) (naja, tschulligung)

Ist halt nicht so einfach.

Heiko

naudoc 9. Mär 2007 15:29

Re: Mit Strings rechnen
 
Hi,

und es gibt kein Befehl, der sowas wie
A:= a[1] s[1] a[2];
oder
A:= a[1] strtorechenzeichen(s[1]) a[2];
macht?

mfG

hoika 9. Mär 2007 15:33

Re: Mit Strings rechnen
 
Hallo,

nein. kann man aber einfach selber schreiben.
Nehmen wir mal an, dass wir nur Integer haben.

Delphi-Quellcode:
function TueFeinRechne(const Wert1, Was, Wert2: String): Integer;
begin
  Result:= 0;

  if Was='+' then
  begin
    Result:= StrToInt(Wert1)+StrToInt(Wert2);
  end;
  if Was='-' then
  begin
    Result:= StrToInt(Wert1)-StrToInt(Wert2);
  end;

 usw.

end;
Man könnte hier mit Pascal-Scripting arbeiten (soehe google).
Damit kann Pascal-Quelltext kompiliert werden.


Heiko

naudoc 9. Mär 2007 15:35

Re: Mit Strings rechnen
 
Und wie stellst du dir das vor, dass es auch geht, wenn jemand:
sqrt((23-2)^2+725)
eintippt?

mfG

Corpsman 9. Mär 2007 15:37

Re: Mit Strings rechnen
 
Lol

Nein nicht das ich wüste.

Wobei es wirklich nicht schwer ist so einen Parser zu schreiben.

Wenn du Dich ein bischen Mit Gramatiken auskennst würde ich dir auch noch den Rekursive Decent Parser Empfehlen.

Der ist echt einfach implementiert und wenns nicht all zu Schnell gehen mus reicht der durchaus... sollte glatt mal ein Sample mit so was baun ;).

Generell kannst du aber Jeden ausdruck Parsen . Du solltest dir vielleicht mal meinen Tokengenerator ansehn.

Da gibst du deinen String ein und der Gibt dir die TokenListe zurück. Das kannst du dann schon viel besser verarbeiten ;)

naudoc 9. Mär 2007 15:42

Re: Mit Strings rechnen
 
Das Ding soll wie so ein Texas Instruments oder so Taschenrechner funktionieren, wo man oben eine Formel(oder heißt das Term?) eingibt und unten Steht das Ergebnis.

Und von Parsen oder was auch immer hab ich keine Ahnung... und wenn das so kompliziert ist versteh ich das auch nicht durchs lesen von ein paar Beiträgen, die nur auf ein bestimmtes Problem eine Antwort geben und Grundwissen vorraussetzen. Ich bräuchte einen 'das is ein Parser' Thread, den wohl niemand schreiben will...

mfG

Corpsman 9. Mär 2007 15:48

Re: Mit Strings rechnen
 
Also generel soltlest du Grundwissen haben. Sonst läuft das auf Copy Paste Raus. und das Bringt dir mal 0

Ich habe mal den Parser meines Loop Compilers veröffentlicht. den Kannst dir ansehn. Jedoch ist da jede menge anderes Zeug drin, und ich bin mir nicht sicher ob du das dann verstehst.

hoika 9. Mär 2007 15:50

Re: Mit Strings rechnen
 
Hallo,

http://www.aidaim.com/intr_spc.htm

also mehr helfen kann ich nu wirklich nicht.
Mit diesem Quellcode habe ich das mal in ein Programm eingebaut.


Heiko

shmia 9. Mär 2007 16:47

Re: Mit Strings rechnen
 
"Parser" ist nicht ganz das richtige Stichwort.
"Expression Evaluator" (deutsch: Ausdruck Auswerter) trifft es am Besten.
Ein Expression Evaluator enthält intern einen Parser; aber wir wollen hier keine Haare spalten.
Auf Torry's gibt einige Freeware Komponenten:
http://www.torry.net/pages.php?id=307
Für einen Expression Evaluator, der etwas taugt, braucht man schon einige Wochen Programmierzeit, wenn man bei Null beginnt.
Gute EEs haben jede Menge nützliche Features wie z.B. Benutzervariablen, vielen Datentypen (float, int, bool, strings, ...), benutzerdefinierte Funktionen, ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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