Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports System.Globalization
- Imports System.Text
- Imports System.Text.RegularExpressions
- Public Class Form1
- Public Property zahl As String = ""
- Public Property calc As String = ""
- Dim input As String = "CultureInfo.InvariantCulture"
- Private Function GetDezimalTrennzeichen() As String
- Return CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
- End Function
- Private WithEvents b1Button As Button ' WithEvents-Variable für den Button b1
- Private WithEvents b2Button As Button ' WithEvents-Variable für den Button b2
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- ' Event Handler für die Steuerelemente zuweisen
- b1Button = b1 ' Hier b1 durch den tatsächlichen Namen des Buttons im Designer ersetzen
- b2Button = b2 ' Hier b2 durch den tatsächlichen Namen des Buttons im Designer ersetzen
- ' Weitere Event Handler für die restlichen Steuerelemente zuweisen
- End Sub
- Private Sub b1_Click(sender As Object, e As EventArgs) Handles b1.Click
- tb.Text += "1"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b2_Click(sender As Object, e As EventArgs) Handles b2.Click
- tb.Text += "2"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b3_Click(sender As Object, e As EventArgs) Handles b3.Click
- tb.Text += "3"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b4_Click(sender As Object, e As EventArgs) Handles b4.Click
- tb.Text += "4"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b5_Click(sender As Object, e As EventArgs) Handles b5.Click
- tb.Text += "5"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b6_Click(sender As Object, e As EventArgs) Handles b6.Click
- tb.Text += "6"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b7_Click(sender As Object, e As EventArgs) Handles b7.Click
- tb.Text += "7"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b8_Click(sender As Object, e As EventArgs) Handles b8.Click
- tb.Text += "8"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b9_Click(sender As Object, e As EventArgs) Handles b9.Click
- tb.Text += "9"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub b0_Click(sender As Object, e As EventArgs) Handles b0.Click
- tb.Text += "0"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub bComma_Click(sender As Object, e As EventArgs) Handles bcomma.Click
- tb.Text += ","
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub bdel_Click(sender As Object, e As EventArgs) Handles bdel.Click
- If tb.Text.Length > 0 Then
- tb.Text = tb.Text.Substring(0, tb.Text.Length - 1)
- End If
- End Sub
- Private Sub bac_Click(sender As Object, e As EventArgs) Handles bac.Click
- zahl = ""
- calc = ""
- tb.Text = ""
- End Sub
- Private Sub bsolve_Click(sender As Object, e As EventArgs) Handles bsolve.Click
- Dim input As String = tb.Text
- Dim decimalSeparator As String = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
- input = input.Replace(",", ".")
- tb.Text = input
- ' Quadratwurzel berechnen
- Dim sqrtRegex As New Regex("sqrt\(([^()]+)\)")
- While sqrtRegex.IsMatch(input)
- input = sqrtRegex.Replace(input, Function(match)
- Dim innerExpression As String = match.Groups(1).Value
- Dim result As Double = EvaluateExpression(innerExpression)
- If result >= 0 Then
- Return Math.Sqrt(result).ToString()
- Else
- Throw New ArithmeticException("Negatives Ergebnis")
- End If
- End Function)
- End While
- ' Kehrwert berechnen
- Dim inverseRegex As New Regex("1\s*/\s*([^()]+)")
- While inverseRegex.IsMatch(input)
- input = inverseRegex.Replace(input, Function(match)
- Dim innerExpression As String = match.Groups(1).Value
- Dim result As Double = EvaluateExpression(innerExpression)
- If result <> 0 Then
- Return (1.0 / result).ToString()
- Else
- Throw New DivideByZeroException()
- End If
- End Function)
- End While
- ' Auswertung der Klammerausdrücke zuerst
- Dim parenRegex As New Regex("\(([^\(\)]+)\)")
- While parenRegex.IsMatch(input)
- input = parenRegex.Replace(input, Function(match)
- Dim innerExpression As String = match.Groups(1).Value
- Dim result As Double = EvaluateExpression(innerExpression)
- Return result.ToString()
- End Function)
- End While
- ' Multiplikation und Division nach der Klammerauswertung
- Dim mulDivRegex As New Regex("\d+(\.\d+)?\s*[*/]\s*\d+(\.\d+)?")
- While mulDivRegex.IsMatch(input)
- input = mulDivRegex.Replace(input, Function(match)
- Dim parts() As String = match.Value.Split({"*", "/"}, StringSplitOptions.TrimEntries)
- Dim leftVal As Double = Double.Parse(parts(0))
- Dim rightVal As Double = Double.Parse(parts(1))
- Dim result As Double
- If match.Value.Contains("*") Then
- result = leftVal * rightVal
- Else
- result = leftVal / rightVal
- End If
- Return result.ToString()
- End Function)
- End While
- ' Addition und Subtraktion nach der Klammerauswertung
- Dim addSubRegex As New Regex("\d+(\.\d+)?\s*[+\-]\s*\d+(\.\d+)?")
- While addSubRegex.IsMatch(input)
- input = addSubRegex.Replace(input, Function(match)
- Dim parts() As String = match.Value.Split({"+", "-"}, StringSplitOptions.TrimEntries)
- Dim leftVal As Double = Double.Parse(parts(0))
- Dim rightVal As Double = Double.Parse(parts(1))
- Dim result As Double
- If match.Value.Contains("+") Then
- result = leftVal + rightVal
- Else
- result = leftVal - rightVal
- End If
- Return result.ToString()
- End Function)
- End While
- ' Set the final result in the TextBox
- tb.Text = input
- Dim containsInvalidCharacters As Boolean = False
- For i As Integer = tb.Text.Length - 1 To 0 Step -1
- If Not IsNumeric(tb.Text.Substring(i, 1)) And Not "+-*/".Contains(tb.Text.Substring(i, 1)) Then
- containsInvalidCharacters = True
- Exit For
- End If
- Next
- ' Beibehaltene For-Schleife
- For index As Integer = 1 To 2
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 12
- For index As Integer = 3 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 321
- For index As Integer = 4 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 4321
- For index As Integer = 5 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 54321
- For index As Integer = 6 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 654321
- For index As Integer = 7 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 7654321
- For index As Integer = 8 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 87654321
- For index As Integer = 9 To 1 Step -1
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 987654321
- For index As Integer = 0 To 0
- Debug.Write(index.ToString & "")
- Next
- Debug.WriteLine("")
- 'Output: 0
- Dim evaluatedExpression As Double = EvaluateExpression(tb.Text.Replace(",", "."))
- tb.Text = evaluatedExpression.ToString()
- End Sub
- Private Sub bmult_Click(sender As Object, e As EventArgs) Handles bmult.Click
- zahl += tb.Text
- calc = "*"
- tb.Text += "*"
- End Sub
- Private Sub bdiv_Click(sender As Object, e As EventArgs) Handles bdiv.Click
- zahl += tb.Text
- calc = "/"
- tb.Text += "/"
- End Sub
- Private Sub bPlus_Click(sender As Object, e As EventArgs) Handles bplus.Click
- tb.Text += "+"
- Debug.WriteLine("Current expression: " & tb.Text)
- End Sub
- Private Sub bminus_Click(sender As Object, e As EventArgs) Handles bmin.Click
- zahl += tb.Text
- calc = "-"
- tb.Text += "-"
- End Sub
- Private Sub bRound_Click(sender As Object, e As EventArgs) Handles bRound.Click
- tb.Text += Math.Round(Val(tb.Text))
- End Sub
- Private Sub bkehrwert_Click(sender As Object, e As EventArgs) Handles bkehrwert.Click
- tb.Text = 1.0 / Val(tb.Text)
- End Sub
- Private Sub bPI_Click(sender As Object, e As EventArgs) Handles bPI.Click
- tb.Text = Math.PI
- End Sub
- Private Sub be_Click(sender As Object, e As EventArgs) Handles be.Click
- tb.Text = Math.E
- End Sub
- Private Sub tb_TextChanged(sender As Object, e As EventArgs) Handles tb.TextChanged
- End Sub
- Private Sub bKlammaauf_Click(sender As Object, e As EventArgs) Handles bKlammaauf.Click
- tb.Text += "("
- End Sub
- Private Sub bKlammazu_Click(sender As Object, e As EventArgs) Handles bKlammazu.Click
- tb.Text += ")"
- End Sub
- Private Function ParseExpression(expression As String) As Double
- Dim parts() As String = expression.Split("+"c, "-"c, "*"c, "/"c)
- Dim numbers As New List(Of Double)()
- For Each part As String In parts
- Dim num As Double
- If Double.TryParse(part, NumberStyles.Any, CultureInfo.InvariantCulture, num) Then
- numbers.Add(num)
- Else
- ' Wenn das Parsen fehlschlägt, könnte es ein Problem mit dem Dezimaltrennzeichen (Komma) geben
- ' Hier kannst du entsprechende Fehlerbehandlung vornehmen
- Throw New FormatException("Ungültiges Zahlenformat")
- End If
- Next
- Dim operators As New List(Of Char)()
- For Each c As Char In expression
- If IsOperator(c) Then
- operators.Add(c)
- End If
- Next
- Dim result As Double = numbers(0)
- For i As Integer = 0 To operators.Count - 1
- If operators(i) = "+"c Then
- result += numbers(i + 1)
- ElseIf operators(i) = "-"c Then
- result -= numbers(i + 1)
- ElseIf operators(i) = "*"c Then
- result *= numbers(i + 1)
- ElseIf operators(i) = "/"c Then
- result /= numbers(i + 1)
- End If
- Next
- Return result
- End Function
- Private Function EvaluateExpression(expression As String) As Double
- Dim parenRegex As New Regex("\(([^\(\)]+)\)")
- While parenRegex.IsMatch(expression)
- expression = parenRegex.Replace(expression, Function(match)
- Dim innerExpression As String = match.Groups(1).Value
- Dim innerResult As Double = ParseExpression(innerExpression)
- Return innerResult.ToString()
- End Function)
- End While
- Dim result As Double = ParseExpression(expression)
- Return result
- End Function
- Private Function IsOperator2(c As Char) As Boolean
- Return "+-*/^s".Contains(c)
- End Function
- Private Function FindOperatorWithHighestPrecedence2(operators As List(Of Char)) As Integer
- For i As Integer = 0 To operators.Count - 1
- If operators(i) = "^"c Or operators(i) = "s"c Then
- Return i
- End If
- Next
- For i As Integer = 0 To operators.Count - 1
- If operators(i) = "*"c Or operators(i) = "/"c Then
- Return i
- End If
- Next
- ' Return the index of the first operator, which will be "+" or "-"
- Return 0
- End Function
- Private Sub NewMethod(sqrtRegex As Regex)
- input = sqrtRegex.Replace(input, Function(match)
- Dim innerExpression As String = match.Groups(1).Value
- Dim result As Double = EvaluateExpression(innerExpression)
- If result >= 0 Then
- Return Math.Sqrt(result)
- Else
- ' Wenn das Ergebnis negativ ist, wird eine Exception ausgelöst
- Throw New ArithmeticException("Negatives Ergebnis")
- End If
- End Function)
- End Sub
- Private Function IsOperator(c As Char) As Boolean
- Return c = "+"c OrElse c = "-"c OrElse c = "*"c OrElse c = "/"c OrElse c = "^"c OrElse c = "s"c
- End Function
- Private Function FindOperatorWithHighestPrecedence(operators As List(Of Char)) As Integer
- Dim highestPrecedence As Integer = 0
- Dim index As Integer
- For i As Integer = 0 To operators.Count - 1
- Dim precedence As Integer = GetOperatorPrecedence(operators(i))
- If precedence > highestPrecedence OrElse (precedence = highestPrecedence AndAlso operators(i) = "^"c) Then
- highestPrecedence = precedence
- index = i
- End If
- Next
- Return index
- End Function
- Private Function GetOperatorPrecedence(op As Char) As Integer
- If op = "^"c Then
- Return 3
- ElseIf op = "*"c OrElse op = "/"c Then
- Return 2
- ElseIf op = "+"c OrElse op = "-"c Then
- Return 1
- End If
- Return 0
- End Function
- Private Sub bPow_Click(sender As Object, e As EventArgs) Handles bPow.Click
- tb.Text += "^"
- End Sub
- Private Sub btnSqrt_Click(sender As Object, e As EventArgs) Handles btnSqrt.Click
- Dim inputExpression As String = tb.Text
- Dim evaluatedExpression As Double = EvaluateExpression(inputExpression)
- If evaluatedExpression >= 0 Then
- tb.Text = Math.Sqrt(evaluatedExpression).ToString()
- Else
- tb.Text = "Error: Negative result"
- End If
- End Sub
- Private Sub besc_Click(sender As Object, e As EventArgs) Handles besc.Click
- Me.Close()
- End Sub
- Private Function GetNextToken(ByRef expression As String) As String
- Dim token As New StringBuilder()
- While expression.Length > 0 AndAlso expression(0) = " "c
- expression = expression.Substring(1)
- End While
- If expression.Length = 0 Then
- Return String.Empty
- End If
- If IsOperator(expression(0)) Then
- token.Append(expression(0))
- expression = expression.Substring(1)
- ElseIf expression(0) = "("c Then
- Dim openParentheses As Integer = 1
- token.Append(expression(0))
- expression = expression.Substring(1)
- While openParentheses > 0
- If expression(0) = "("c Then
- openParentheses += 1
- ElseIf expression(0) = ")"c Then
- openParentheses -= 1
- End If
- token.Append(expression(0))
- expression = expression.Substring(1)
- End While
- Else
- While expression.Length > 0 AndAlso (Char.IsDigit(expression(0)) OrElse expression(0) = ","c)
- token.Append(expression(0))
- expression = expression.Substring(1)
- End While
- End If
- Debug.WriteLine("Parsed token: " & token.ToString())
- Return token.ToString()
- End Function
- End Class
Add Comment
Please, Sign In to add comment