十道任意两位数加减乘除运算,大佬们看看哪里出错了
vb吧
全部回复
仅看楼主
level 8
tbzp666 楼主
Private Sub Command1_Click()
Dim i%, Score%, a
Randomize
a = Array("+", "-", "*", "M")
For i = 1 To 10
Text1.Text = Int(90 * Rnd) + 10
Text2.Text = Int(90 * Rnd) + 10
Text3.Text = InputBox("第" & i & "题结果是:", "请输入结果", 0, 6000, 3000)
Label1.Caption = a(Int(Rnd * 4))
Select Case Label1.Caption
Case "+"
If val(Text3.Text) = Val(Text1.Text) + Val(Text2.Text) Then
Text4.Text = "√"
Score = Score + 10
Label3.Caption = "Your Score is:" & Score
Else
Text4.Text = "×"
End If
Case "-"
If val(Text3.Text) = Val(Text1.Text) - Val(Text2.Text) Then
Text4.Text = "√"
Score = Score + 10
Label3.Caption = "Your Score is:" & Score
Else
Text4.Text = "×"
End If
Case "*"
If val(Text3.Text) = Val(Text1.Text) * Val(Text2.Text) Then
Text4.Text = "√"
Score = Score + 10
Label3.Caption = "Your Score is:" & Score
Else
Text4.Text = "×"
End If
Case "M"
If val(Text3.Text) = Val(Text1.Text) Mod Val(Text2.Text) Then
Text4.Text = "√"
Score = Score + 10
Label3.Caption = "Your Score is:" & Score
Else
Text4.Text = "×"
End If
End Select
Next i
Label3.Caption = "Your Score is:" & Score
End Sub
2022年04月28日 07点04分 1
level 8
tbzp666 楼主
vb怎么向用户询问随机种子的值,其值由用户输入,得到一个固定随机化序列
2022年04月29日 04点04分 4
level 8
tbzp666 楼主
2022年04月30日 06点04分 6
此题有误
2022年10月17日 05点10分
level 15
加减乘余[滑稽]
2022年05月02日 03点05分 9
level 8
tbzp666 楼主
用“/”不好输入(我想要的输入结果为整数)
本程序错误原因是,每次运行时都计算的是下一次的符号,我找不到哪里有问题?
比如:显示的是a+b=?,但实际上是求下一次运算符“×”,
造成每次输入结果后Text4显示为“×”
2022年05月02日 09点05分 10
level 15
嗯,你说了具体的错误表现,我就有耐心看你的代码了[滑稽]
虽然你想计算10道题,但是不应该写10次循环,而应该每答一题判断一次,现在这样写,判断的都不是“下一题”的结果,而是“第10题”的结果
要想控制回答10道题,你应该定义一个计数变量,每答一题这个变量加1,同时这个计数变量和统计分数的变量都应该定义成窗体级别的变量(就算用过程级也应该改用Static来定义静态变量),否则每答完一题之后它们就又清零了;当计数变量达到10时,再显示对应的提示信息(已答完10题,之类的)
2022年05月02日 10点05分 11
对了,还有一件更关键的事,“出题”和“答题”不应该是同一个按钮,不然即使你改成了不用循环,只出一道题,也照样是按照下一题(这回是真的下“一”题了)判断结果,因为它自动给你重新出题了
2022年05月02日 10点05分
上面的说法有不准确的地方,出题和答题可以放在一个按钮当中,但是你把它们的顺序搞反了,应该是先答上一题再出下一题,你搞成了先出下一题再判断答题情况,自然就按照出的下一题来判断了
2022年05月02日 11点05分
level 8
tbzp666 楼主
你说的没有错,程序太长了,分析很不容易,多谢指点。
我准备把运算符等等做成一个过程。谢谢大佬
2022年05月02日 12点05分 12
level 8
tbzp666 楼主
再问大佬怎么得到两条相同的随机化数列[疑问]
像QBSIC一样
如程序:从成品库中的n台产品中抽取m台送检。抽样时可以将这n台产品编号为1~n,然后用下面的程序确定送检产品的号码
Randomize
INPUT n ,m
FOR I=1 To m
PRINT INT(RND*n+1)
Next I
运行结果如下:
Random-number(-32768 to 32767)? (待输入数字)
输入n,m
要求输入相同的n和m值,输出结果一样[疑问]
2022年05月02日 13点05分 13
Rnd函数是可以带参数的,正数(如Rnd(1))产生随机数(与省略参数效果相同),Rnd(0)返回上次产生的随机数,负数(如Rnd(-1))产生一个由该负数确定的固定随机数
2022年05月02日 14点05分
另外,你这个要求好像去掉Randomize就能解决
2022年05月02日 14点05分
level 8
tbzp666 楼主
2023年01月10日 11点01分 14
此为修改后的程序
2023年02月03日 06点02分
level 1
楼主你要实现相同的题目,应该先生成一个随机的题目册,然后再开始答题,而不是像你那样直接随机题目
而且,text控件本身就有用户输入功能,并不需要Inputbox进行输入,text也由于会被修改,并不适合用来展示题目。
我给一个框架,代码并没有写完,只写到生成题目并展示,并且可以记录答案。最后得分、清空结果、打乱顺序没有写。如果有保存题目的需要可以写入txt文档进行保存读取。
Dim Str As String '记录数据,每次text1被修改时,检查输入的是否是数字,如果不是数字,则改回之前的数字
Dim QuestionA() As Integer '记录第一个数字
Dim QuestionB() As Integer '记录第二个数字
Dim QuestionC() As Byte '记录符号,1-5分别对应加减乘除余
Dim Result() As String '记录结果
Dim QuestionNum As Integer '记录题目数量
'生成题目
Private Sub Command2_Click()
Dim InputStr As String
'确保输入的数字为正整数,且不超过1000
Do
InputStr = InputBox("请输入需要生成的题目数量:" & Chr(10) & "(请输入正整数,最多生成1000题)", "计算", "100")
Loop Until (IsNumeric(InputStr) And (Not InputStr Like "*.*") And Val(InputStr) > 0 And Val(InputStr) <= 1000) Or InputStr = ""
If InputStr = "" Then Exit Sub
List1.Clear
QuestionNum = Val(InputStr) '记录题目数量
'重新定义数组范围,由于代码序号是从0开始,所以减少一个
ReDim QuestionA(QuestionNum - 1) As Integer
ReDim QuestionB(QuestionNum - 1) As Integer
ReDim QuestionC(QuestionNum - 1) As Byte
ReDim Result(QuestionNum - 1) As String
Dim Box As Integer '用于交换数字时,临时存储
For i = 0 To QuestionNum - 1
Result(QuestionNum - 1) = "" '清空答案,题目则必定随机一次,没必要清空
Randomize '初始化随机数列
QuestionC(i) = Int(Rnd() * 5) + 1
If QuestionC(i) = 4 Then '除法单独设置以保证结果为整数
'先随机除数,防止出现结果为一的送分题,除数应小于50
QuestionB(i) = Int(Rnd() * 40) + 10 '如果不是题目要求,个人建议除数应该可以取一位数
'随机一个不为1的正整数商,并满足被除数为两位数,将商乘以除数得出被除数
QuestionA(i) = QuestionB(i) * (Int(Rnd * Int(100 / QuestionB(i) - 1)) + 2)
Else
QuestionA(i) = Int(Rnd() * 90)
QuestionB(i) = Int(Rnd() * 90)
If QuestionC(i) = 5 Then '求余时,防止被除数小于或等于除数时给出送分题
Do Until QuestionA(i) <> QuestionB(i) '确保不相等
QuestionB(i) = Int(Rnd() * 90)
Loop
If QuestionA(i) < QuestionB(i) Then '交换两个数字
Box = QuestionA(i)
QuestionA(i) = QuestionB(i)
QuestionB(i) = Box
End If
End If
End If
List1.AddItem QuestionA(i) & " " & 获取符号(QuestionC(i)) & " " & QuestionB(i) & " = "
Next
End Sub
Private Sub List1_Click()
'显示题目和玩家输入的答案
Dim Spl As Variant
Spl = Split(List1.List(List1.ListIndex), "=") '以等号分割,等号前为题目,等号后为答案
Label1 = Spl(0) & "="
Str = Mid(Spl(1), 2) '分割后,答案前有一个空格,去除这个空格
Text1 = Str
End Sub
'防止文本框输入非数字内容
Private Sub Text1_Change()
If List1.ListIndex = -1 Then Text1 = "": Exit Sub '如果没有选择题目,则不计算
'由于结果没有小数点,小数点不用单独检测
'检测文本框在输入后,内容是否为数字或者为空或者为负号
If Not (IsNumeric(Text1) Or Text1 = "" Or Text1 = "-") Then
Text1 = Str '如果输入后文本框内不是数字,则改回之前记录的文本
Else
Str = Text1 '如果输入后文本框内是数字,则记录文本框内容
Result(List1.ListIndex) = Text1 '记录答案
List1.List(List1.ListIndex) = QuestionA(List1.ListIndex) & " " & 获取符号(QuestionC(List1.ListIndex)) & " " & QuestionB(List1.ListIndex) & " = " & Result(List1.ListIndex)
End If
End Sub
'为了防止看不懂,这个公式我用中文
Function 获取符号(Operator As Byte) As String
Select Case Operator
Case 1: 获取符号 = "+"
Case 2: 获取符号 = "-"
Case 3: 获取符号 = "*"
Case 4: 获取符号 = "/"
Case 5: 获取符号 = "M"
End Select
End Function
2023年01月11日 08点01分 16
层主的编程习惯很好,看起来很专业。
2023年01月12日 04点01分
@klimaa 我不是专业的哦。 我大学vb只教了皮毛,完全是根据兴趣爱好自学。习惯好也是单纯的在之前习惯不好的时候挖过太多坑。以前一些程序写到一半自己都看不懂之前的代码导致重写。被自己坑多了习惯就好了。 这个代码因为是给别人看的,一般我自己写代码是不会弄那么多注释的,自己能看懂就行
2023年01月12日 06点01分
level 8
tbzp666 楼主
@嘟嘟逸凡
这是我以前完成的一个题目,刚开始做有一个错误,后来在初音大大的帮助下修改了错误,只不过没有上传已经完成的程序。
近来遇到一个相似的问题卡壳了,又把本楼完成的题目重新上传了一次,与错误做一下比较,看看错误在哪里?
https://tieba.baidu.com/p/8169737384?pid=146264117469&cid=0#146264117469
上述发的帖子能看一下么,我卡在分数不能赋值,与此题类似
2023年01月11日 11点01分 18
简单看了一下你14楼的代码,你score的声明放在了过程里,自然每次都是从0开始加,不知道你说的分数不能赋值是不是这个意思。 前两天另外一个贴子“有没有大佬知道,为什么连续点击按钮,只能执行一次”,也是这个原因。
2023年01月12日 05点01分
@klimaa score我放置在窗体的顶层里,作用范围应该是本窗体模块中,不是放置在过程中
2023年01月14日 11点01分
@tbzp666 看看你14楼的代码
2023年01月17日 01点01分
level 1
抱歉,帖子太长我没找到你现在遇到的问题。
如果是要洗牌代码的话,可以像我16楼的代码一样,用open读取单词后,将单词和名字分别放在一个数组Question()和Result()内,假设一次有X个题目,然后用以下代码:
‘生成一个新的数组Order(),这个数组长度为X,内容为0~(X-1)的整数(因为VB数组起始为0而不是1),然后打乱这个数组。
Dim Order() As Integer
'生成题目顺序
Sub SetOrder(ByVal X As Integer)
'定义顺序数组的长度
ReDim Order(0 To X - 1) As Integer
'将1-x按顺序填入数组
For i = 0 To X - 1
Order(i) = i '如果你的题目的编号是从1开始的,那这一行应改为Order(i) = i-1
Next
Randomize
'洗牌代码,打乱order()
'这里洗牌的逻辑为随机抽出一张牌,与当前的牌交换位置
'洗牌逻辑可能不是最好的,但对这种简单程序的运行速度影响微乎其微,理解简单
Dim a As Integer '临时存储数据
Dim TheRnd As Integer '储存随机数
For i = 0 To X - 1 '循环每一张牌
TheRnd = Int(Rnd * (X - 1)) '随机抽一张牌,即使抽中自己也无所谓
'将抽中的牌与当前牌交换位置
a = Order(TheRnd)
Order(TheRnd) = Order(i)
Order(i) = a
Next
End Sub
生成后,你第Y道的题目就是Question(Order(Y)),答案就是Result(Order(Y)),然后随机1-4(ABCD),对应的选项内就填入答案,其他的三个选项内随机取三个随机数,从你单词本其余的单词中抽取三个错误答案。(记得写一个随机数防重复的代码)
2023年01月12日 07点01分 19
TheRnd = Int(Rnd * (X - 1)) 好像应该是TheRnd = Int(Rnd * X),因为你的牌是放到前面的。
2023年01月12日 09点01分
@klimaa 代码和我有一个能跑就行[你懂的]
2023年01月12日 11点01分
@klimaa 应该用你那一个,我的代码变成了最后一位永远不是最大数,其他都是完全随机
2023年01月12日 11点01分
level 1
当然,你也可以在出题时就在txt里写出错误选项,至于打乱,洗牌代码看懂了依葫芦画瓢做一个就行,如果你需要做成像我之前写的,用List展示题目,并且可以来回切换,还需要定义几个全局变量用来储存选项打乱顺序、正确选项位置
2023年01月12日 07点01分 20
level 8
tbzp666 楼主
你看一下我的代码,我本想完成之后发到贴子里,但总是出问题
框架基本处理好,但是判断得分不正确
选择题类型,有A、B、C、D四个选项,正确选择只有一个
2023年01月12日 12点01分 21
1 2 尾页