Beschreibung:
Der Taschenrechner hat derzeit folgende Funktionen:
-Grundrechenarten + ^
-Sinus
- Arkus Sinus
-Cosinus
- Arkus Cosinus
-Tangens
-Arkus Tangens
-Fakultät
-Logharitmus
-Wurzel
-eigene Funktionen
-Modulo
-Exponentialfunktion
-Wechsel zwischen Gradmaß und Bogenmaß
-PI und E Konstanten
-Klammerhervorhebung
-Rechenschritte werden ausführlich angezeigt
-Funktionsgraphen zeichnen lassen (+ nähere Untersuchungen mit Zoomen / skalieren / dynamisch Punkte neu berechnen und Graphen aktualisieren)
Damit sind Ausdrücke wie:
sqrt(PI * (13 / 8,51)^-2) / log(3)
oder
sqrt(6 * 2^-(3! mod (4! mod 5!)) * 11 / (8,5-3,5)^2)
kein Problem.
Desweiteren werden viele Tippfehler ignoriert, bspweise:
+-3 * 3
wird zu +3 * 3
oder -- wird zu + bzw --- zu - usw.
oder 0,51234,156,231 + 12351,1234,2
klappt auch, die weiteren kommas werden einfach ignoriert.
was dann zu 0,51234156231 + 12351,12342 wird.
Der Funktionsgraph kann auserdem verschoben (mit linksklick gedrückt halten und mausbewegen) bzw gezoomed werden (mit Mausrad).
Die Funktionsweise meines Parsers ist so:
Die Operatoren bzw Funktionen haben alle eine Priorität und zu allererst wird der Ausdruck n-mal durchlaufen, wobei n für die anzahl der vorhandenen operatoren steht.
Dannach wird zu allererst der mit der obersten Priorität gesucht (das sind die Funktionen wie sin, cos und Klammern etc), anschliessend wird wenn sin( bzw cos( gefunden wurde, der Inhalt der Klammer erfasst und rekursiv die Funktion erneut aufgerufen mit dem Ausdruck in den Klammern als parameter, das wird solange gemacht bis keine Klammern mehr vorhanden sind (d.h. keine Funktionen mehr sondern nur noch operatoren vorhanden sind), zur Veranschaulichung:
Aufgabe:
13+21*sin(16-2^-(17+3/8))
sin( wird erfasst und der Inhalt bis zur schliessenden sin Klammer wird als parameter an die Funktion übergeben.
Also 16-2^-(17+3/4)
Da sind erneut Klammern, das heisst es wird die Funktion erneut rekursiv aufgerufen und als Parameter wird der Inhalt der Klammern übergeben, also:
17+3/4.
Nun gibt es keine Funktionen und Klammern mehr, d.h. die Operatoren mit der höchsten Priorität sind durch, nun kommen die mit der zweithöchsten Priorität, das wäre ^ davon gibt es hier auch nichts, also geht man zu den Operatoren mit der dritthöchsten Priorität, das wäre * und /
Nun wird der Ausdruck durchgegangen und wenn auf ein * oder auf ein / gestoßen wird, wird erst nach links gezählt bis zuerst min. eine Zahl und dann ein Operator gefunden wurde oder bis der Anfang/das Ende des Ausdrucks erreicht wurde. Das gleiche dann nach rechts hin.
Dannach wird mit Substring der Teilausdruck rausgefiltert, die mittels der beiden Variablen die nach unten und oben gezählt worden sind gefiltert worden und es kommt raus:
3/4
Das wird nun abgefragt ob sich / oder * befindet, dann gesplittet und jenachdem dividiert bzw multipliziert (hier dividiert).
Anschliessend wird der Term durch das Ergebniss ersetzt und man hat 17+0,75 raus.
Nun kommt der letzte Teil mit den Operatoren mit der niedrigsten Priorität: + und -
Es wird nun genau wie bei * / durchgegangen und die grenzen gezählt, anschliessend abgefragt - ausgerechnet - ersetzt und es kommt 17,75 raus.
Das wars eigtl schon, nun ruft die Funktion sich dauernd rekursiv auf, bis der ganze Ausdruck abgearbeitet wurde und das Ergebniss alleine dort stehen bleibt.
Natürlich gibt es einige Ausnahmen, beispielsweise wenn die Zahl zu groß wird, kommt sowas wie 2981283e-3 was soviel heisst wie 2981283*10^-3
das muss man dann explizit rausfiltern.
Screenshot:
Taschenrechner:
Funktionsgraph:
Download:







