![]() |
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:
Nun zu meinen Problemen:
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); 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. |
Re: Erste Versuche zu Parsen um mit String zu rechnen
|
Re: Erste Versuche zu Parsen um mit String zu rechnen
Nimm doch die Kompo TParser (so heisen sicherlich viele) - die findest du bei
![]() |
Re: Erste Versuche zu Parsen um mit String zu rechnen
Zitat:
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:
|
Re: Erste Versuche zu Parsen um mit String zu rechnen
Warst du schonmal auf
![]() |
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. |
Re: Erste Versuche zu Parsen um mit String zu rechnen
Zitat:
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") |
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: |
Re: Erste Versuche zu Parsen um mit String zu rechnen
Die Seite fand ich relativ interessant und passt zu deinem Thema
![]() a) Auch wenn du es am Anfang vielleicht nicht verstehst, dann lies es nochmal durch b) goto a) |
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:
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:
Parse(aTerm: string): Double bzw. Int
Delphi-Quellcode:
Sobald kein Operator mehr gefunden wurde, muss der restliche Term eine Zahl sein (oder eben nicht -> Exception).
Result := Parse(TermLinks) + Parse(TermRechts);
// Exit; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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