Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Term (Zeichenfolge 1+2*3) in Fließkommazahl (https://www.delphipraxis.net/140346-term-zeichenfolge-1-2%2A3-fliesskommazahl.html)

Delphi-Narr 16. Sep 2009 12:57


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:
procedure TForm1.ButtonGleichClick(Sender: TObject);
begin
     rZahl:=StrToFloat(rTerm);
     Edit1.text:=FloatToStr(rZahl);
end;
:coder2:

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!

Forlan 16. Sep 2009 13:09

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.

Uwe Raabe 16. Sep 2009 13:12

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.

hugo1990 16. Sep 2009 13:13

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.

Forlan 16. Sep 2009 13:15

Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
 
Zitat:

Zitat von Uwe Raabe
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.

Daher ist ein Parser/Formelinterpreter viel zu komplex für einen "Anfänger". Grundwissen der OOP sind dafür wohl vorausgesetzt, wenn man die Aufgabe denn "sauber" lösen möchte...

Delphi-Narr 16. Sep 2009 13:28

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???

hugo1990 16. Sep 2009 13:40

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.

himitsu 16. Sep 2009 13:44

Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
 
jupp, um einen Parser kommst du da nicht drumrum

Zitat:

Daher ist ein Parser/Formelinterpreter viel zu komplex für einen "Anfänger". Grundwissen der OOP sind dafür wohl vorausgesetzt, wenn man die Aufgabe denn "sauber" lösen möchte...
wenn man es nicht all zu Komplex macht unsd sich nur ein einfache Operaionen wie * / + und - beschränkt und keine klammern zuläßt, dann wäre es recht leicht/einfach möglich

z.B.
erstmal alles in seine einzelteile zerlegen und in ein Array damit
Code:
1
+
2
*
3
und dann nach den gängigen mathematischen Regeln nacheinander versuchen dieses aufzuösen

hier z.B. zuerst * und dann +

also erstmal ein "*" suchen, wo davor und danach eine Zahl vorkommt
dieses nun ausrechnen und ersetzen
Code:
1
+
6
nun das Gleiche mit dem "+"

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: http://www.delphipraxis.net/internal...t.php?t=159592
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

Delphi-Narr 16. Sep 2009 13:57

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?

himitsu 16. Sep 2009 14:07

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 19:54 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz