Taschenrechner programmieren

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Machiavelli.

    Taschenrechner programmieren

    Guten Abend!

    Wie Ihr wohl schon gesehen habt, arbeite ich zurzeit an einem Taschenrechner. Da die Lösungsformel jetzt funktioniert, arbeite ich am Grundteil des ganzen Dings. Mein Taschenrechner funktioniert sowiet, jedoch ist die Taktik , die ich benutze, wohl nicht die beste und würde gerne Ideen sammeln, wie ich das besser angehen könnte.

    Bisher hatte ich diese Strategie:



    • Wenn ein Button mit einer Zahl geklickt wird, füge dem Textfeld die entsprechende Zahl zu
    • Wenn ein Rechenoperator benutzt wird, speichere den Inhalt des Textfeldes als double in einer Variable namens x, danach leere das Textfeld, speichere den Operator in einer Variablen RA ab (String)
    • Wenn = Button benutzt wird, frägt es ab welcher Operator benutzt wurde und berechnet dann das Ergebnis aus x (RA) Convert.ToDouble(textfeld.text)

    Code der Hauptdatei, das Modul ist unwichtig, da in dieser nur die Lösungsformel Funktion steckt:


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim x, y As Double
    3. Public RA As String
    4. Private Sub cmdRechnen_Click(sender As Object, e As EventArgs) Handles cmdRechnen.ClickDim a, b, c As Double
    5. Dim Ergebnis As String
    6. a = Convert.ToDouble(txtA.Text)
    7. b = Convert.ToDouble(txtB.Text)c = Convert.ToDouble(txtC.Text)
    8. Ergebnis = Lösungsformel(a, b, c)
    9. lblErgebnis.Text = ErgebnisEnd Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. txtAnzeige.Text &= "1"
    12. End Sub
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClicktxtAnzeige.Text &= "2"
    14. End Sub
    15. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    16. txtAnzeige.Text &= "3"
    17. End Sub
    18. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.ClicktxtAnzeige.Text &= "4"
    19. End Sub
    20. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    21. txtAnzeige.Text &= "5"
    22. End Sub
    23. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClicktxtAnzeige.Text &= "6"
    24. End Sub
    25. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    26. txtAnzeige.Text &= "7"
    27. End Sub
    28. Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.ClicktxtAnzeige.Text &= "8"
    29. End Sub
    30. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    31. txtAnzeige.Text &= "9"
    32. End Sub
    33. Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.ClicktxtAnzeige.Text &= "0"
    34. End Sub
    35. Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    36. txtAnzeige.Text &= ","
    37. End Sub
    38. Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.ClickTry
    39. txtAnzeige.Text = txtAnzeige.Text.Substring(0, txtAnzeige.Text.Length - 1)
    40. Catch ex As Exception
    41. txtAnzeige.Text = ""
    42. End Try
    43. End Sub
    44. Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Clickx = Convert.ToDouble(txtAnzeige.Text)
    45. txtAnzeige.Text = ""
    46. RA = "PLUS"
    47. End Sub
    48. Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Clickx = Convert.ToDouble(txtAnzeige.Text)
    49. txtAnzeige.Text = ""
    50. RA = "Minus"
    51. End Sub
    52. Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Clickx = Convert.ToDouble(txtAnzeige.Text)
    53. txtAnzeige.Text = ""
    54. RA = "Geteilt"
    55. End Sub
    56. Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Clickx = Convert.ToDouble(txtAnzeige.Text)
    57. txtAnzeige.Text = ""
    58. RA = "Mal"
    59. End Sub
    60. Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.ClickSelect Case RA
    61. Case "PLUS"
    62. txtAnzeige.Text = x + Convert.ToDouble(txtAnzeige.Text)Case "Minus"
    63. txtAnzeige.Text = x - Convert.ToDouble(txtAnzeige.Text)
    64. Case "Geteilt"
    65. txtAnzeige.Text = x / Convert.ToDouble(txtAnzeige.Text)Case "Mal"
    66. txtAnzeige.Text = x * Convert.ToDouble(txtAnzeige.Text)
    67. End Select
    68. End Sub
    69. End Class

    Idealerweise machst du über die Tasten die Eingabe, diese sollte dann einen schönen Formelstring ergeben. Diesen kannst du dann mit einem Formelparser direkt parsen, das macht es übersichtlicher und du lernst auch noch schön was dazu :).
    @Machiavelli:: Ruf in Deinen Tasten-Eventhandlern eine Prozedur auf mit entsprechenden Parametern.
    Wenn Du was änderst, hast Du für jede Art von Prozedur genau eine Anlaufstelle.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was ich Dir sagen kann: Ohne OPTION STRICT ON kannst Du eigentlich gleich wieder aufhören.
    Das bedeutet, der Compiler informiert mich, wenn z.B. eine zu große Zahl eingegeben wurde (bei Konventierung von String zu Double)?

    z.B.

    nehmen wir an es gibt eine Zahl x mit dem Wert 129389018 (String). Wir wollen diese nach Double konvertieren, jedoch entspricht es nicht seinem Wertebereich. Und mit OPTION STRICT ON wird erreicht, dass zu große Zahlen als Fehlermeldung angzeigt werden?

    Oder informiert es Dich nur, wenn Datenkonventierungen benutzt werden?
    Idealerweise machst du über die Tasten die Eingabe, diese sollte dann einen schönen Formelstring ergeben. Diesen kannst du dann mit einem Formelparser direkt parsen, das macht es übersichtlicher und du lernst auch noch schön was dazu :).
    Du meinst Eingabe über die Tastatur und den Inhalt der Textbox dann parsen? Wäre interessant.

    @Machiavelli:: Ruf in Deinen Tasten-Eventhandlern eine Prozedur auf mit entsprechenden Parametern.
    Wenn Du was änderst, hast Du für jede Art von Prozedur genau eine Anlaufstelle.

    Verstehe nicht, was Du meinst.



    PS: Kann es sein, dass der Editor (Forumeditor) etwas spinnt?! 8|
    Danke.

    Ich denke ich habe eine Möglichkeit gefunden, wie ich den Code kürzer machen kann. Am Schluss speichere ich die Zahl nicht in der Variable x sondern in einer String Variable , um sie später zu parsen. Danke bis hierhin. Ich werde mir weiteres dann ansehen.

    Machiavelli schrieb:

    Verstehe nicht, was Du meinst.
    Statt

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. txtAnzeige.Text &= "1"
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. txtAnzeige.Text &= "2"
    6. End Sub
    7. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    8. txtAnzeige.Text &= "3"
    9. End Sub
    10. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    11. txtAnzeige.Text &= "4"
    12. End Sub
    13. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    14. txtAnzeige.Text &= "5"
    15. End Sub
    16. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    17. txtAnzeige.Text &= "6"
    18. End Sub
    19. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    20. txtAnzeige.Text &= "7"
    21. End Sub
    22. Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    23. txtAnzeige.Text &= "8"
    24. End Sub
    25. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    26. txtAnzeige.Text &= "9"
    27. End Sub
    mach es so

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. AddNumber("1")
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. AddNumber("2")
    6. End Sub
    7. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    8. AddNumber("3")
    9. End Sub
    10. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    11. AddNumber("4")
    12. End Sub
    13. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    14. AddNumber("5")
    15. End Sub
    16. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    17. AddNumber("6")
    18. End Sub
    19. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    20. AddNumber("7")
    21. End Sub
    22. Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    23. AddNumber("8")
    24. End Sub
    25. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    26. AddNumber("9")
    27. End Sub
    28. Private Sub AddNumber(number As String)
    29. txtAnzeige.Text &= number
    30. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Achso, habe ich übersehen.

    Jetzt habe ich einen String xy mit dem Wert "(3*5-4)*8/9". Gibt es da eine spezielle Vorgehenweise beim Parsen?

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

    Klar, du trennst den String erstmal in Tokens auf (einfach mal googeln), ein mögliches Ergebnis könnte so aussehen: '(' '3' '*' '5' '-' '4' ')' '*' '8' '/' '9'. Diese Tokens musst du dann halt noch nach Priorität ordnen und dann abarbeiten.
    Kannst auch so machen (Der Teil von RodFromGermany):

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. For nmb = 1 To 9
    3. AddHandler Me.Controls("Button" & nmb).Click, AddressOf clicking
    4. Next
    5. End Sub
    6. Private Sub clicking(sender As Object, e As EventArgs)
    7. For i = 1 To 9
    8. Select Case True
    9. Case sender Is Me.Controls("Button" & i)
    10. AddNumber(i.ToString)
    11. End Select
    12. Next
    13. End Sub
    14. Private Sub AddNumber(number As String)
    15. txtanzeige.text &= number
    16. End Sub
    Hi
    da Controls grundsätzlich Benennungen haben: Nope. Wenn dann über ein Array oder dergleichen, aber der Rest ist mMn. grober Unfug.

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    2. For Each ctrl As Control In {_digitButton0, _digitButton1, ..., _digitButton9}
    3. AddHandler ctrl.Click, Sub(s, e) HandleNumber(i)
    4. i += 1
    5. Next

    VB.NET-Quellcode

    1. Private Sub HandleNumber(value As Integer)
    2. 'Mach was
    3. _inputTextBox.SelectedText = value.ToString()
    4. End Sub


    Gruß
    ~blaze~
    Habe das Thema ausversehen als Erledigt gekennzeichnet. Ich habe jetzt eine andere Lösung gefunden, wie man der Textbox einen Operator/Nummer hinzufügt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button9.Click, Button8.Click, Button7.Click, Button6.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button19.Click, Button18.Click, Button16.Click, Button15.Click, Button14.Click, Button13.Click, Button11.Click, Button10.Click
    2. txtAnzeige.Text &= sender.Text
    3. End Sub



    Ich melde mich später nochmal.
    Sender ist ein Object und hat keine Property Text.
    Caste Sender zunächst zu einem Button:

    VB.NET-Quellcode

    1. Dim btn As Button = DirectCast(sender, Button)
    2. If btn IsNot Nothing Then
    3. txtAnzeige.Text &= btn.Text
    4. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!