Delphi-PRAXiS
Seite 1 von 2  1 2      

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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 Uhr.
Seite 1 von 2  1 2      

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