作者s3748679 (冷羽忆尘)
看板Visual_Basic
标题Re: [VB6 ] 请问使用数量庞大的回圈该如何精简
时间Tue Feb 2 18:44:05 2010
初次发帖... 请各位多多指教
※ 引述《comduffer ()》之铭言:
: 是这样的我要做一个回圈里的回圈
: for i1= 1 to x
: for i2= 1 to x
: ................
: for i22 = 1 to x
: 请问有甚麽办法可以把他精简呢
源由:
多重回圈是可以用阵列及配合其他副程序来完成,
但前几天某时候忽然有被雷打到的感觉!
原本是在想着物件导向应用等问题,可是脑海里不知怎麽的忽然飘过这个问题,
然後...
...
...
回圈...多重回圈...很麻烦...
物件可以组合...可以当元件一样装载...
回圈..物件...回圈....物件.....
装在哪?..装在回圈上?......直接..装在回圈上.....?
!?!? 阿对! 这样似乎可行呢!
於是呢,就产生了为原本就存在内建回圈(while)直接加装成多重回圈的想法!
流程:
而for回圈和while回圈只差在一个有针对性而另一个则否,
所以瞜,我们可以针对for回圈功能多出来的部份实作。
单一回圈对比:
For回圈:
Dim i As Long
For i = start_num To end_num
' (程式码...)
Next
while回圈:
Dim i As Long
i = start_num
Do While start_num <= i And i <= end_num
' (程式码...)
i = i + step_num
Loop
物件:
Dim k As for_loop
Set k = New_ForLoop(start_num, end_num, step_num)
k.Loop_Initialization '为物件内的成员变数i做初始赋值
Do While k.IsOutLoop = False
Dim i As Long
i = k.i
'(程式码...)
k.LoopNext
Loop
多重回圈对比:
多重for回圈:
For i1 = start_num To end_num
For i2 = start_num To end_num
........
For i5 = start_num To end_num
'(程式码...)
Next i5
........
Next i2
Next i1
物件:
Dim loop_array() As for_loop
loop_array = build_ForLoop_array(start_num, end_num, 5) '函数自订
Dim k As mult_ForLoop
Set k = New_mult_ForLoop(loop_array)
k.Loop_Initialization
Do While k.IsEnd = False
'i1, i2, ...,i5对应到loop_array(0).i, loop_array(1).i, ...
'(程式码...)
k.LoopNext
Loop
如此一来,就可以神不知鬼不觉的把while回圈加装成了多重回圈!
模组介绍:
Initialization_module:
因为VB6没有像VB.NET有建构函数所以特别增设的模组内容如下:
1. Function
New_ForLoop(star_num As Long, end_num As Long, step As Long)
As for_loop
2. Function
New_mult_ForLoop(loop_array() As for_loop) As mult_ForLoop
物件关系:
mult_ForLoop &
for_loop类别关系如下:
┌──────┐
│mult_ForLoop│ 注解:多重回圈加装器
└──────┘
◇ ┌────┐
└───┤for_loop│ 注解:单层回圈加装器
mult_ForLoop └────┘
使用时 , 需要外加for_loop物件
(组合关系)
2010/2/3 符号修正
细节(程式码 & 部分说明):
以下内容是个别针对for_loop及Mult_ForLoop所设的例子。
for_loop物件: 实作使用物件
模拟 For回圈 1 + 2 + 3 + ... + 100。
Mult_ForLoop物件: 实作使用物件
模拟多重回圈(1与0的重复排列)。
Form1(Form1.frm):
所需控制项: Command1(实作for_loop), Command2(实作Mult_ForLoop), List1。
Option Explicit
Private Sub Command1_Click()
Dim k As for_loop ' for k = 1 to 100 step 1
Set k = New_ForLoop(1, 100, 1)
k.Loop_Initialization
List1.Clear
Dim sum As Long
'=============================================
Do While k.IsOutLoop = False
sum = sum + k.i
List1.AddItem sum
k.LoopNext
Loop
'=============================================
MsgBox "1 + 2 + 3 + ... + 100 = " & sum
End Sub
Private Sub Command2_Click()
Dim N As Integer
N = InputBox("(0&1重复排列)请输入重复排列之N值")
Dim loop_array() As for_loop
ReDim loop_array(N - 1)
Dim i As Integer
For i = 0 To N - 1 'for x = 0 to 1 step 1
Set loop_array(i) = New_ForLoop(0, 1, 1)
Next
Dim k As mult_ForLoop
Set k = New_mult_ForLoop(loop_array)
k.Loop_Initialization
List1.Clear
'============================================
Dim temp_i As Long
Do While k.IsEnd = False
Dim temp_s As String
temp_s = temp_i & "." & vbTab
For i = 0 To N - 1
temp_s = temp_s & loop_array(i).i
Next
List1.AddItem temp_s
temp_i = temp_i + 1
k.LoopNext
Loop
'============================================
MsgBox "共" & List1.ListCount & "个组合"
End Sub
Initialization_module(Initialization_module.bas):
Option Explicit
Function New_ForLoop(star_num As Long, end_num As Long, step As Long) As _
for_loop
Dim k As New for_loop
k.Set_ForLoop star_num, end_num, step
Set New_ForLoop = k
Set k = Nothing
End Function
Function New_mult_ForLoop(loop_array() As for_loop) As mult_ForLoop
Dim k As New mult_ForLoop
k.Set_Mult_For_Loop loop_array
Set New_mult_ForLoop = k
Set k = Nothing
End Function
for_loop(for_loop.cls):
Option Explicit
Dim me_range_left As Long '范围左端值(min)
Dim me_range_right As Long '范围右端值(max)
Dim me_start As Long '回圈开始值
Dim me_step As Long '回圈步进值
Public i As Long '计数(即时记录回圈的实际状况)
Friend Sub Set_ForLoop(start_num As Long, end_num As Long, step As Long)
me_start = start_num
me_range_left = start_num
me_range_right = end_num
me_step = step
End Sub
Public Sub Loop_Initialization()
i = me_start
End Sub
Public Sub LoopNext()
i = i + 1
End Sub
Public Function IsOutLoop() As Boolean
'IsOutLoop=False '(IsOutLoop预设情况下即为False)
If Not (me_range_left <= Me.i And Me.i <= me_range_right) Then
IsOutLoop = True
End If
End Function
mult_ForLoop(mult_ForLoop.cls):
Option Explicit
Dim me_ArrayForLoop() As for_loop
Dim me_Loop_count As Long
Friend Sub Set_Mult_For_Loop(ArrayForLoop() As for_loop)
me_ArrayForLoop = ArrayForLoop
me_Loop_count = UBound(me_ArrayForLoop) + 1
End Sub
Public Sub Loop_Initialization()
Dim i As Long
For i = 0 To me_Loop_count - 1
me_ArrayForLoop(i).Loop_Initialization
Next
End Sub
Public Sub LoopNext()
Dim i As Long
i = me_Loop_count - 1
me_ArrayForLoop(i).LoopNext
Do
If me_ArrayForLoop(i).IsOutLoop Then
i = i - 1
If i = -1 Then
Exit Do
End If
me_ArrayForLoop(i).LoopNext
Else
i = i + 1
If i = me_Loop_count Then
Exit Do
End If
me_ArrayForLoop(i).Loop_Initialization
End If
Loop
End Sub
Public Function IsEnd() As Boolean
IsEnd = me_ArrayForLoop(0).IsOutLoop
End Function
专案载点:
http://w10.loxa.com.tw/s37185622/share/Multiple_for_loop.rar
执行档载点:
http://w10.loxa.com.tw/s37185622/share/for_loop.exe
如有任何错误、疑问,欢迎莅临指导!
可延伸部分:
其实在VB.NET中,step部分也可以用"抽象化物件"代替,
亦或者使用"委派"的方式写,应用可以直接替代掉原本的递回,
无论排列、组合都有相对应的写法。
※ 编辑: s3748679 来自: 218.164.87.209 (02/03 19:26)
※ 编辑: s3748679 来自: 218.164.87.209 (02/03 21:47)
※ 编辑: s3748679 来自: 218.164.87.209 (02/03 21:48)
※ 编辑: s3748679 来自: 218.164.87.209 (02/03 21:52)
※ 编辑: s3748679 来自: 218.164.87.209 (02/03 22:49)