2017-11-01 3 views
0

Kennt jemand die Bacon-Nummer? Wenn nicht, schau es dir an. Jetzt ist jemand mit der Vorstellung vertraut, dass, wenn Sie eine Zahl buchstabieren, ihr Wert 4 ist. Zum Beispiel ist 3 "drei". "Drei" hat 5 Buchstaben. "Fünf" hat 4. Jede Zahl führt zu vier. Ich mache ein Programm, das aufzeigt, wie viele Schritte nötig sind, um zu vier zu kommen. Mir geht es momentan ziemlich gut, aber ich kann das Programm wieder laufen lassen, ohne dass es erstarrt, was letztendlich signalisiert, dass es sich in einer Endlosschleife befindet. Dies ist der Code.Visual Basic Loop Problem

Public Class Form1 
Dim intInput, intNumber, intCounter, intFinalCount As Integer 
Dim strWord As String 
Function count() 
    For Each singleChar In strWord 
     intCounter += 1 
    Next 
    Select Case intCounter 
     Case 1 
      strWord = "one" 
     Case 2 
      strWord = "two" 
     Case 3 
      strWord = "three" 
     Case 4 
      strWord = "four" 
     Case 5 
      strWord = "five" 
     Case 6 
      strWord = "six" 
    End Select 
End Function 
Function count2() 
    Select Case intCounter 
     Case 1 
      strWord = "one" 
     Case 2 
      strWord = "two" 
     Case 3 
      strWord = "three" 
     Case 4 
      strWord = "four" 
     Case 5 
      strWord = "five" 
     Case 6 
      strWord = "six" 
    End Select 
End Function 
Private Sub btnPomeranz_Click(sender As Object, e As EventArgs) Handles btnPomeranz.Click 
    intInput = 0 
    intNumber = 0 
    intFinalCount = 0 
    strWord = "" 
    intCounter = 0 
    If txtKershaw.Text <> "" Then 
     intInput = txtKershaw.Text 
    Else 
     Close() 
    End If 
    intNumber = intInput 

    count2() 
    count() 


    Do While intCounter <> 4 
     If intCounter <> 4 Then 
      count() 
      intFinalCount += 1 
     End If 
    Loop 

    lblKluber.Text = intFinalCount 

End Sub 
End Class 
+2

Warum Tagging Sie diesen vb Code C# –

+3

was diese Wand von hässlichen – BugFinder

+1

Programme einfrieren, da Sie den UI-Thread mit unnötigen Aufgaben binden – BugFinder

Antwort

2

Es sucht den Unterschied in Ihrem Code und meinen Code und Blick auf diese how to exit an app safely

Sie hier 0.

Function count() 
     intCounter = 0 
     For Each singleChar In strWord 
      intCounter += 1 
     Next 

es zurücksetzen Ihre Zählung müssen lernen lesen sollten intNumber anstelle von intCounter

Function count2() 
    Select Case intCounter 
     Case 1 

T er wird nur das Formular schließen und deine App im Hintergrund lassen. verwenden End statt

If txtKershaw.Text <> "" Then 
     intInput = txtKershaw.Text 
    Else 
     Application.Exit ' this is the correct way of closing your app. End() makes a hard exit and close() will never close your app until the thread is close 
end if 

Arbeits Code

Public Class Form1 
    Dim intInput, intNumber, intCounter, intBacon As Integer 
    Dim strWord As String 

    Private Sub btnPomeranz_Click_1(sender As Object, e As EventArgs) Handles btnPomeranz.Click 
     intInput = 0 
     intNumber = 0 
     intBacon = 0 
     strWord = "" 
     intCounter = 0 
     If txtKershaw.Text <> "" Then 
      intInput = txtKershaw.Text 
     Else 
      End 
     End If 
     intNumber = intInput 
     count2() 
     count() 


     Do While intCounter <> 4 
      If intCounter <> 4 Then 
       count() 
       intBacon += 1 
      End If 
     Loop 

     lblKluber.Text = intBacon 
    End Sub 

    Function count() 
     intCounter = 0 
     For Each singleChar In strWord 
      intCounter += 1 
     Next 
     Select Case intCounter 
      Case 1 
       strWord = "one" 
      Case 2 
       strWord = "two" 
      Case 3 
       strWord = "three" 
      Case 4 
       strWord = "four" 
      Case 5 
       strWord = "five" 
      Case 6 
       strWord = "six" 
     End Select 
    End Function 
    Function count2() 
     Select Case intNumber 
      Case 1 
       strWord = "one" 
      Case 2 
       strWord = "two" 
      Case 3 
       strWord = "three" 
      Case 4 
       strWord = "four" 
      Case 5 
       strWord = "five" 
      Case 6 
       strWord = "six" 
     End Select 
    End Function 
End Class 
+2

Willkommen bei Stack Overflow! Eine gute Antwort sollte ** das Problem erklären, erklären und auf die Änderungen am Code hinweisen und warum diese Änderungen vorgenommen wurden. Ohne diese wesentlichen Informationen erfährt das OP nichts und wird wahrscheinlich nicht verstehen, was das Problem verursacht hat. Bitte lesen Sie [Antwort] (https://stackoverflow.com/help/how-to-answer), und da Sie neu hier sind, nehmen Sie auch die [Tour] (https://stackoverflow.com/tour). –

+0

Gutes Update! Ich würde jedoch davon abraten, "End" zu verwenden, da dies die Ausführung sofort beendet. 'Close()' lässt die Anwendung normalerweise nicht offen, es sei denn, etwas anderes hält sie am Leben (ein Vordergrund-Thread zum Beispiel). Das Schließen der Anwendung beim Schließen des letzten Formulars ist am besten, da alle angefügten Closing-Ereignisse ausgeführt und Bereinigungen durchgeführt werden. - Abgesehen davon, gute Arbeit! :) –

1

Ihr Problem liegt in der Tatsache, dass nach dem Anfangswert Zuordnung von intCounter:

intCounter = 0 

intCounter ist nirgendwo anders gesetzt zu werden und immer als 0 bleiben, daher

Do While intCounter <> 4 
    If intCounter <> 4 Then 
     count() 
     intBacon += 1 
    End If 
Loop 

Schleife wird auf unbestimmte Zeit

Der einzige Ort, es fertig könnte, ist hier

For Each singleChar In strWord 
    intCounter += 1 
Next 

aber strWord wird nie nach seiner anfänglichen Zuweisung von "" gesetzt entweder so wird intCounter += 1 nie

Als Seite ausführen, Sie sollten nur eine count() - Funktion haben und Parameter an sie übergeben, damit das Ergebnis zurückgegeben wird.

Es gibt ziemlich viele andere Probleme mit diesem Code, aber das ist nicht in den Anwendungsbereich der Frage

2

Sie Ihren Code vereinfachen und den Fehler wie folgt beseitigen:

Public Class Form1 
    Private numbers As New List(Of String) From {"Zero", "One", "Two", "Three", "Four", _ 
     "Five", "Six", "Seven", "Eight", "Nine", "Ten"} 

    Private Sub btnPomeranz_Click(sender As Object, e As EventArgs) _ 
     Handles btnPomeranz.Click 
     Dim number, bacon As Integer 

     If Not Integer.TryParse(txtKershaw.Text, number) Then 
      MessageBox.Show(txtKershaw.Text & " is not an integer") 
      Exit Sub 
     End If 

     Do 
      number = Count(number) 
      If number = 0 Then 
       MessageBox.Show("The number " & txtKershaw.Text & " was not recognised") 
       Exit sub 
      End If 

      bacon += 1 
      If bacon > 100 Then 
       MessageBox.Show("More than 100 steps required") 
       Exit Sub 
      End If 
     Loop Until number = 4 
     lblKluber.Text = bacon.ToString 
    End Sub 

    Private Function Count(number As Integer) As Integer 
     If number < 0 Or number >= numbers.Count Then Return 0 
     Return numbers(number).Length 
    End Function 
End Class 

Beachten Sie, dass dieser Code verwendet Funktionen wie sie vorgesehen sind, übergeben Sie ihnen Argumente als Argumente, und die Funktion gibt die Ausgabe mit der Return-Anweisung zurück. Die Count Funktion

  • Nimmt die aktuelle Nummer als Argument.
  • Gibt 0 zurück, wenn die Nummer ungültig ist (nicht zwischen 0 und 10).
  • Andernfalls wird die Länge des Wortes zurückgegeben, das die Zahl darstellt.

Wir verwenden eine List(Of String), um die Namen der gültigen Nummern zu halten. Das macht es einfach zu überprüfen, ob eine Zahl in der Reichweite ist, es muss> = 0 und < die Länge der Liste sein (beachten Sie, dass Listenelemente von 0 beginnend nummeriert sind). Es macht es auch einfach, den Namen einer Nummer nachzuschlagen (name = numbers(number)).

Der Button-Click-Handler muss nur überprüfen, dass die Eingabe TextBox eine Ganzzahl enthält (Integer.TryParse tut dies ebenso wie die Umwandlung des Textes in eine Zahl). Dann ruft es Count in einer Schleife auf, bis die Antwort 4 gefunden wird. Bei Problemen mit dem Code wird die Schleife nach 100 Versuchen beendet (um eine Endlosschleife zu vermeiden).