Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1841 | Besucher online: 38
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

einfacher rekursiver Mathe Parser


Autor: mogel
Sprache: VB.NET
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 5139
  
Kick it on dotnet-kicks.de  

Beschreibung:

Folgendes Beispiel zeigt einen sehr einfachen Mathe-Parser. Neben den Grundrechenarten lässt sich das Beispiel auf Klammern und Sinus etc. noch erweitern

Aufruf erfolgt ganz easy mittels

Dim t as Term = Term.Split("1+2")
Console.WriteLine(t.Value())


Prinzipell besteht jeder Term aus einer Operation die zwei Terme miteinander verbindet. Die Terme werden an den Grundrechenoperationen rekursiv zerlegt (Split-Methode). Die neuen Teil-Terme werden den einzelnen Operator-Klassen zugewiesen. Diese zerlegen die Teil-Terme erneut - rekursiv eben.


Abgelegt unter: mathe, parser, expression.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
Public MustInherit Class Term

    ''' <summary>
    ''' liefert den Wert des aktuellen Terms
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function Value() As Integer

    ''' <summary>
    ''' die linke Seite der Operation
    ''' </summary>
    ''' <remarks></remarks>
    Protected left As Term

    ''' <summary>
    ''' die rechte Seite der Operation
    ''' </summary>
    ''' <remarks></remarks>
    Protected right As Term

    ''' <summary>
    ''' der Konsturktor wird von den anderen Klassen aufgerufen
    ''' </summary>
    ''' <param name="left">die linke Seite der Operation</param>
    ''' <param name="right">die rechte Seite - jener welcher eben</param>
    ''' <remarks></remarks>
    Protected Sub New(ByVal left As String, ByVal right As String)
        If left Is Nothing Or right Is Nothing Then Return
        Me.left = Term.Split(left)
        Me.right = Term.Split(right)
    End Sub

    ''' <summary>
    ''' zerlegt den übergebenen Term in die entsprechenden kleineren Terme
    ''' </summary>
    ''' <param name="t">dieser Term soll zerlegt werden</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Split(ByVal t As String) As Term
        t = t.Replace(" ", "") ' Leerzeichen sind doof

        ' Term splitten - Punktrechnung vor Strichrechnung
        Dim index As Integer = -1
        ' -- Addition
        index = t.IndexOf("+")
        If index > 0 Then Return New Addition(t.Substring(0, index), t.Substring(index + 1))
        ' -- Subtraktion
        index = t.IndexOf("-")
        If index > 0 Then Return New Subtraction(t.Substring(0, index), t.Substring(index + 1))
        ' -- Multiplikation
        index = t.IndexOf("*")
        If index > 0 Then Return New Multiplication(t.Substring(0, index), t.Substring(index + 1))
        ' -- Division
        index = t.IndexOf("/")
        If index > 0 Then Return New Division(t.Substring(0, index), t.Substring(index + 1))

        Return New Variable(t)
    End Function

End Class

Public Class Addition
    Inherits Term

    Public Sub New(ByVal left As String, ByVal right As String)
        MyBase.New(left, right)
    End Sub

    Public Overrides Function Value() As Integer
        Return left.Value + right.Value
    End Function

    Public Overrides Function ToString() As String
        Return "[" & left.ToString & "+" & right.ToString & "]"
    End Function

End Class

Public Class Subtraction
    Inherits Term

    Public Sub New(ByVal left As String, ByVal right As String)
        MyBase.New(left, right)
    End Sub

    Public Overrides Function Value() As Integer
        Return left.Value - right.Value
    End Function

    Public Overrides Function ToString() As String
        Return "[" & left.ToString & "-" & right.ToString & "]"
    End Function

End Class

Public Class Multiplication
    Inherits Term

    Public Sub New(ByVal left As String, ByVal right As String)
        MyBase.New(left, right)
    End Sub

    Public Overrides Function Value() As Integer
        Return left.Value * right.Value
    End Function

    Public Overrides Function ToString() As String
        Return "[" & left.ToString & "*" & right.ToString & "]"
    End Function

End Class

Public Class Division
    Inherits Term

    Public Sub New(ByVal left As String, ByVal right As String)
        MyBase.New(left, right)
    End Sub

    Public Overrides Function Value() As Integer
        Return left.Value / right.Value
    End Function

    Public Overrides Function ToString() As String
        Return "[" & left.ToString & "/" & right.ToString & "]"
    End Function

End Class

Public Class Variable
    Inherits Term

    Private content As Integer

    Public Sub New(ByVal t As String)
        MyBase.New(Nothing, Nothing)
        If Not Integer.TryParse(t, content) Then Throw New ApplicationException("Term '" & t & "' ist keine Zahl")
    End Sub

    Public Overrides Function Value() As Integer
        Return content
    End Function

    Public Overrides Function ToString() As String
        Return "[" & content & "]"
    End Function

End Class

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Firendeath schrieb am:  09.11.2011 10:06:25

2 Sachen....
Erstens Funktioniert das auflösen von Gleichungen mit negativen Faktoren nicht z.b. 2*-4
Zweitens würde ich die Rückgabe von int in den Typ double ändern um Ergebnisse mit Komma anzeigen zu können.

LG Firen


Diese Snippets könnten für Sie interessant sein:
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Multiplikation von übergroßen Zahlen
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] Prüfung auf narzisstische Zahlen
[C#] CellMatrix
[C#] Maschinengenauigkeit
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] Permutation nachweisen
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Primfaktorzerlegung
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Modulare Exponentation
[VB.NET] Fibonacci-Folge iterativ erzeugen
[VB.NET] Das Sieb von Atkin
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Binäre Exponentation
[VB.NET] Größter gemeinsamer Teiler (2)
[VB.NET] Binomialkoeffizient
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] Einfaches Text-Highlighting

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.