AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Delphi-Narr · begonnen am 16. Sep 2009 · letzter Beitrag vom 10. Nov 2009
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

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

  Alt 16. Sep 2009, 13:57
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;


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!
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#2

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

  Alt 16. Sep 2009, 14:09
Tjaa...
Da musst du dir wohl einen Parser basteln, der dir deinen String zerlegt. So einfach wird das nicht funktionieren.
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 16. Sep 2009, 14:12
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.
Uwe Raabe
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 16. Sep 2009, 14:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#5

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

  Alt 16. Sep 2009, 14:15
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...
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#6

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

  Alt 16. Sep 2009, 14:28
Danke für die vielen schnellen Antworten.

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???
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 16. Sep 2009, 14:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 16. Sep 2009, 14:44
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#9

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

  Alt 16. Sep 2009, 14:57
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 16. Sep 2009, 15:07
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.
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