Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Mathematischen Ausdruck auflösen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
k4rsten



Anmeldungsdatum: 01.01.2010
Beiträge: 18
Wohnort: Dortmund

BeitragVerfasst am: 05.01.2010, 15:43    Titel: Mathematischen Ausdruck auflösen Antworten mit Zitat

Hallo Leute!
Ich hoffe ich nerve euch nicht durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 05.01.2010, 16:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 05.01.2010, 20:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 06.01.2010, 01:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
k4rsten



Anmeldungsdatum: 01.01.2010
Beiträge: 18
Wohnort: Dortmund

BeitragVerfasst am: 06.01.2010, 14:26    Titel: Antworten mit Zitat

Danke für eure Antworten lächeln

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 durchgeknallt .

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 lächeln

Viele Grüße,

Karsten
_________________
you cannot kill what you did not create
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 06.01.2010, 15:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
k4rsten



Anmeldungsdatum: 01.01.2010
Beiträge: 18
Wohnort: Dortmund

BeitragVerfasst am: 06.01.2010, 16:06    Titel: Antworten mit Zitat

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 mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen )
_________________
you cannot kill what you did not create
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 06.01.2010, 16:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 06.01.2010, 17:28    Titel: Antworten mit Zitat

@K4rsten: Mach ich gerne. solche Problem interessieren mich nämlich, und ich finde meistens eine Lösung happy . Melde mich dann!
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 06.01.2010, 17:29    Titel: Antworten mit Zitat

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. zwinkern
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 22.01.2010, 01:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.01.2010, 08:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.01.2010, 11:08    Titel: Antworten mit Zitat

...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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 22.01.2010, 14:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.01.2010, 17:57    Titel: Antworten mit Zitat

Ich zitiere mich jetzt NICHT selbst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.01.2010, 23:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 23.01.2010, 15:43    Titel: Antworten mit Zitat

nö. und viele andere auch nicht. Obwohl. In Mathetesten mach ich das eher so:
(-1) * (+1) - (-1) xD
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.01.2010, 16:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 23.01.2010, 17:32    Titel: Antworten mit Zitat

Halb so schlimm, solange man das nicht in Deutschtesten schreibt. grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz