Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Coding Releases
You last visited: Today at 16:48

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C#] Taschenrechner mit eigenem Parser

Discussion on [C#] Taschenrechner mit eigenem Parser within the Coding Releases forum part of the Coders Den category.

Reply
 
Old   #1
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
[C#] Taschenrechner mit eigenem Parser

Wollte mal meinen Taschenrechner mit eigenem Parser vorstellen

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:

DeinMud is offline  
Thanks
5 Users
Old 03/18/2014, 19:58   #2
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by DeinMud View Post
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)
Für einen eigenen Entwurf ist das schon ziemlich weit. Als nächstes könntest du die von deiner Grammatik beschriebenen Sätze (die Ausdrücke) formal beschreiben. Das könnte etwa so aussehen:
Code:
E = E + T | T
T = T * F | F
F = ( E ) | number
Dabei steht E für expression, T für term und F für factor. Das Verkettungszeichen (der senkrechte Strich) steht für eine Alternative.
Wenn eine Grammatik so vorliegt, kann man ganz einfach für jedes Nichtterminal (das auf der linken Seite vom "=", also E, T und F) eine eigene Funktion schreiben. Für die Terminale (number, +, *, ( und )) könnte das auch hilfreich sein.
Wenn du dein Programm erweiterst, könntest du so auch einen einfachen Interpreter erstellen.
Sollte dich dieses Thema interessieren, kannst du dich im Internet darüber informieren oder ein Buch zulegen.
Tasiro is offline  
Old 03/18/2014, 20:56   #3
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
Ja, mein Konzept ist auch problemlos erweiterbar,
probiere grade das Ausdrücke wie 5(3+2)
wie 5*(3+2) gewertet werden.

Ich versteh nicht genau was du meinst, kannst du ein Beispiel zeigen was du meinst?
DeinMud is offline  
Old 03/18/2014, 23:01   #4
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Es ist nur ein Beispiel, nicht mehr.
Der Text wird nur ein einziges Mal durchlaufen.

Oft wird vor dem Parser noch ein Lexer genutzt. Dieser gibt Token wie einzelne Zeichen, ganze Zahlen oder Symbole wie sin an den Parser weiter und lässt zugleich den Leerraum aus. Dadurch muss sich der Parser damit nicht mehr beschäftigen. In obigem Beispiel übernähme er die Aufgabe von expression.Replace(" ","") und von EvalNumber.

Es wurden zahllose Werkzeuge geschaffen, um Lexer und Parser automatisiert zu erschaffen, sodass nur noch die Regeln festgelegt werden müssen.
Tasiro is offline  
Old 03/19/2014, 20:38   #5
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
Update:

-Ausdrücke wie 5(3-2)
werden jetzt wie 5*(3-2) gewertet.
-Sin^-1;cos^-1;tan^-1 hinzugefügt
-Klammerhervorhebung hinzugefügt (im Bild nicht sichtbar)
-Design geändert
DeinMud is offline  
Old 03/19/2014, 20:40   #6
 
elite*gold: 0
Join Date: Jan 2011
Posts: 362
Received Thanks: 41
Könntest du den Sourcecode Posten? Würde mir das gerne näher betrachten
Rullx3 is offline  
Old 03/19/2014, 20:47   #7
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
Kannst es meinetwegen decompilen.
DeinMud is offline  
Old 03/19/2014, 22:27   #8
 
alpines's Avatar
 
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
Falls du noch Sachen suchst was du hinzufügen kannst, werf mal einen Blick auf NCalc.
Du kannst als Operator noch % hinzufügen (statt mod) und \ für Ganzzahldivision, so das der Rest nicht returned wird. Beispiel:

15 \ 4 = 3

Außerdem sieht die Umkehrfunktion vom Sinus/Cosinus/Tangens hässlich aus, verwende doch lieber arcsin / arccos / arctan.
alpines is offline  
Old 03/19/2014, 23:24   #9
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Wenn jetzt noch den (arc)cotangens, die Exponentialfunktion, die hyperbolischen und Areafunktionen hinzufügst, solltest du die elementaren beisammen haben (falls ich grad nicht noch was vergessen hab).
Schlüsselbein is offline  
Old 03/19/2014, 23:50   #10
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by Schlüsselbein View Post
Wenn jetzt noch den (arc)cotangens, die Exponentialfunktion, die hyperbolischen und Areafunktionen hinzufügst, solltest du die elementaren beisammen haben (falls ich grad nicht noch was vergessen hab).
Sekans und Kosekans.

Die Möglichkeit, rekursive Funktionen zu definieren, fehlt. Dazu wäre natürlich eine bedingte Berechnung notwendig.
Und wenn du schon einmal dabei bist: Beträge, mehrere Funktionsdefinitionen mit mehreren Variablen und Terme wären hilfreich, etwa (x+1)|(x=2) statt drei (die Syntax ist der Mathematik entnommen).
Tasiro is offline  
Thanks
1 User
Old 03/20/2014, 19:31   #11
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
Es können nun Funktionsgraphen automatisch erstellt werden (siehe Bilder)

Mod werd ich später noch mit % ersetzen.
DeinMud is offline  
Old 03/20/2014, 19:37   #12


 
AoXis's Avatar
 
elite*gold: 0
Join Date: Mar 2010
Posts: 547
Received Thanks: 63
Gerade mal ausprobiert, wenn ich x^2 mache kommt zeigt der mir ein falsches Ergebnis an, wenn ich dann 1x^2 mache kommt wieder was komplett anderes raus.
AoXis is offline  
Old 03/20/2014, 19:43   #13
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
1x geht auch nicht, du musst 1*x eingeben.
Bei 1x^2 kommt nämlich 1 und x^2, heisst bei z.B. x = 2
2^2 = 4
14 raus. Deswegen das komische Ergebniss, das werd ich noch ändern.
x^2 kommt nichts falsches raus. (zumindest bei mir)
DeinMud is offline  
Old 03/20/2014, 19:49   #14


 
AoXis's Avatar
 
elite*gold: 0
Join Date: Mar 2010
Posts: 547
Received Thanks: 63
Quote:
Originally Posted by DeinMud View Post
1x geht auch nicht, du musst 1*x eingeben.
x^2 kommt nichts falsches raus.
hmm komisch da sagt Geogebra was anderes? Was mach ich falsch? Ich glaub irgendwas hab ich nicht beachtet also ich denk mal er Probiert die Werte einzusetzen dann würde die Zeichnung auch stimmen dachte er Zeichnet die Funktion x^2 auf.



AoXis is offline  
Old 03/20/2014, 19:57   #15
 
DeinMud's Avatar
 
elite*gold: 0
Join Date: Jan 2010
Posts: 990
Received Thanks: 127
Ah, das ist aber nicht der Fehler im Graphen zeichnen, sondern das ist nen Rechenfehler, hatte den bislang nicht bemerkt, werde das beheben.

Bei - Vorzeichen scheint da iwas schief zu laufen..

€ Habe den Fehler nun gefunden, werde die neue Version bald hochladen wenn Ich geprüft habe ob sich jetzt irgendein neuer Bug eingeschlichen hat.

Habs geupdated, sollte jetzt klappen!
DeinMud is offline  
Reply

Tags
parsen, parser, rechnen, rechner, taschenrechner


Similar Threads Similar Threads
NPC.ini Parser
03/13/2011 - CO2 Programming - 1 Replies
Ah, well I know this is REALLY simple, but as I was rummaging through my hard drive, I found something that might be useful to some people. It pretty much goes through the npc.ini and parses the data and writes it to a new text file, and writes it like this, 10-19 Storekeeper Yeah its pretty simple, but it should help most people. You MIGHT need to change the value of the 1122 in "for (int x = 1; x < 1122; x++)" depending on what patch the npc.ini is. using System; using...
Item-Parser
07/13/2010 - Diablo 2 - 17 Replies
D2Parser Diesen Parser hab ich mir runtergeladen. Hab alles nach Anleitung befolgt, aber: Wenn ich D2 per Parser starte und mich in Europe einlogge, dort mit nem Char ingame gehe und dann anschließend aus dem Spiel wieder austrete wird keine .xml Datei erstellt, es gibt auch garkeinen d2plog-Ordner im Hauptverzeichnis. Jemand eine Ahnung was ich vergessen hab?
Parser
04/08/2009 - FFXI Exploits, Hacks, Bots, Tools & Macros - 0 Replies
Hello, sorry i have been looking for a parser for some time and have tried many different ones and none seem to work in some way or another, most of the time its compatibility issues (vista x64) or some .net framework problem or something. The ones i did get working only displayed my data (which was innacurate btw) and did not display anyone elses data that was in the party. If anyone can help it would be greatly appreciated, thanks ^^



All times are GMT +1. The time now is 16:49.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.