Hallo Comm,
ich habe mir gedacht, ich mach mal einen Rechner ohne VB Code zu kompilieren und mit der Rechenreihenfolge:
- Klammern
- Punkt vor Strich
- Links nach Rechts
wiegesagt es funktioniert völlig ohne den VB kompiler, da war ja auch mal ein Beispiel.
Naja hier der Code:
die Form könnte wie im Anhang aussehen
die Rechnung muss zB folgend aussehen:
das ergebnis ist hier 50, nach beachtung von klammern
aber das tut nicht zur Sache
wenn keine Leerzeichen zwischen Operanten und Zahlen bzw. Klammern sind wird es Fehler geben
ihr könnt ja eine kleine Funktion dazuschreiben die das erledigt und überprüft (falls etwas zusammengeschrieben sein sollte).
EDIT: Bug bei Punkt vor Strich Rechnung (*, / oder ^) behoben
progglord
ich habe mir gedacht, ich mach mal einen Rechner ohne VB Code zu kompilieren und mit der Rechenreihenfolge:
- Klammern
- Punkt vor Strich
- Links nach Rechts
wiegesagt es funktioniert völlig ohne den VB kompiler, da war ja auch mal ein Beispiel.
Naja hier der Code:
VB.NET-Quellcode
- Option Strict On
- Public Class Form1
- Function CalcNormal(ByVal MatheExp As String) As Double
- Dim Splitter As String() = MatheExp.Split(CChar(" "))
- Dim Zahlen As New List(Of Double)
- Dim Operanten As New List(Of Char)
- For Each aSpl As String In Splitter
- If IsNumeric(aSpl) Then
- Zahlen.Add(CDbl(aSpl))
- Else
- Operanten.Add(CChar(aSpl))
- End If
- Next
- If MatheExp.Contains("-") Or MatheExp.Contains("+") Or MatheExp.Contains("*") Or MatheExp.Contains("/") Or MatheExp.Contains("^") Then
- Dim Ergebnis As Double
- For i As Integer = 0 To Zahlen.Count - 1
- If i = 0 Then
- Ergebnis += Zahlen(i)
- Else
- Dim Op As Char = Operanten(i - 1)
- Dim Za As Double = Zahlen(i)
- Select Case Op
- Case CChar("+") : Ergebnis += Za
- Case CChar("-") : Ergebnis -= Za
- Case CChar("/") : Ergebnis /= Za
- Case CChar("*") : Ergebnis *= Za
- Case CChar("^") : Ergebnis ^= Za
- End Select
- End If
- Next
- Return Ergebnis
- Else
- Return CDbl(MatheExp.Trim)
- End If
- End Function
- Function Calc(ByVal MathExp As String) As Double
- Dim ToCalc As String = MathExp
- 'Prüfen auf Klammer
- If MathExp.Contains("(") Then
- Dim kSplitter As String() = MathExp.Split(CChar("("))
- For Each kSpl As String In kSplitter
- If kSpl.Contains(")") Then
- Dim Inner As String = kSpl.Split(CChar(")"))(0)
- ToCalc = ToCalc.Replace("(" & Inner & ")", CalcNormal(Inner).ToString)
- End If
- Next
- End If
- ToCalc = ToCalc.Replace(")", "").Replace("(", "")
- 'Punkt vor Strich Rechnung beachten
- Dim Splitter As String() = ToCalc.Split(CChar(" "))
- Dim Zahlen As New List(Of Double)
- Dim Operanten As New List(Of Char)
- For Each aSpl As String In Splitter
- If IsNumeric(aSpl) Then
- Zahlen.Add(CDbl(aSpl))
- Else
- Operanten.Add(CChar(aSpl))
- End If
- Next
- ToCalc = ToCalc.Trim & " "
- ToCalc = ToCalc.Replace(",0 ", " ")
- For i As Integer = 0 To Zahlen.Count - 1
- If Not i = 0 Then
- Dim Op As Char = Operanten(i - 1)
- Dim Za2 As String = Zahlen(i).ToString
- Dim Za1 As String = Zahlen(i - 1).ToString
- Dim gen As String = Za1.ToString & " " & Op & " " & Za2.ToString
- If Op = "*" Or Op = "/" Or Op = "^" Then
- ToCalc = ToCalc.Replace(gen, CalcNormal(gen).ToString)
- End If
- End If
- Next
- 'Rechts nach Links Rechnung
- Return CalcNormal(ToCalc)
- End Function
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Try
- Dim Ergebnis As Double = Calc(TextBox1.Text.Trim)
- MsgBox(Ergebnis.ToString)
- Catch ex As Exception
- MsgBox(ex.Message)
- End Try
- End Sub
- End Class
die Form könnte wie im Anhang aussehen
die Rechnung muss zB folgend aussehen:
das ergebnis ist hier 50, nach beachtung von klammern
aber das tut nicht zur Sache
wenn keine Leerzeichen zwischen Operanten und Zahlen bzw. Klammern sind wird es Fehler geben
ihr könnt ja eine kleine Funktion dazuschreiben die das erledigt und überprüft (falls etwas zusammengeschrieben sein sollte).
EDIT: Bug bei Punkt vor Strich Rechnung (*, / oder ^) behoben
progglord
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „progglord“ ()