我的 IF 语句出了啥问题并且是数字
Posted
技术标签:
【中文标题】我的 IF 语句出了啥问题并且是数字【英文标题】:Whats going wrong with my IF statement and Is Numeric我的 IF 语句出了什么问题并且是数字 【发布时间】:2014-08-30 09:44:34 【问题描述】:以下代码揭示了我的理解中的一个差距。有人可以告诉我它是什么以及如何修复代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NumberToGuess, Answer As Integer
NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
While Answer <> NumberToGuess
Answer = InputBox("Please enter your guess")
If IsNumeric(Answer) = False Then MsgBox("That ain't no number")
If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
End While
MsgBox("Well done you guessed the right number")
End Sub
【问题讨论】:
在这里猜测,因为我的 VB.Net 很古老。在“Answer”有值之前,您正在使用 Answer NumberToGuess。 如果你添加错误信息也许更清楚你在问什么 【参考方案1】:这个问题有很多问题,你的问题对于你说的是哪个问题含糊不清。因此,我将在此处列出所有这些。
-
您将
NumberToGuess
和Answer
都声明为整数,并将InputBox
的结果分配给它。但是InputBox
可以返回任何东西(数字或字母)。一旦您尝试将用户的输入分配给NumberToGuess
,它就会出错。那是在你检查它是否是数字之前。
如果您有OPTION STRICT ON
,它会显示编译错误“Option Strict On 不允许从 'String' 到 'Integer' 的隐式转换”。 保持OPTION STRICT ON
通常是一个好习惯,并且有助于避免看似无辜的错误。例如在这里,您将 String
类型分配给 Integer
variable,这是不允许的。
您已将While
循环与InputBox
一起使用。除非他们给出正确答案,否则用户无法取消游戏。 InputBox 的取消按钮不起作用。
您的所有If
条件都将被评估,而与之前的条件无关。我假设您希望一次只显示一个消息框。所以你可能也想使用ElseIf
。
要解决问题,我们开始吧:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NumberToGuess As String '<-- declare as string because we will hold the result of InputBox in it.
Dim Answer As String = "" '<-- declare as string because we will hold the result of InputBox in it.
NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
While Answer <> NumberToGuess
Answer = InputBox("Please enter your guess")
If String.IsNullOrEmpty(Answer) Then Exit While '<-- if user pressed cancel button in InputBox.
If Not IsNumeric(Answer) Then
MsgBox("That ain't no number")
ElseIf CInt(Answer) > CInt(NumberToGuess) Then
MsgBox("Too high thicko. Try Again")
ElseIf CInt(Answer) < CInt(NumberToGuess) Then
MsgBox("Too Low chump. Try Again")
Else
' neither less nor more. so this is the correct answer.
MsgBox("Well done you guessed the right number")
Exit While
End If
End While
End Sub
然而,上面的代码很烦人,因为MessageBox
,然后是InputBox, then
MessageBox, then
InputBox...
要解决此问题,您可以在 InputBox
本身中显示消息。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NumberToGuess As String '<-- declare as string because we will hold the result of InputBox in it.
Dim Answer As String = "" '<-- replace with whatever answer you are expecting.
Dim Message As String = "Please enter your guess"
NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
While Answer <> NumberToGuess
Answer = InputBox(Message)
If String.IsNullOrEmpty(Answer) Then Exit While '<-- if user pressed cancel button in InputBox.
If Not IsNumeric(Answer) Then
Message = "That ain't no number"
ElseIf CInt(Answer) > CInt(NumberToGuess) Then
Message = "Too high thicko. Try Again"
ElseIf CInt(Answer) < CInt(NumberToGuess) Then
Message = "Too Low chump. Try Again"
Else
' neither less nor more. so this is the correct answer.
MsgBox("Well done you guessed the right number")
Exit While
End If
End While
End Sub
【讨论】:
谢谢你。您的解决方案很优雅,解决了我理解中的所有缺陷。我更喜欢错误信息和输入框的组合,而不是一个接一个【参考方案2】:没什么大不了的 - 你只是错过了一些 else
;)
private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NumberToGuess, Answer As Integer
NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
While Answer <> NumberToGuess
Answer = InputBox("Please enter your guess")
If IsNumeric(Answer) = False Then MsgBox("That ain't no number")
Else
If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
End If
End While
MsgBox("Well done you guessed the right number")
End Sub
问题是,如果您只是这样写,则检查第一个条件 - 如果您不输入数字,则会显示消息并检查您的下一个条件 - 您显然只希望检查那些是否是一个号码。所以把它包装在一个 Else
块中
顺便说一句:我认为Answer
的缺失值不是问题,但我现在无法检查(我的 Linux Distro 上的 MonoDevelop 与 VB.net 存在一些问题 :( - 调试您的代码以了解是否请)
【讨论】:
非常感谢您如此及时的回复。我一直在尝试使用 Else 和 ElseIF 语句,但没有成功。您的清晰解释有助于我理解为什么需要前者。但是,当我进行调整时,VB 显示语法错误。 Else 语句和 End IF 语句用蓝色波浪线加下划线。你知道为什么吗?再次感谢。【参考方案3】:问题是InputBox function的返回值。
它返回一个字符串,您尝试将其分配给一个整数变量。
这会强制 VB 编译器执行从字符串到整数的隐式转换,并且在您键入有效数字之前它可以工作,但是如果您将输入框留空,则隐式转换将失败并引发InvalidCastException
。
如果您使用 Option Strict On 编译代码,这将在构建过程中被捕获。 如果没有它,您的程序会在分配时崩溃。 NumberToGuess的赋值也存在同样的问题
Dim NumberToGuess, Answer As Integer
While True
Dim input = InputBox("Enter a Secret Number Between 1 and 20!")
if IsNumeric(input) Then
NumberToGuess = Convert.ToInt32(input)
Exit While
Else
MsgBox("Not a valid number")
End If
End While
While Answer <> NumberToGuess
Dim result = InputBox("Please enter your guess")
If IsNumeric(result) = False Then
MsgBox("That ain't no number")
Else
Answer = Convert.ToInt32(result)
If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
End If
End While
MsgBox("Well done you guessed the right number")
我还应该补充一点,Mr Carsten Konig 的答案正确地指出了您的逻辑代码流中的错误。
【讨论】:
它无条件打印Well done you guessed the right number
,因为它一直在外面
如果你没有输入正确的数字,它永远不会退出循环。
啊,我明白了。非常感谢史蒂夫。一个简单的程序能教给你这么多东西,真是太神奇了。我真的很感谢你的帮助。与发布如此有用的 cmets 的其他人一样【参考方案4】:
你可以使用:
Dim NumberToGuess, Answer As Integer
NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
While Answer <> NumberToGuess
Answer = InputBox("Please enter your guess")
If IsNumeric(Answer) = False Then
MsgBox("That ain't no number")
Else
Select Case Answer < NumberToGuess
Case True
MsgBox("Too Low chump. Try Again")
Case False
MsgBox("Too high thicko. Try Again")
Case Else
MsgBox("Well done you guessed the right number")
End Select
End If
End While
【讨论】:
以上是关于我的 IF 语句出了啥问题并且是数字的主要内容,如果未能解决你的问题,请参考以下文章