初次發帖... 請各位多多指教
※ 引述《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)