我是视觉基础的新手,我刚开始在学校上课。我被赋予了一个编写应用程序的任务,该应用程序可以判断文本框中的输入是否为素数。
我在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
但如果我真的想在编码方面做得很棒,那么这样做并不健康。所以这是我的问题,当在文本框中输入任何整数时,如何修复此程序以显示正确的消息框。感谢。
答案 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
而不是MsgBox
。 Val
和MsgBox
是旧的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