Zähler in Rechenübungsprogramm

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Emma-En.

    Zähler in Rechenübungsprogramm

    Hallo zusammen,
    ich schreibe gerade ein kleine Rechenübungsprogramm für unsere Kinder. Soweit funktioniert alles sehr gut. Lediglich die Statistik bekomme ich einfach nicht hin. Der Zähler zählt falsch.
    Bsp. Wenn ich 6 Richtige Antworten habe und dann eine Aufgabe falsch beantworte, steht in den Label für falsche Antworten eine 7.
    Könnt ihr mir bitte helfen?
    Einer meiner Versuche sieht bisher so aus: (in VB 2010)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim RZahl As Integer = 0
    3. Dim FZahl As Integer = 0
    4. Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    5. RZahl += 1
    6. FZahl += 1
    7. Ergebnis = 1000 - Zahl1
    8. If TextBox1.Text = "" Then
    9. MsgBox("Es muss eine Zahl eingegeben werden!")
    10. TextBox1.Focus()
    11. End If
    12. If TextBox1.Text = Ergebnis Then
    13. Label10.Text = RZahl
    14. MsgBox("Richtig, gut gemacht " & CheckBox6.Text & "!")
    15. TextBox1.Clear()
    16. Button1.PerformClick()
    17. End If
    18. If TextBox1.Text <> Ergebnis Then
    19. MsgBox("Schade, leider falsch " & CheckBox6.Text & ". Versuche es erneut.")
    20. Label11.Text = FZahl
    21. TextBox1.Clear()
    22. TextBox1.Focus()
    23. End If
    24. End Sub
    25. End Class

    Vielen Dank :)
    PS, bin absoluter Anfänger :(

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Emma-En“ ()

    @Emma-En Willkommen im Forum. :thumbup:
    Fang an mit Option Strict On, damit Du lernst, die richtigen Datentypen zu verwenden.
    Lies Deinen Code laut vor und sage, warum jede einzelne Zeile da steht, wo sie steht. Da solltest Du sehr schnell erkennen, was schief läuft. ;)
    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!
    Guten Morgen,
    danke erst einmal für die Antworten.

    @Erfinder des Rades
    Ich habe den Code bereits per 'Else If' geschrieben, um aber eventuelle Fehler raus zu finden, habe ich den Code zum Schluss so formuliert.
    Natürlich würde ich es gern besser können und lernen.

    @Micha Ho
    zu 1. Das war ja mein Ziel (dachte ich bis gerade eben).
    zu 2. Meinst du die Dim Zahl As Integer?
    zu 3. Anstatt VB.NET? VB6 stand leider nicht zur Auswahl (ich hoffe wir meinen das gleiche?)

    @RodFromGermany
    Ich werde mal im Internet auf die Suche nach Option Strict On gehen.

    Einen schönen Arbeitstag wünsche ich :)

    Emma-En schrieb:

    Ich werde mal im Internet auf die Suche nach Option Strict On gehen.
    Suche lieber hier im Forum.
    Und:
    Wenn Du einen User ansprechen möchtest:
    @'USER NAME MIT LEERZEICHEN ODER OHNE'
    bzw
    @USER_NAME_OHNE_LEERZEICHEN
    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!
    Hallo zusammen,
    habe das Option Stric On eingefügt und VB hat daraufhin einiges geändert. Da ich aber immer noch Anfänger bin, kann ich nur erahnen was es bedeutet, was VB gemacht hat.

    Jedoch hat das leider mein eigentliches Problem nicht gelöst, bzw. habe ich es noch nicht erkannt.

    Könnte mir jemand bitte einen Lösungsansatz geben?

    Vielen Dank im Vorraus
    Jedes mal, wenn du auf Button2 klickst machst du das hier:
    RZahl += 1
    FZahl += 1
    Und wenn TextBox1.Text <> Ergebnis dann machst du
    Label11.Text = FZahl
    Gebe ich also 3 mal das richtige Ergebnis ein und dann ein Falsches, ist meine Fehlerzahl 4.

    Du musst doch FZahl nur um eins erhöhen, wenn TextBox1.Text <> Ergebnis und nicht jedes mal wenn man auf den Button2 klickt...

    Du könntest einfach mal nen Haltepunkt im Button2 Click Event setzen und dann Schritt für Schritt durch den Code steppen. Dann siehst du nämlich was dieser so macht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Emma-En Dies scheint nicht funktioniert zu haben, ich gehe mal davon aus, dass Du es nicht getan hast:

    RodFromGermany schrieb:

    Lies Deinen Code laut vor und sage, warum jede einzelne Zeile da steht, wo sie steht. Da solltest Du sehr schnell erkennen, was schief läuft.
    ;(
    Was ganz genau bewirken die Zeilen 7 und 8 in Deinem Code?
    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!
    Hallo zusammen,
    habe den Code soweit geändert und hoffe, dass es so "besser" ist. Desweiteren habe ich den Buton1 entfernt und lasse die Eingaben nun über die Enter-Taste bestätigen.
    Wenn es noch weitere Verbesserungen gibt, immer her damit (davon gehe ich aus ;) )

    Visual Basic-Quellcode

    1. Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    2. 'Ergänze bis 1000
    3. Ergebnis = 1000 - Zahl1
    4. If e.KeyData = Keys.Enter And CheckBox1.Checked Then 'Enter drücken um die Eingabe abzuschließen
    5. If TextBox1.Text = "" Then
    6. MsgBox("Es muss eine Zahl eingegeben werden!")
    7. ElseIf CDbl(TextBox1.Text) = Ergebnis And CheckBox6.Checked Then
    8. MsgBox("Richtig, gut gemacht " & CheckBox6.Text & "!")
    9. R1Zahl += 1
    10. Label10.Text = CStr(R1Zahl)
    11. TextBox1.Clear()
    12. Button1.Enabled = True
    13. Button1.PerformClick()
    14. Button1.Enabled = False
    15. ElseIf CDbl(TextBox1.Text) = Ergebnis And CheckBox7.Checked Then
    16. MsgBox("Richtig, gut gemacht " & CheckBox7.Text & "!")
    17. R2Zahl += 1
    18. Label19.Text = CStr(R2Zahl)
    19. TextBox1.Clear()
    20. Button1.Enabled = True
    21. Button1.PerformClick()
    22. Button1.Enabled = False
    23. ElseIf CDbl(TextBox1.Text) <> Ergebnis And CheckBox6.Checked Then
    24. MsgBox("Schade, leider falsch " & CheckBox6.Text & ". Versuche es erneut.")
    25. F1Zahl += 1
    26. Label11.Text = CStr(F1Zahl)
    27. TextBox1.Clear()
    28. TextBox1.Focus()
    29. Button1.Enabled = False
    30. ElseIf CDbl(TextBox1.Text) <> Ergebnis And CheckBox7.Checked Then
    31. MsgBox("Schade, leider falsch " & CheckBox7.Text & ". Versuche es erneut.")
    32. F2Zahl += 1
    33. Label18.Text = CStr(F2Zahl)
    34. TextBox1.Clear()
    35. TextBox1.Focus()
    36. Button1.Enabled = False
    37. End If
    38. End If
    39. End Sub


    Einen schönen Abend :)

    Emma-En schrieb:

    Wenn es noch weitere Verbesserungen gibt, immer her damit
    Davon gibts jede Menge.
    Aber mit "Her damit" ist nichts, sondern du sollst das programmieren - oder zumindest versuchen.
    Ich sag auch nur eins nach dem andern. Danach melden sich noch 5 andere mit verbesserungsvorschlägen, und dann biste eh genügend verwirrt, und mal sehen, ob noch was sinnvolles bei rauskommt.

    Jedenfalls, was ich sagen wollte ist: Ist sehr schlechter Stil, wenn Codezeilen sich wiederholen.
    Am einfachsten zu beheben sind wohl diese 2 Stellen:

    VB.NET-Quellcode

    1. Button1.Enabled = True
    2. Button1.PerformClick()
    3. Button1.Enabled = False
    kommt 2 mal vor

    und

    VB.NET-Quellcode

    1. TextBox1.Clear()
    2. TextBox1.Focus()
    3. Button1.Enabled = False
    ebenfalls.

    Bei 'ner durchdachteren Organisation der Bedingungen lässt sich das so gestalten, dass diese Zeilen je nur einmal auftreten.
    Solch kürzt die Methode merklich, macht sie lesbarer und sicherer gegen unbeabsichtigte "Verschlimmbesserunge", wenn mal was zu verändern ist.
    Probierst Du seit Stunden, EdRs Komprimierungsvorschlag umzusetzen? Ein Ausschnitt:

    VB.NET-Quellcode

    1. ElseIf CDbl(TextBox1.Text) = Ergebnis And CheckBox6.Checked Then
    2. MsgBox("Richtig, gut gemacht " & CheckBox6.Text & "!")
    3. R1Zahl += 1
    4. Label10.Text = CStr(R1Zahl)
    5. TextBox1.Clear()
    6. Button1.Enabled = True
    7. Button1.PerformClick()
    8. Button1.Enabled = False
    9. ElseIf CDbl(TextBox1.Text) = Ergebnis And CheckBox7.Checked Then
    10. MsgBox("Richtig, gut gemacht " & CheckBox7.Text & "!")
    11. R2Zahl += 1
    12. Label19.Text = CStr(R2Zahl)
    13. TextBox1.Clear()
    14. Button1.Enabled = True
    15. Button1.PerformClick()
    16. Button1.Enabled = False

    Welche Bereiche sind gleich, welche unterscheiden sich?
    Absolut gleich sind: Zeilen#5-#8
    Wie bekommt man es nun so hin, dass man die nur 1x schreiben muss? Indem man die Bedingung aufspaltet, damit sie nicht zu spezifisch ist:

    VB.NET-Quellcode

    1. ElseIf CDbl(TextBox1.Text) = Ergebnis Then
    2. 'in dieser Zeile wird der spezifische Teil eingefügt
    3. TextBox1.Clear()
    4. Button1.Enabled = True
    5. Button1.PerformClick()
    6. Button1.Enabled = False

    "Wie jetzt, 'in dieser Zeile wird der spezifische Teil eingefügt'?"
    Durch die Aufspaltung der Bedingung hast Du aus 2 großen ElseIf-Blöcken einen gemacht.
    In diesem Bereich ist auf jeden Fall die Bedingung erfüllt, dass CDbl(TextBox1.Text) = Ergebnis.
    Und der Rest wird durch ein weiteres If-Konstrukt erledigt:
    Gesamtcode für den o.g. Block:

    VB.NET-Quellcode

    1. ElseIf CDbl(TextBox1.Text) = Ergebnis Then
    2. If CheckBox6.Checked Then
    3. R1Zahl += 1
    4. MsgBox("Richtig, gut gemacht " & CheckBox6.Text & "!")
    5. Label10.Text = CStr(R1Zahl)
    6. ElseIf CheckBox7.Checked Then
    7. R2Zahl += 1
    8. MsgBox("Richtig, gut gemacht " & CheckBox7.Text & "!")
    9. Label19.Text = CStr(R2Zahl)
    10. End If
    11. TextBox1.Clear()
    12. Button1.Enabled = True
    13. Button1.PerformClick()
    14. Button1.Enabled = False


    "Und nun habe ich statt 16 Zeilen noch ganze 14 Zeilen. War es das wert?" Ja. Denn es war 1. nur der Anfang. Und 2.: Wenn Du jetzt an dem allgemeinen Teil in Zeile#11-#14 was änderst, dann nur einmal. Das scheint jetzt kein großer Vorteil zu sein, aber der Schein trügt. Das wird so im Verlauf der Entwicklung nochmal ein ganzes Stück einfacher.
    Ich muss zugeben, dass ich in der Versuchung war, noch ganz viel zusätzlich zu schreiben, aber eines nach dem anderen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Emma-En schrieb:

    CDbl(TextBox1.Text)
    kommt bei Dir beliebig oft vor, rechne den Wert ein Mal aus und speichere ihn in einer Variable.
    Sieh Dir an: Double.TryParse(...) msdn.microsoft.com/de-de/libra…e.tryparse(v=vs.110).aspx
    falls da zufällig "Roulade mit Klößen" in der Textbox steht. :thumbsup:
    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!
    Guten Abend,
    habe den Code soweit angepasst.
    Den Textbox Inhalt in einer Variablen speichern, stelle ich mir so ungefähr vor. Bitte schlachtet mich nicht, schreibe gerade vom Handy und werde ie nächsten Zeilen sobald als möglich in den Vb Tag ändern.

    Dim Beispiel as Integer
    Beispiel =Textbox1
    Textbox1 = 1000-Zahl1

    Und dann anstatt CDbl(Textbox1.Text), Beispiel schreiben?

    Bin ich auf dem richtigen Weg oder komplett falsch?

    Ich habe mir das Double.TryParse durch gelesen, verstehe es aber nicht.

    Bitte nehmt es mir nicht übel, bin ein noob :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Emma-En“ ()