我正在使用VB6创建一个聊天机器人,并且该聊天机器人的整个基础是,只要用户输入“触发词”(例如“好”,“令人惊讶”等),聊天机器人就会回答“那很棒”。 但是,每当我不写触发字时,只有显示“ Word is in this”的msgbox出现,并且我不知道我在做什么错。我试过弄乱>,<,=符号,但无济于事。任何帮助将不胜感激。
Private Sub conversation()
Dim imput As String 'where user types to chatbot
Dim arrWords As Variant, aWord As Variant
arrWords = Array("good", "great", "bad")
Dim wordFound As Boolean
wordFound = False
For Each aWord In arrWords
If InStr(imput, aWord) = 0 Then
wordFound = True And MsgBox "Word is in this"
ElseIf InStr(imput, aWord) > 0 Then
wordFound = False And MsgBox "Word is not in this"
End If
Next
End Sub
答案 0 :(得分:1)
吉姆·马克的答案是正确的;通过添加(在 for 循环之前),我可以使比较更加可靠:
imput = UCase(imput)
并使测试词数组全部大写。从根本上讲,原始代码仅存在逻辑问题(可能是由于对该语言的误解)。
ElseIf 子句也令人担忧;通常,明智的做法是包含一个明确的 else 子句,以处理所有符合所有先前条件的测试。
答案 1 :(得分:1)
其他答案已经解释了您的逻辑是反向的。
但是,我也不知道您是否正确地复制了代码,但是当我将其复制到VB中时,正如我所期望的那样,我在行中出现MsgBox
的语法错误。我可以通过在MsgBox
参数中加上括号来“解决”这个问题,例如:wordFound = True And MsgBox("Word is in this")
,等等。但这并不是一个好代码,出于我将要解释的原因,我还有其他一些建议。
考虑对代码的以下更改:
Private Sub conversation(theInput As String)
Dim arrWords As String, aWord As String
arrWords = Array("good", "great", "bad")
Dim wordFound As Boolean
wordFound = False
For Each aWord In arrWords
If InStr(theInput, aWord) = 0 Then
wordFound = False
MsgBox """" & aWord & """ is in this"
Else
wordFound = True
MsgBox """" & aWord & """ is not in this"
End If
Next
End Sub
Private Sub SendButton_Click()
conversation(myChatTextBox.Text)
End Sub
好的。这里有几点。
Variant
。这是存储信息的效率最低的方法,因为它必须分配额外的内存以在内部告知变量的类型,并且还必须分配足够的内存以包含可能的最大类型。 (String
变量具有10个字节,字符串中每个字符一个,而Variant
类型分配为字符串,则具有22个字节,字符串中每个字符一个。)imput
更改为theInput
。 input
是VB中的保留字,因此您不能使用它,但是如果您不拼写错误,对其他人来说更容易理解。最好找到一些前缀放在上面。InStr
返回零时,这意味着参数2中的字符串不在参数1中的字符串中。因此,这意味着“单词不在此”,并非如此。 (这是您遇到的麻烦的答案;其余的只是为了改善您的代码。)wordFound = True And MsgBox("Word is in this")
仅出于巧合。如果MsgBox
成功运行且没有参数,则返回值1。 (谁知道?我必须亲自尝试一下。可能是因为可以将其设置为针对不同类型的ms返回许多不同的值),因此您的逻辑是wordFound = True And 1
。 And
是逻辑比较运算符:True And 1
的计算结果为True
,而False And 1
的计算结果为False
。因此,您得到了想要的东西,但是很偶然。将两个代码位放在两条不同的行上。您无需进行逻辑比较。实际上,这样做没有任何意义。 (如果您实际上希望将两行代码放在同一行上,请在它们之间加上一个冒号:wordFound = True : MsgBox "etc"
,但这通常不被认为是一种好习惯,因为该代码的可读性较差。我觉得您认为您正在使用And
来执行此操作,如您所见,它所做的事情就大不相同了。
"good" is in this
。要在字符串中获取文字引号,请使用其中两个:""
。 (您必须将两个引号本身放在引号中,因为它们是用引号引起来的字符串;这就是为什么在开始时有四个,在以后有三个的原因。)ElseIf
,因为如果您的If
条件为假,则您的ElseIf
条件为true。如果您要评估两个以上的可能条件,则只需要ElseIf
。conversation
子例程的基本思想。当用户单击Send
按钮时,会将文本框的内容作为conversation
的参数发送到input
。如果将其设置为局部变量,则必须编写某种代码来获取用户输入。这是完成工作的更干净的方法。话虽如此,您可以像这样进一步简化For Each
循环:
For Each aWord In arrWords
wordFound = InStr(input, aWord) > 0
MsgBox """" & aWord & """ is" & IIf(wordFound, "", " not") & " in this"
Next
说明:
InStr(input, aWord) <> 0
是对还是错。您将其分配给wordFound
。这是一种更简洁的If...Else
方法。 (这个想法的简单示例:x = 1 = 1
将x
设置为True
,而x = 1 = 0
将x
设置为false
。您可以使用括号使其更易于理解:x = (1 = 1)
等)IIf
(“即时”)的形式为IIf(condition, valueIfConditionIsTrue, valueIfConditionIsFalse)
。 wordFound
是布尔值,所以说wordFound
与说wordFound = True
相同,因此您可以省略= True
(也可以说{{1} }与Not wordFound
的含义相同。编辑:如果希望聊天机器人在遇到任何一个单词时回复“很棒”,请将wordFound = False
从Sub更改为Function并返回true或false。像这样:
conversation()
答案 2 :(得分:0)
我没有尝试运行您的代码-甚至看起来都没有运行-但至少跳出了一个错误。
Arrays
...没有按照您认为的做。您是说 int value = 42;
int groups = 5;
int residue = value % groups;
int[] res = new int[groups];
int division = value / groups;
Arrays.fill(res, 0, residue, division +1);
Arrays.fill(res, residue, res.length, division);
System.out.println(Arrays.toString(res));
是正确的,只要单词不在输入If InStr(imput, aWord) = 0 Then
wordFound = True And MsgBox "Word is in this"'
中,而是仅当MsgBox返回非零结果时
您想要的东西是这样的:
wordFound
对于“未找到”条件,平行条件为真。