![]() |
Term (Zeichenfolge 1+2*3) in Fließkommazahl
Hallo, ich mache gerade für die Schule einen Taschenrechner und habe ihn auch vom optischen her fertig.
Eingabebuttons für Zahlen, Zeichen und ein Rechenfeld. Wenn man jetzt 1+2*3 eingibt, was ja 7 ergibt, soll eine String Variable rTerm auf ('1+2*3') gesetzt werden. Soweit kein Problem. Jetzt kommt der Button "Gleich" ins Spiel. Er soll die Variable rErgebnis : real auf das Ergebnis des Terms setzen, also erst ausrechnen, dann StrToFloat. Hier ist das Problem. Dann will ich das Ergebnis noch ausgeben, das krieg ich aber auch hin.
Delphi-Quellcode:
:coder2:
procedure TForm1.ButtonGleichClick(Sender: TObject);
begin rZahl:=StrToFloat(rTerm); Edit1.text:=FloatToStr(rZahl); end; So klappts ja nicht, habs nur mal probiert. Da Delphi aber Punkt vor Strich rechnet, wollte ich das auf diese Art machen. Bitte helft mit, Liebe Grüße! |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Tjaa...
Da musst du dir wohl einen Parser basteln, der dir deinen String zerlegt. So einfach wird das nicht funktionieren. |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Was dir hier noch fehlt, ist ein Formelinterpreter und der geht über die Aufgabe "Taschenrechner" deutlich hinaus. Ich empfehle dir einen anderen Ansatz, der die Berechnungen gleich beim Tastendruck ausführt - so macht es der Taschenrechner nämlich auch. Übrigens bekommt der bei der Eingabe "1+2*3=" eine 9 heraus, während ein Formelinterpreter eine 7 auswerfen würde.
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Du kannst mit StrToFloat keinen Term in eine Gleitkommazahl umwandeln. Diese Funktion ist ausschließlich dafür da, eine Kommazahl, welche als Zeichenkette gespeichert ist, in eine Gleitkommazahl umzuwandeln. Für das was du vorhast, benötigst du einen Parser, der den String analysiert und dann die Berechnung durchführt, aber sowas zu programmieren ist alles andere als trivial.
Du solltest dir eher in einer Liste oder einer anderen dafür geeigneten Struktur, die Zahlen und Operatoren merken und diese dann im nachhinein mit den Rechenregeln zusammen rechnen. |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Zitat:
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Danke für die vielen schnellen Antworten. :thumb:
Der "Taschenrechner" (Ergebnis=9) ist Pflicht, es gibt halt Bonuspunkte für den Rechner, der den String erst ausrechnet... In meiner Gruppe wollen wir halt einen Termberechner machen, der also auch Klammern etc. berechnet. Es wäre ja auch Möglich, das Ganze mit den Variablen Zahl1 (=1) dann dem Zeichen1 (=+ -> Als 1 gespeichert -> if Zeichen1=1 then +...) und dann wieder Zeichen usw. Dafür müssten nur genug Variablen vorhanden sein. Gibt es die Möglichkeit, diese Variablen dann automatisch je nach Bedarf erstellen zu lassen? Ich starte mit rZahl1, rZeichen1 und rZahl2. Wenn dann noch was eingegeben wird, soll rZeichen2 automatisch erstellt werden. Dann beim Gleich Button: Zahlen sortieren und Zeichen sortieren, nach Name und dann immer abwechselnd anordnen. Zahl,Zeichen,Zahl usw. Das Ergebnis wird dann so berechnet... Auch möglich??? |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Wie gesagt, wäre dafür eine Liste sehr praktisch. Allerdings wird für eine einigermaßen gute Implementierung schon ein gewisses Grundverständnis der OOP vorrausgesetzt und ich vermute mal, dass dies bei dir nicht der Fall ist. Und dir jetzt hier einen Code vorzuwerfen, der das erledigt möchte ich auch nicht, da es sich ja um eine Schulaufgabe handelt und du etwas lernen sollst.
Es gäbe noch die Möglichkeit, dass du das ganze über eine TStringList versuchst, was dann doch etwas einfacher für dich sein sollte, aber auch keine tolle Lösung ist. Schau dich einfach mal im Forum um, wie man eine TStringList verwendet und falls du nicht weiter weißt, frag einfach nochmal. |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
jupp, um einen Parser kommst du da nicht drumrum
Zitat:
z.B. erstmal alles in seine einzelteile zerlegen und in ein Array damit
Code:
und dann nach den gängigen mathematischen Regeln nacheinander versuchen dieses aufzuösen
1
+ 2 * 3 hier z.B. zuerst * und dann + also erstmal ein "*" suchen, wo davor und danach eine Zahl vorkommt dieses nun ausrechnen und ersetzen
Code:
nun das Gleiche mit dem "+"
1
+ 6 praktisch immer zuerst * und / versuchen aufzulösen, dann + und - und zuletzt + mit nur einer Zahl dahinter immer von vorne nach hinten entsprechende Gruppen (Zahl-Operator-Zahl) suchen und wenn etwas gefunden wurde, dieses ausrechnen und ersetzen, dann erneut von vorne ganz vorner im Array anfangen das nächste zu finden und das solange, bis nichts mehr zum Auflösen gefunden wurde * String in Array zerlegen > je Zahlen und Operatoren pro Eintrag * wiederhole: * nach "zahl*zahl" suchen * - dieses ausrechnen und ersetzen und weiter bei "wiederhole" * nach "zahl/zahl" suchen * - dieses ausrechnen und ersetzen und weiter bei "wiederhole" * nach "zahl+zahl" suchen * - dieses ausrechnen und ersetzen und weiter bei "wiederhole" * nach "zahl-zahl" suchen * - dieses ausrechnen und ersetzen und weiter bei "wiederhole" * nach "+zahl" suchen * - dieses zusammensetzen und ersetzen und weiter bei "wiederhole" * nach "-zahl" suchen * - dieses zusammensetzen und ersetzen und weiter bei "wiederhole" * Array wieder zum Strng zusammensetzen und ausgeben * - also einfach alles aneinanderhängen mit viel Glück ist dann am Ende nur noch ein Eintrag mit einer Zahl übrig und wenn nicht, dann paßte etwas in der "Formel" nicht ganz [edit] jupp, statt dem Array macht sich wohl eine StringListe hier icht schlecht, da man dort leichter Einträge entfernen kann. [/edit] PS: ![]() siehe Demo5 und Demo6 auch wenn es dir wohl nnicht viel Helfen wird, aber immerhin ist der QuellCode ja offen und vielleicht findet du in dem Parser ja ein/zwei Anregungen. macht mein Parser nicht viel anders - nur daß ich da noch Klammern, Funktionen und Anderes mit drin hab ... nja und halt mit anderen Zahlenstrukturen rechne |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Sieht gut aus, danke.
Delphi berechnet ja theoretisch: rZahl:=1+2*3 Dann ist rZahl=7 Darum müsste man dem doch nur klar machen, dass der die Formel, die in rTerm steckt, berechnen soll. ___________________ Wie zerlege ich sowas denn? |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Delphi berechnet nichts.
Im Compiler ist ein Parser, welcher den Quelltext zerlegt und es dann in der EXE sozusagen in der EXE schon richtig zusammengesetzt eingebaut hat. Da der Parser nur in dem Compiler drin ist, kannst du diesen nicht in der EXE nutzen und mußt dir einen Eigenen bauen (oder einen Fertigen von wo anders verwenden) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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 by Thomas Breitkreuz