看板 Visual_Basic 關於我們 聯絡資訊
初次發帖... 請各位多多指教 ※ 引述《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)