我的大问题你的小问题,请教一下
vb吧
全部回复
仅看楼主
level 4
dylanhb 楼主
请教一下,在一组数中,从第一个数开始,依次用5个数相加,如果和值在一定范围内,就把满足和值条件的这5个元素从小到大显示在List中。YC
2023年01月23日 03点01分 1
吧务
level 14
啥意思,我没理解
2023年01月23日 05点01分 2
level 1
你的意思是不是这个:
有一个数组,随机抽五个数,之和满足一个范围时,输出这五个数。要输出所有满足单位的五个数的情况。
2023年01月23日 05点01分 3
如果是,你得告诉我你的数组用的变量名称是什么
2023年01月23日 05点01分
应该不是随机5个数,而是连续5个数
2023年01月23日 06点01分
还有数组的变量类型与数组编号最小值是0还是1
2023年01月23日 06点01分
@初音✨七奈 我看着是要列出所有情况,那本质上这个题目就是五个数的所有排列组合
2023年01月23日 06点01分
level 1
Dim a()'记录数组
Dim Sum '计算五个数之和,变量类型与数组类型相同
For i = 1 to ubound(a) - 4'如果数组从0开始,1要改成0
For j = i to ubound(a) - 3
For k = j to ubound(a) - 2
For l = k to ubound(a) - 1
For m = l to ubound(a)
Sum = a(i) + a(j) + a(k) + a(l) + a(m)
If …… Then '此处写判断条件
'此处写输出代码
End If
Next
Next
Next
Next
Next
2023年01月23日 06点01分 4
代码是手机打的,可能会出小问题。如果数组本身不是从大到小排列,输出时要排序
2023年01月23日 06点01分
level 4
dylanhb 楼主
我想用记录数组中的只5个数相加,和值定在一个范围内,比如大于50小于120,然后把所有满足条件的5个从小到大显示在list中
Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, a As Integer 'q As Integer
Dim a(5, 6, 7, 8, 9, 13, 16, 18, 25, 26, 29, 30) '记录数组
For i = 1 To UBound(a) - 4
For j = i To UBound(a) - 3
For k = j To UBound(a) - 2
For l = k To UBound(a) - 1
For m = l To UBound(a)
Sum = a(i) + a(j) + a(k) + a(l) + a(m)
If Sum > 50 And Sum < 120 Then
List1.AddItem a(i) & "," & a(j) & "," & a(k) & "," & a(l) & "," & a(m)
End If
Next
Next
Next
Next
Next
2023年01月23日 08点01分 5
level 4
dylanhb 楼主
是不是要用其他的方法和函数
2023年01月23日 08点01分 6
记录数组好像不能这么写吧。Dim a(5, 6, 7, 8, 9, 13, 16, 18, 25, 26, 29, 30) 的意思是定义一个12纬数组。而之前你定义了a as Integer,两个冲突。
2023年01月23日 10点01分
应该改为Dim a(1 to 12) as Integer,a(1)=5,a(2)=6,a(3)=7……
2023年01月23日 10点01分
定义的时候,For语录的ijklm五个变量其实是不用定义的,可以省略。Sum变量反而应该定义,虽然不定义也不会报错。
2023年01月23日 10点01分
代码中的a是数组而不是变量。UBound函数是输出数组的第一维的上限,比如a(4 to 12),UBound(a)就是12。
2023年01月23日 10点01分
level 4
dylanhb 楼主
看图片上是正常运行哒,按钮用sample31后,提示未定义这个变量[疑问]
2023年01月24日 06点01分 10
Vb6.0里,窗口是Form,这里你应该写Form1,指的是窗口"Form1"里的"List1"控件。由于这行代码是写在这个窗口里的,所以也可以直接省略成"List1.List"或者"Me.List1.List"
2023年01月24日 08点01分
他的高版本VBS里,List控件默认名称是ListBox,VB6.0里默认是List,所以"Box也要删掉"
2023年01月24日 08点01分
此外,我记得List控件的添加一行好像是要用Add什么的指令,你用补全找一下,我不会全拼,后面他输出数组直接用的tmp,VB6.0也可能不能直接运行,我没试过
2023年01月24日 09点01分
应该改成tmp(0) & "," & tmp(1) &……的格式
2023年01月24日 09点01分
level 1
大佬代码还能再简化一下,这个题目用不到使用词典工程:
Dim TheArray As Variant '定义待列举数组
Private Sub Command1_Click()
List1.Clear '清楚list1中数据
TheArray = Array(5, 6, 7, 8, 9, 13, 16, 18, 25, 26, 29, 30) '输入待列举数组内容
Call Combinarray(UBound(TheArray), 5) '列举数组,每五个为一组
End Sub
'列举数组的所有组合函数
'将数组TheArray()中的元素,列举其中Num个元素的所有组合,并处理
'TheArray:=要组合的数组(需提前设置全局变量),Pointer:=当前运行至第X个数(运行时反向历遍,故调用函数时应输入数组的上标)
'Num:=随机组合个数(重复运行时,该变量代表还需运行的次数),Result:=结果(用英文逗号隔开)
Sub Combinarray(ByVal Pointer As Long, ByVal Num As Long, Optional ByVal Result As String = "")
If Num = 0 Then Call PrintResult(Mid(Result, 2)): Exit Sub '不需要继续重复运行时,输出列举结果并退出重复运行
'反向历遍元素,依次列举。当Pointer小于零即无剩余元素且未列举出足够的元素时,将直接跳过For循环结束历遍。
'如果声明数组下标的缺省下界为1,此处应改为:For i = Pointer To 1 Step -1
For i = Pointer To 0 Step -1
'还需列举次数为当前运行至的元素编号(i)减一,当前运行指针减一,记录列举结果(由于运行时反向历遍元素,故反向添加加过)
Call Combinarray(i - 1, Num - 1, "," & TheArray(i) & Result)
Next
End Sub
'处理列举出的结果并输出
Sub PrintResult(ByVal Result As String)
Dim Sum As Long '记录结果之和
Dim Spl As Variant '用于分割
Spl = Split(Result, ",") '以逗号分割结果
For i = 0 To UBound(Spl) '累加结果,VB6.0无Evaluate函数,故出此下策
Sum = Sum + Val(Spl(i))
Next
If Sum > 50 And Sum < 120 Then List1.AddItem Result '判断是否满足条件,如果满足则输出结果
End Sub
2023年01月24日 13点01分 11
大佬代码运行不出的其中一个原因应该是VB6.0没有Evaluate函数,这个函数的作用是返回算式文本的计算结果。这里可以用其他办法计算结果之和。词典工程在这个题目中显得有些大材小用,可以用一个过程直接判断结果是否符合条件,然后输出。
2023年01月24日 13点01分
由于这里只要列举五个元素,运行速度方面,应该是直接用For循环速度更快。而大佬的方法更适合处理列举更多的元素。
2023年01月24日 14点01分
level 4
dylanhb 楼主
非常非常感谢,你看上去很欧和嘟嘟逸凡,还有各位提供建议的大佬们,现在程序使用中,祝大家新年快乐!
2023年01月25日 03点01分 12
level 4
dylanhb 楼主
再次感谢~你看上去很欧,贴出更精炼的代码[哈哈]
2023年01月25日 06点01分 15
1 2 尾页