![]() |
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 |
Re: Mit Strings rechnen
such mal hier im forum mit dem stichwort "parser"
|
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 |
Re: Mit Strings rechnen
Zitat:
Ich verwende wenn ich sowas brauche den ![]() 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 ![]() ![]() Danach musst du dann die Ergebnisse auswerten. z.b. mit einer Case Struktur. Alles in allem wird das ein bisschen dauern. Trotzdem viel Erfolg. |
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 |
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 |
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 |
Re: Mit Strings rechnen
Hallo,
nein. kann man aber einfach selber schreiben. Nehmen wir mal an, dass wir nur Integer haben.
Delphi-Quellcode:
Man könnte hier mit Pascal-Scripting arbeiten (soehe google).
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; Damit kann Pascal-Quelltext kompiliert werden. Heiko |
Re: Mit Strings rechnen
Und wie stellst du dir das vor, dass es auch geht, wenn jemand:
sqrt((23-2)^2+725) eintippt? mfG |
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 ![]() Da gibst du deinen String ein und der Gibt dir die TokenListe zurück. Das kannst du dann schon viel besser verarbeiten ;) |
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 |
Re: Mit Strings rechnen
|
Re: Mit Strings rechnen
Hallo,
![]() also mehr helfen kann ich nu wirklich nicht. Mit diesem Quellcode habe ich das mal in ein Programm eingebaut. Heiko |
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: ![]() 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