Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
k4rsten

Anmeldungsdatum: 01.01.2010 Beiträge: 18 Wohnort: Dortmund
|
Verfasst am: 05.01.2010, 15:43 Titel: Mathematischen Ausdruck auflösen |
|
|
Hallo Leute!
Ich hoffe ich nerve euch nicht
Es geht um die Auflösung eines Mathematischen Ausdrucks. Genauer gesagt schon um die Berechnung - wenn ich eine String-Variable mit bspw. dem Inhalt "2+3-4^5" (pseudo, dient nur als Beispiel) habe, wie kann ich diese ausrechnen und in einer Zahlenvariable (Double, Float, egal) speichern?
Viele Grüße,
Karsten _________________ you cannot kill what you did not create |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.01.2010, 16:17 Titel: |
|
|
fbeval ist da ganz gut; such mal, ob du es findest, ansonsten liegt es auch meinem monopolz als Include bei.
Oder see (kenne ich nicht näher): http://www.freebasic.net/forum/viewtopic.php?t=5740 _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.01.2010, 20:48 Titel: |
|
|
plattform- und sprachunabhänging geht's mit muParser, wobei du da wohl noch die C-Header nach FB übersetzen müsstest, um auf die DLL zuzugreifen (geht z.B. mit SWIG, Forensuche hilft). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 06.01.2010, 01:26 Titel: |
|
|
Moin K4rsten!
Wenn du möchtest, würde ich mich dran setzten, und eine Funktion für dich schreiben. Muss nur eben wissen, ob du das überhaupt noch brauchst.
Wenn ja, mit allen Rechenausdrücken (z.B. sin, cos, tan, sqr usw.)?
Bis wann? _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
k4rsten

Anmeldungsdatum: 01.01.2010 Beiträge: 18 Wohnort: Dortmund
|
Verfasst am: 06.01.2010, 14:26 Titel: |
|
|
Danke für eure Antworten
Das hört sich doch Klasse an, Luke!
Wäre super, wenn du das machen könntest.
Ich benötige das ganze für einen Funktionsplotter, also sind die mathematischen Rechenausdrücke (sqr, sin, cos etc.) sehr wichtig, jedoch würden mir ein paar als Beispiel genügen, ich könnte dann selbst welche hinzufügen.
Ich habs ja auch schon versucht, allerdings hing ich bei der Klammerrechnung .
Zeitlich habe ich da kein Limit, also wenn du mal Zeit und Lust hast, würde ich mich freuen, wenn du das machen würdest
Viele Grüße,
Karsten _________________ you cannot kill what you did not create |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.01.2010, 15:50 Titel: |
|
|
Wie gesagt, muParser kann das alles, ist sicher und kann auch direkt für andere Dinge weiterverwendet werden. Einfach die C-Header zu übersetzen bedeutet minimalen Aufwand und du hast dann eine extrem mächtige Parser-Lib. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
k4rsten

Anmeldungsdatum: 01.01.2010 Beiträge: 18 Wohnort: Dortmund
|
Verfasst am: 06.01.2010, 16:06 Titel: |
|
|
muParser ist ein sehr mächtiges Tool, wäre prinzipiell gut zu verwenden. Allerdings würde ich bei der anderen Variante genau verstehen, wie das ganze Arbeitet und wie man es umsetzen kann. Ohne mich wieder in C einarbeiten zu müssen (Das mache ich nie wieder ) _________________ you cannot kill what you did not create |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 06.01.2010, 16:44 Titel: |
|
|
Lutz Ifer hat mal vor ein paar Jahren einen entsprechenden Parser gepostet, vielleicht hilft dir der:
http://forum.qbasic.at/viewtopic.php?t=3297 (etwas weiter unten) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 06.01.2010, 17:28 Titel: |
|
|
@K4rsten: Mach ich gerne. solche Problem interessieren mich nämlich, und ich finde meistens eine Lösung . Melde mich dann! _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.01.2010, 17:29 Titel: |
|
|
k4rsten: Dich interessiert an sich nur die DLL-Variante, da die zweite Variante praktisch nur in C++ funktioniert. Du brauchst nur die Parser-DLL und für FreeBASIC angepasste header. Mit SWIG sind die .h-Dateien im Handumdrehen in .bi-Dateien umgewandelt.  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 22.01.2010, 01:16 Titel: |
|
|
ich pushe das thema mal.. ich bräuchte nen parser der die rechenregeln beherrscht (punkt vor strich, klammer, potenzen vor strich, etc) und trotzdem möglichst einfach ist. Achja. Funktionen brauch ich nicht. nur sollten rechnungen wie "(1+2) * (3 / 4) *-1" gehen
ich versuch mich da gerade selbst dran, aber das is garnich so einfach... vorläufiges ergebnis:
Code: |
function math_parser(byval value as string) as string
dim entry() as string
dim dummy as string
dim as integer u
for i as integer = 0 to len(value)
if value[i] >= asc("0") and value[i] <= asc("9") then
dummy += trim(chr(value[i]))
else
if dummy <> "" then
u = ubound(entry) +1
redim preserve entry(u)
entry(u) = dummy
end if
if trim(chr(value[i])) <> "" then
u = ubound(entry) +1
redim preserve entry(u)
entry(u) = chr(value[i])
end if
dummy = ""
end if
next
dim found as integer = -1
dim as integer nopunkt = 0
do
if (nopunkt = 0) and found = 0 then nopunkt = 1
found = 0
for i as integer = 1 to ubound(entry)
if entry(i) = "*" then
found = 1
entry(i-1) = str(val(entry(i-1)) * val(entry(i+1)))
elseif entry(i) = "/" then
found = 1
entry(i-1) = str(val(entry(i-1)) / val(entry(i+1)))
end if
if nopunkt = 1 then
if entry(i) = "-" then
found = 1
entry(i-1) = str(val(entry(i-1)) - val(entry(i+1)))
elseif entry(i) = "+"then
found = 1
entry(i-1) = str(val(entry(i-1)) + val(entry(i+1)))
end if
end if
if found = 1 then
for x as integer = i TO ubound(entry) -2
entry(x) = entry(x+2)
entry(x+1) = entry(x+3)
next
redim preserve entry(ubound(entry) -2)
exit for
end if
next
loop until found = 0 and (nopunkt = 1)
return str(entry(1))
end function |
(steht nart. unter der MIT-/X11-Lizenz)
das ding is groß, unperfomant und schlecht geschrieben... _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.01.2010, 08:15 Titel: |
|
|
statt 'nem eindimensionalen array, bau dir lieber einen parser-baum auf...ein einem teilbaum ist dann immer ein pointer auf die untergeordneten ausdrücke + rechenoperation + wert. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.01.2010, 11:08 Titel: |
|
|
...reinquatsch...
Mit Lua geht das sehr bequem. Für Lua 5 gibt es sogar FB Header (...von 2006...)
Lua beherrscht mit etwas Nachhilfe sogar fast alle Trigonometriefunktionen. Da kann ich nachher mal etwas hochladen, was ich immernoch für meine Engine und andere Basteleien benutze... |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 22.01.2010, 14:58 Titel: |
|
|
Wenn man nur Klammern, Potenzen und Grundrechenarten braucht würde ich so vorgehen:
1. Schreib eine Funktion die nur mit +-*/ und Zahlen zurecht kommt (Punkt vor Strich beachten).
2. Schreibe eine Funktion die aus Potenzen * Ketten macht.
3. Parse den Inhalt der innersten Klammer heraus.
4. Rufe für die Rechnung in der innersten Klammer erst die Potenzen Funktion auf, dann die Funktion für Grundrechenarten.
5. Ersetze die Klammer durch das Ergebniss
6. Wenn es noch Klammern gibt: gehe zurück zu Schritt 3
7. Rufe ein letztes mal die beiden Funktionen für Potenzen und Grundrechenarten auf.
8. Jetzt sollte das Ergebniss übrig bleiben. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.01.2010, 17:57 Titel: |
|
|
Ich zitiere mich jetzt NICHT selbst. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.01.2010, 23:49 Titel: |
|
|
The_Muh hat Folgendes geschrieben: | (1+2) * (3 / 4) *-1 |
Noch nie was davon gehört, das Vorzeichen zu schützen? *kopfabreiss* _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 23.01.2010, 15:43 Titel: |
|
|
nö. und viele andere auch nicht. Obwohl. In Mathetesten mach ich das eher so:
(-1) * (+1) - (-1) xD _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.01.2010, 16:50 Titel: |
|
|
Testen? Ist das neuerdings ein Plural? Ich dachte immer, das sei ein Verb... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 23.01.2010, 17:32 Titel: |
|
|
Halb so schlimm, solange man das nicht in Deutschtesten schreibt.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|