Rechner

    • VB.NET

    Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Carl.

      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:

      VB.NET-Quellcode

      1. Option Strict On
      2. Public Class Form1
      3. Function CalcNormal(ByVal MatheExp As String) As Double
      4. Dim Splitter As String() = MatheExp.Split(CChar(" "))
      5. Dim Zahlen As New List(Of Double)
      6. Dim Operanten As New List(Of Char)
      7. For Each aSpl As String In Splitter
      8. If IsNumeric(aSpl) Then
      9. Zahlen.Add(CDbl(aSpl))
      10. Else
      11. Operanten.Add(CChar(aSpl))
      12. End If
      13. Next
      14. If MatheExp.Contains("-") Or MatheExp.Contains("+") Or MatheExp.Contains("*") Or MatheExp.Contains("/") Or MatheExp.Contains("^") Then
      15. Dim Ergebnis As Double
      16. For i As Integer = 0 To Zahlen.Count - 1
      17. If i = 0 Then
      18. Ergebnis += Zahlen(i)
      19. Else
      20. Dim Op As Char = Operanten(i - 1)
      21. Dim Za As Double = Zahlen(i)
      22. Select Case Op
      23. Case CChar("+") : Ergebnis += Za
      24. Case CChar("-") : Ergebnis -= Za
      25. Case CChar("/") : Ergebnis /= Za
      26. Case CChar("*") : Ergebnis *= Za
      27. Case CChar("^") : Ergebnis ^= Za
      28. End Select
      29. End If
      30. Next
      31. Return Ergebnis
      32. Else
      33. Return CDbl(MatheExp.Trim)
      34. End If
      35. End Function
      36. Function Calc(ByVal MathExp As String) As Double
      37. Dim ToCalc As String = MathExp
      38. 'Prüfen auf Klammer
      39. If MathExp.Contains("(") Then
      40. Dim kSplitter As String() = MathExp.Split(CChar("("))
      41. For Each kSpl As String In kSplitter
      42. If kSpl.Contains(")") Then
      43. Dim Inner As String = kSpl.Split(CChar(")"))(0)
      44. ToCalc = ToCalc.Replace("(" & Inner & ")", CalcNormal(Inner).ToString)
      45. End If
      46. Next
      47. End If
      48. ToCalc = ToCalc.Replace(")", "").Replace("(", "")
      49. 'Punkt vor Strich Rechnung beachten
      50. Dim Splitter As String() = ToCalc.Split(CChar(" "))
      51. Dim Zahlen As New List(Of Double)
      52. Dim Operanten As New List(Of Char)
      53. For Each aSpl As String In Splitter
      54. If IsNumeric(aSpl) Then
      55. Zahlen.Add(CDbl(aSpl))
      56. Else
      57. Operanten.Add(CChar(aSpl))
      58. End If
      59. Next
      60. ToCalc = ToCalc.Trim & " "
      61. ToCalc = ToCalc.Replace(",0 ", " ")
      62. For i As Integer = 0 To Zahlen.Count - 1
      63. If Not i = 0 Then
      64. Dim Op As Char = Operanten(i - 1)
      65. Dim Za2 As String = Zahlen(i).ToString
      66. Dim Za1 As String = Zahlen(i - 1).ToString
      67. Dim gen As String = Za1.ToString & " " & Op & " " & Za2.ToString
      68. If Op = "*" Or Op = "/" Or Op = "^" Then
      69. ToCalc = ToCalc.Replace(gen, CalcNormal(gen).ToString)
      70. End If
      71. End If
      72. Next
      73. 'Rechts nach Links Rechnung
      74. Return CalcNormal(ToCalc)
      75. End Function
      76. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      77. Try
      78. Dim Ergebnis As Double = Calc(TextBox1.Text.Trim)
      79. MsgBox(Ergebnis.ToString)
      80. Catch ex As Exception
      81. MsgBox(ex.Message)
      82. End Try
      83. End Sub
      84. End Class


      die Form könnte wie im Anhang aussehen
      die Rechnung muss zB folgend aussehen:

      Quellcode

      1. 1 + 2 + 3 + 4 * (5 + 6)

      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
      Bilder
      • calc.jpg

        10,12 kB, 474×110, 352 mal angesehen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „progglord“ ()

      Bei mir funzt das Programm nicht! Es kommt bei jeder Rechnung 0 heraus, gibt man nur eine Zahl ein, stimmt es aber. Als Meldung kommt:Eine Ausnahme (erste Chance) des Typs "System.FormatException" ist in mscorlib.dll aufgetreten."
      [/i]Hat da jemand 'ne Erklärung???

      Rot ist für Mods! MfG gs93

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gs93“ ()

      Ich habe einen Taschenrechner in VBScript programmiert. Einfach in eine Textdatei mit der Endung ".vbs" einfügen.

      Quellcode

      1. t=1
      2. y="((5+2.546)*9-6.5)/7^2"
      3. do until t=0
      4. x = inputbox("Geben Sie eine Rechenaufgabe ein."&VbCr&"Bitte benutze für Kommazahlen einen Punkt, kein Komma.", "Taschenrechner by Jannes Höke", ""&y&"")
      5. If x = cancel then
      6. exit do
      7. end if
      8. y = x
      9. x = eval(x)
      10. if x > 99999999 Then
      11. msgbox "Das Ergebnis ist zu groß.", vbcritical + vbOKOnly, "Fehler"
      12. exit do
      13. end if
      14. z = inputbox("Das Ergebnis von "&y&" steht unten im Feld.", "Ergebnis", ""&x&"")
      15. if z= cancel then
      16. exit do
      17. end if
      18. loop

      Borg schrieb:

      Ich habe einen Taschenrechner in VBScript programmiert. Einfach in eine Textdatei mit der Endung ".vbs" einfügen.

      Quellcode

      1. t=1
      2. y="((5+2.546)*9-6.5)/7^2"
      3. do until t=0
      4. x = inputbox("Geben Sie eine Rechenaufgabe ein."&VbCr&"Bitte benutze für Kommazahlen einen Punkt, kein Komma.", "Taschenrechner by Jannes Höke", ""&y&"")
      5. If x = cancel then
      6. exit do
      7. end if
      8. y = x
      9. x = eval(x)
      10. if x > 99999999 Then
      11. msgbox "Das Ergebnis ist zu groß.", vbcritical + vbOKOnly, "Fehler"
      12. exit do
      13. end if
      14. z = inputbox("Das Ergebnis von "&y&" steht unten im Feld.", "Ergebnis", ""&x&"")
      15. if z= cancel then
      16. exit do
      17. end if
      18. loop
      Was soll an diesem so gut sein?