[Mathe/Informatik]Verschachtelung von Termen "aufloesen"

Surma

Erfahrenes Mitglied
Ich hoffe, das ist hier richtig.

Ich suche nach einer guten Loesung, um verschachtelte Terme fuer den Computer nach dne rechengesetzen umzuwandeln.
Ich meine mal irgendwas von Kellerautomaten gelesen zu haben, aber darunter find ich bei Google nur irgendwas mit mathematischen Alphabten (wtf?).
Und sowohl mehrere Forumsuchen als auch ausgibiege Googlei bringt nichts.

Kann mir dazu jemand ein paar gute Schlagworte geben (meist sucht man ja nur mit den falschen Begriffen).
 
Hi,

...sonst such doch mal nach Formelparser - könnte ja sein, dass da was dabei ist.

Ich habe mir so etwas mal (unter VB6 :)) geschrieben, zuerst alle Klammern (rekursiv) aufgelöst und den Rest nach Prioritäten abgearbeitet - hat auch prima funktioniert, bis auf Differenziale/Integrale; diese nach Klassen (wg. verschiedener Regeln) zu sortieren, hat mich zum Aufgeben bewogen...

Gruß
 
Original geschrieben von Datic
...bis auf Differenziale/Integrale; diese nach Klassen (wg. verschiedener Regeln) zu sortieren, hat mich zum Aufgeben bewogen...

Aus dem Grund, das ich noch nicht einmal weiss, was das sein sollen, werd ich wahrscheinlich damit auch keine Probleme haben :D (Bitte jetzt nicht Antworten und Erklaeren, dass waer ja OT :rolleyes: )
Danke fuer die Antwort.

@ShadowMan: oh... da gibts viele::D
also:

(4 + 4) * 4 * (5 * 15) / 5 + 5
(a + b) ^ 2
(cos a * 3) / 24*(3+3)

also alles mit und ohne Klammern und sonstigen Funktionen.
 
Zuletzt bearbeitet:
Och, ich dachte das wären richtig schwere Formeln oder so... :)

Da hat wohl jemand in Mathe nicht aufgepasst, hm?!

Also wenn ich dich richtig verstanden habe willst du wissen nach welchen Regeln man diese auflöst oder wie?

Zuerst Klammern, dann Punkt und dann Strichrechnung.
 
Auch wenn es jetzt ins Off(Topic) abgleitet, mal als Ansatz, wie ich es damals gemacht habe: Wenn Du z.B. eine Formel hast, wie
(2 * 3) + ( (17 / x ) - x^2)
, dann kannst Du eine Funktion schreiben, die die Klammern auflöst, indem die innersten Klammern zuerst berechnet werden. Dazu gehst Du den String durch, bis Du auf eine schließende Klammer stösst und übergibst den Inhalt von der letzten öffnenden bis zu dieser schließenden Klammer der "Berechnungsfunktion". Das machst Du so lange, bis keine Klammern mehr da sind.
Die Funktion zum Berechnen sah bei mir so aus, dass ich

- zuerst alle Variablen in die entsprechenden Werte umgewandelt habe (wenn keine Werte angegeben waren, habe ich die den User mit einem Promt eingeben lassen).

- alle Funktionen (sin, cos, tan usw.) berechnen lasse. Das ganze war eine ziemliche Fummelei, da einige Funktionen aus 2, andere aus 3 Zeichen bestehen und der String entsprechend gekürzt werden musste... :rolleyes:

- danach kamen Potenzen und Punktrechnung an die Reihe...

- ... und zuletzt Addition und Subtraktion.

Ein Beispiel:
Code:
x^2 * (3 + sin(x)) // zuerst die Klammer vom sin ausrechnen:

x // Wert einsetzen, z.B. 2 

x^2 * (3 + sin3) // nun die Klammer berechnen:

(3 + sin3) // nach Funktionen durchsuchen: "sin" gefunden:

sin3 // berechnen, ergibt 0,9 (ungefähr...)

(3 + 0,9) // ausrechnen, ergibt 3,9 ->

x^2 * 3,9 // keine Klammern/Funktionen mehr, daher nach Variablen durchsuchen -> x (2 einsetzen)

2^2 * 3,9 // Potenz gefunden und ausrechnen:

4 * 3,9 // nun ist nur noch eine Multiplikation vorhanden -> ausrechnen!

15,6 // ok stimmt nicht ganz, wegen dem Sinus :-)

Ich hoffe, das war einigermaßen verständlich und nicht zu chaotisch...

Ich muss dazu noch anmerken, dass ich den String zu Beginn in "Token" oder "Wörter" zerlegt habe, also z.B. Zahlen, Variablen, Funktionsnamen usw. das hat es sehr vereinfacht, den Ausdruck zu verarbeiten.

Gruß
 
Zuletzt bearbeitet:
@ShadowMan: Na. soo einfach wars nun auch nicht gemeint...
<Angeben> Bin Klassenbester in Mathe... hab trotzdem nicht aufgepasst</Angeben>

Ich wollt eben wissen, wie ich es dem Computer am besten "verstaendlich mache.

@Datic: Thx... sowas brauch ich... werd ich mal schauen, wie ich das nach dem Surman'schen System umsetze :)

Da komtm mir gerade eine Frage/Idee:
Wenn ich dann soeine Formel hab wie:
(3* (3+ (3*(3+3))))

dann muss ich das ganze irgendwie rekursiv aufbauen oder?
eine Funktion die nach Klammern sucht,
und sich selbst aufruft, sobald eine oeffnende kommt,
wenn eine schliessende kommt, die letzt Klammer ausrechnet und als Ergebnis zurueckliefert.

Thx!
 
Zuletzt bearbeitet:
Klar wars nicht ganz so einfach, aber ich dachte du meinst das Grundprinzip dahinter ;)

Und das würde ich auf jeden Fall rekursiv lösen. Am besten vorher ne Abfrage ob noch ne Klammer kommt und wenn ja einfach den restlichen Term rekursiv aufrufen.

Lieben Gruß,
Manuel ;-]
 
Dann werd ich das wohl mit einem Stack machen.

Oeffende Klammern werden ignoriert.
Terme in den Stack legen.
Sobal eine Schliessende Klammern kommen, wird die letzte Operation ausgefuehrt.

Zum Schluss mussteeine String nur mit + - * / bleiben denn man einfach noch aufschluesseln muss.

MfG
Crock

HTF (Hope that funzts)
 
Also die echten Parser basteln sich einen Baum. Die Wurzel repräsentiert das Ergebnis. Die Blätter sind die Elementaren Bausteine (Zahlen) die durch die Knoten miteinander Verknüpft werden.
Dein Projekt ist also ein wenig aufwendiger (es sei denn du wechselst auf umgekehrt polnische Notation)
 

Neue Beiträge

Zurück