Da ja hier das Taschenrechner-Schreiben 'zum guten Ton' gehört, hier ist meiner.
Das Teil kann selbstverständlich Punkt vor Strich und negative Vorzeichen aber auch beliebige Klammerungen, Funktionen und Verschachtelungen.
So einfache Sachen wie zB: ((sin(45)+3)*(5-7*log(4)))+cos(39-sqrt(5*4-16)) sind kein Problem.
Zur Auswertung wird die eingegebene Formel zuerst rekursiv in einen binären Baum eingelesen und dieser anschließend mittels eines Inorderdurchlaufs berechnet.
Die Hauptarbeit macht dabei die Funktion die den Baum erstellt, bereits dort werden die Prioritäten der einzelnen Ausdrücke berücksichtigt und dementsprechend im Baum abgelegt.
Die Funktion die anschließend den Baum berechnet besteht im wesentlichen nur aus den rekursiven Aufrufen und einem großen Select Case-Block in dem die einzelnen Funktionen und Operatoren unterschieden werden.
Zur Veranschaulichung habe ich noch eine Funktion eingebaut mit der man sich den Berechnungsbaum ansehen kann. Startknoten des Baumes ist der in der ersten Zeile, von dort aus wird dann gemäß Inorder 'zuerst nach links', 'dann der Knoten selbst', 'danach nach rechts' der Baum durchlaufen.
Im Baum selbst sind keinerlei Klammern abgelegt, die entsprechende Bearbeitungsreihenfolge ergibt sich aus der Anordnung der Knoten. Wenn man sich die Abarbeitung anzeigen läßt, wird zur Verdeutlichung der Berechnungsreihenfolge jedoch die entsprechende Klammerung mit ausgegeben.
Der Berechnungsalgorithmus (Baum erstellen und auswerten) incl den benötigten Funktionen und Klassen besteht aus ca 350 LOC (Lines Of Code), der Rest ist nur Beiwerk: Kommentare, Bedienung etc.
Das Teil kann selbstverständlich Punkt vor Strich und negative Vorzeichen aber auch beliebige Klammerungen, Funktionen und Verschachtelungen.
So einfache Sachen wie zB: ((sin(45)+3)*(5-7*log(4)))+cos(39-sqrt(5*4-16)) sind kein Problem.
Zur Auswertung wird die eingegebene Formel zuerst rekursiv in einen binären Baum eingelesen und dieser anschließend mittels eines Inorderdurchlaufs berechnet.
Die Hauptarbeit macht dabei die Funktion die den Baum erstellt, bereits dort werden die Prioritäten der einzelnen Ausdrücke berücksichtigt und dementsprechend im Baum abgelegt.
Die Funktion die anschließend den Baum berechnet besteht im wesentlichen nur aus den rekursiven Aufrufen und einem großen Select Case-Block in dem die einzelnen Funktionen und Operatoren unterschieden werden.
Zur Veranschaulichung habe ich noch eine Funktion eingebaut mit der man sich den Berechnungsbaum ansehen kann. Startknoten des Baumes ist der in der ersten Zeile, von dort aus wird dann gemäß Inorder 'zuerst nach links', 'dann der Knoten selbst', 'danach nach rechts' der Baum durchlaufen.
Im Baum selbst sind keinerlei Klammern abgelegt, die entsprechende Bearbeitungsreihenfolge ergibt sich aus der Anordnung der Knoten. Wenn man sich die Abarbeitung anzeigen läßt, wird zur Verdeutlichung der Berechnungsreihenfolge jedoch die entsprechende Klammerung mit ausgegeben.
Der Berechnungsalgorithmus (Baum erstellen und auswerten) incl den benötigten Funktionen und Klassen besteht aus ca 350 LOC (Lines Of Code), der Rest ist nur Beiwerk: Kommentare, Bedienung etc.