我的逻辑在这个Vb程序中出了什么问题?

时间:2014-04-16 19:56:42

标签: vb.net visual-studio-2012 numbers

我是视觉基础的新手,我刚开始在学校上课。我被赋予了一个编写应用程序的任务,该应用程序可以判断文本框中的输入是否为素数。

我在Visual Studio中编写了这段代码:

Public Class PrimeNumberApp

    Public Sub CheckButton_Click(sender As Object, e As EventArgs) Handles CheckButton.Click
        Dim x, y As Integer
        x = Val(PrimeTextBox.Text)

        For y = 2 To (x - 1)

            Select Case x
                Case Is = (33), (77), (99)
                    MsgBox("Its not a prime number, try a different number!")
                    Exit Sub
            End Select

            If x Mod y = 0 Then
                MsgBox("Its not a prime number, try a different number!")
                Exit Sub

            Else
                MsgBox("Its a prime number, you're golden!")
                Exit Sub
            End If
        Next

        Select Case x
            Case Is <= 0
                MsgBox("I'm only accepting values above 0. :p")
                Exit Sub
        End Select

    End Sub

我有这个代码片段,在Visual Basic中Mod运算符的帮助下,显示一个消息框,告诉用户输入是否为素数。

如果仔细阅读代码,您会发现我必须单独为33,77和99创建更多或更少的转义语句。

我必须这样做,因为每当我输入这三个数字中的任何一个时,我得到的结果是数字是一个不正确的素数,因为它们除了自己之外都可以被数字整除。如果没有混淆,程序会显示其他素数和非素数以及正确的消息框,只有这三个。

我花了好几个小时试图弄清楚我做错了什么之后才添加以下几行来摆脱vb痛苦,哈哈。

          Select Case x
        Case Is = (33), (77), (99)
            MsgBox("Its not a prime number, try a different number!")
            Exit Sub
    End Select

但如果我真的想在编码方面做得很棒,那么这样做并不健康。所以这是我的问题,当在文本框中输入任何整数时,如何修复此程序以显示正确的消息框。感谢。

2 个答案:

答案 0 :(得分:1)

您的代码似乎根本不起作用。似乎总是说每个数字都是素数。循环遍历每个可能的除数,并在该循环中测试以查看输入是否可被当前除数整除。那部分是有道理的。但问题是,无论测试结果如何,您都会在第一次迭代后立即退出循环。从循环内部密切关注此代码:

If x Mod y = 0 Then
    MsgBox("Its not a prime number, try a different number!")
    Exit Sub
Else
    MsgBox("Its a prime number, you're golden!")
    Exit Sub
End If

如果我们删除所有虚假细节,你可以看出逻辑是有缺陷的:

If MyTest = True Then
    Exit Sub
Else
    Exit Sub
End If

正如您所看到的,无论测试结果如何,它总是会退出循环。因此,循环将永远不会超过第一次迭代。为了使其继续测试每个可能的除数,您需要删除Exit Sub语句并在变量中跟踪结果。例如,像这样:

Dim isPrime As Boolean = True
For y = 2 To x - 1
    If XIsEvenlyDivisibleByY Then
        isPrime = False
        Exit For
    End If
Next
If isPrime Then
    ' ...
Else
    ' ...
End If

请注意,一旦找到第一个可分割的除数,我就得到它Exit For。没有必要进一步搜索,因为一个足以让它不是素数。

对于它的价值,你应该使用Integer.TryParse而不是Val,而你应该使用MessageBox.Show而不是MsgBoxValMsgBox是旧的VB6样式函数。最好使用较新的仅.NET版本。

答案 1 :(得分:1)

这里是一个如何查找素数的例子,例如最多100个,使用2个循环来检查给定范围内的每个数字。在这种情况下,我从2开始,因为你知道2是素数中最小的。

    Dim i As Integer = 2, j As Integer = 2


    For i = 2 To 100

        For j = 2 To (i / j)

            If i Mod j = 0 Then
                Exit For
            End If

        Next

        If (j > (i / j)) Then
            Console.WriteLine("{0} is prime", i)
        End If


    Next