For循環(huán)控制結(jié)構(gòu)
循環(huán)控制結(jié)構(gòu)屬于計數(shù)型循環(huán),,程序按照此種結(jié)構(gòu)中指明的循環(huán)次數(shù)來執(zhí)行循環(huán)體部分,,采用For…Next循環(huán)語句,其語法格式如下:
For <循環(huán)變量> = <初始值> To <終值> [Step 步長]
[循環(huán)體]
[Exit For]
[循環(huán)體]
Next 循環(huán)變量
在此格式中,,使用了這樣幾個參數(shù):
1. 循環(huán)變量,。用于統(tǒng)計循環(huán)次數(shù),該變量為數(shù)值型變量,。
2. 初始值,。用于設(shè)置循環(huán)變量的初始值,該變量為數(shù)值型變量,。
3. 終值,。用于設(shè)置循環(huán)變量的終止值,該變量為數(shù)值型變量,。
4. 步長,。用于決定循環(huán)變量每次的增值,為數(shù)值型變量,。當步長為1時,,可以省略[Step 步長]選項。
5. 循環(huán)體,。重復(fù)執(zhí)行的部分,。
6. Exit For。在某些情況下,,可強制退出For循環(huán),。
7. Next循環(huán)變量。用于結(jié)束一輪For循環(huán)。根據(jù)終止值和當前循環(huán)變量的值的大小關(guān)系決定是否執(zhí)行下一輪循環(huán),。
通常情況下,,For循環(huán)的執(zhí)行過程是先給循環(huán)變量賦初值,然后判斷,。若循環(huán)變量的值沒有超出終值,,則執(zhí)行一輪循環(huán)體,然后將循環(huán)變量加上步長值,,判斷是否可以執(zhí)行下一輪循環(huán),,接著重復(fù)上述過程;否則退出循環(huán),。
若循環(huán)體中存在Exit For語句,,則在執(zhí)行過程中,滿足條件即可強制跳出For循環(huán),。若存在For循環(huán)嵌套,,使用Exit For語句只能跳出最內(nèi)層的循環(huán),繼續(xù)執(zhí)行外層循環(huán),。
當For循環(huán)的循環(huán)體內(nèi)沒有任何具體語句時,,該循環(huán)部分可作為延時工具使用。
【例6.7】編寫程序,,求1~n(正整數(shù))的所有正整數(shù)之和,。
(1) 分析。根據(jù)題意,,n的值由用戶輸入,。要求n個正整數(shù)的和,可看作n次加法操作,,即加法操作被循環(huán)執(zhí)行n次,,其中,n是循環(huán)變量,,控制循環(huán)次數(shù),。
(2) 在窗體的單擊事件上編寫下面的事件過程。
Private Sub Form_Click()
Dim s As Single,i As Integer
n=Val(InputBox("請輸入n","提示"))
s=0
For i =1 To n step 1
s= s + i
Next i
Print "1到"; n; "之和為:"; s
End Sub
(3) 程序功能,。運行程序后,,單擊窗體彈出一個輸入框由用戶輸入n的值,然后在窗體上顯示1到n這n個數(shù)的和,。當輸入100時,,運行結(jié)果如圖6-7所示。
6.2.2 當循環(huán)控制結(jié)構(gòu)
雖然在For…Next結(jié)構(gòu)中增加帶條件的Exit For語句,,可以在循環(huán)次數(shù)不確定只給出循環(huán)結(jié)束條件的情況退出循環(huán)結(jié)構(gòu),但是在這種情況下,,使用當循環(huán)控制結(jié)構(gòu)會更方便,,當循環(huán)控制結(jié)構(gòu)采用While…Wend循環(huán)語句,,其講法格式為:
While 條件
[循環(huán)體]
Wend
說明:
1.“條件”可以是關(guān)系表達式或邏輯表達式。While循環(huán)就是當給定的“條件”為True時,,執(zhí)行循環(huán)體,,為False時不執(zhí)行循環(huán)體。如果開始條件就不成立,,則循環(huán)體一次也不執(zhí)行,。因此While循環(huán)出可直接稱為當型循環(huán)。
2. 循環(huán)結(jié)構(gòu)執(zhí)行過程如下:
(1) 執(zhí)行While語句,,判斷條件是否為真,。
(2) 如果條件為真,就執(zhí)行循環(huán)體,;否則,,轉(zhuǎn)到④執(zhí)行。
(3) 執(zhí)行Wend語句,,轉(zhuǎn)到①執(zhí)行,。
(4) 執(zhí)行Wend語句下面的語句。
(5) While循環(huán)語句本身不能修改循環(huán)條件,,所以必須在While…Wend語句的循環(huán)體內(nèi)設(shè)置相應(yīng)的語句,,使得整個循環(huán)趨于結(jié)束,以避免死循環(huán),。
【例6.8】用While循環(huán)語句計算1~100所有奇數(shù)的和,。
Private Sub Command1_click()
Dim i%, sum&
i = 1
While i <= 100
sum = sum + i
i = i + 2
Wend
Text1.Text = sum
End Sub
【例6.9】用While循環(huán)語句求n!,n的值由用戶輸入,。
Private Sub Command1_click()
Dim fact&, n&, i%
n = Val(Text1.Text)
fact = 1
i = 1
While i <= n
fact = fact * i
i = i + 1
Wend
Text2.Text = fact
End Sub
在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句,。例如在求累加中循環(huán)結(jié)束的條件是i>100,因此在循環(huán)體中應(yīng)該有使i增值以最終能使i>100的語句,,例中使用i=i+1語句來表達到此目的,。如果無此語句,則i的值始終不改變,,循環(huán)永不結(jié)束,,構(gòu)成死循環(huán),程序正常結(jié)束,。
6.2.3 Do 循環(huán)控制結(jié)構(gòu)
在已知循環(huán)次數(shù)的情況下,,使用For…Next 語句完成循環(huán)比較方便,但如果循環(huán)次數(shù)未知,,則要使用Do 循環(huán)控制結(jié)構(gòu)來實現(xiàn),,該控制結(jié)構(gòu)采用Do…Loop循環(huán)語句。Do…Loop循環(huán)比較靈活,可以根據(jù)需要決定是條件滿足時執(zhí)行循環(huán)體,,還是一直執(zhí)行循環(huán)體直到條件滿足,。Do…Loop循環(huán)可以有兩種格式,既可以在初始位置判斷條件是否成立,,也可以在執(zhí)行一輪循環(huán)體后再判斷條件是否成立,,能否進入下一輪循環(huán)。
Do…Loop循環(huán)的兩種格式如下:
1. 語法格式一: Do
<語句塊>
[Exit Do
語句塊]
Loop { While|Until} <條件>
2. 語法格式二: Do { While|Until }<條件>
<語句塊>
[Exit Do
語句塊]
Loop
上述兩種格式構(gòu)成了Do循環(huán)的兩種使用方法,。這兩種格式既有共同點又有明顯的差異,。上面2種格式有下面4種共同點。
(1) 均可以有一定的循環(huán)條件,,但循環(huán)體部分為空,。此種情況下,可以用于延時,。
(2) 均可以在程序的執(zhí)行過程中用“Exit Do”語句退出循環(huán),。
(3) 均可以嵌套使用,而且可以互相嵌套,。
(4) 均有兩種判斷條件的格式:一種為“While <條件>”,,判斷時只要條件成立,則繼續(xù)執(zhí)行循環(huán)體,,然后重復(fù)上述判斷過程,;否則退出循環(huán)。另一種為“Until <條件>”,,判斷時只要條件成立就退出循環(huán),,否則繼續(xù)執(zhí)行循環(huán)體,然后重復(fù)判斷過程,。
上述兩種格式有下面兩個不同點,。
(1) 第一種格式中的判斷條件“While或Until條件”的位置在整個循環(huán)體的最后,而第二種格式中的判斷條件“While或Until 條件”的位置在整個循環(huán)體的起始位置,。
(2) 第一種格式的執(zhí)行過程是先執(zhí)行一遍循環(huán)體,,再進行判斷;而第二種格式的執(zhí)行過程是先對條件進行判斷,,判斷為能夠執(zhí)行循環(huán)體時,,才能進入循環(huán)體執(zhí)行相應(yīng)語句。所以第一種格式至少要執(zhí)行一次循環(huán)體,,而第二種格式則可能根本不執(zhí)行循環(huán)體,。
【例6.10】編程求兩自然數(shù)m、n的最大公約數(shù),。
(1) 分析,??刹捎幂氜D(zhuǎn)相除法求得最大公約數(shù)。算法分析如下:
第一步 由m除以n得到余數(shù)r,;
第二步 若r=0,,則n為要求的最大公約數(shù),算法結(jié)束,;否則執(zhí)行第三步;
第三步 n賦值給m,,r賦值給n,,再轉(zhuǎn)到第一步執(zhí)行。
(2) 在窗體上創(chuàng)建文本框Text1和Text2,,用來供用戶輸入m和n的值,;創(chuàng)建命令按鈕Command1,并為Command1的單擊事件編寫下面過程,。
Private Sub command1_Click()
Dim m As Integer, n As Integer, r As Integer
m = Val(Text1.Text)
n = Val(Text2.Text)
r = m Mod n
Do Until r = 0
m = n
n = r
r = m Mod n
Loop
Print " 它們的最大公約數(shù)是";n
End Sub
(3) 程序功能,。執(zhí)行程序后,用戶在文本框Text1和Text2中輸入m和n的值,,單擊Command1按鈕,,在窗體上輸出m和n的最大公約數(shù),。例如,,分別輸入8和12時,運行結(jié)果如圖6-12所示,。
【例6.11】編程,。目前我國人口約為13億,按人口年增長0.8%計算,,多少年后我國人口達到26億,。
(1) 分析。由題目可知,,每年人口增長率相同,,即由前一年人口數(shù)量求下一年人口數(shù)量的公式相同,經(jīng)過若干年循環(huán),,人口達到26億,,由于循環(huán)次數(shù)未知,所以只能用Do…Loop循環(huán)實現(xiàn),。x表示人口數(shù)量初值,,n表示年數(shù)。
(2) 創(chuàng)建Command1按鈕,,為Command1的單擊事件編寫下面的過程,。
Private Sub Command1_Click()
Fontsize=12
x = 13
n = 0
Do While x < 26
x = x * 1.008
n = n + 1
Loop
Print n;"年后,,我國人口將達到";x;"億"
End Sub
(3) 程序功能,。運行程序,在窗體上顯示所求結(jié)果,,如圖6-13所示。
6.2.4 多重循環(huán)
多重循環(huán)又叫循環(huán)嵌套,,如果在一個循環(huán)的循環(huán)體內(nèi)又包括一個完整的循環(huán)結(jié)構(gòu),,則稱循環(huán)嵌套。嵌套可以繼續(xù)下去形成多個層次,。循環(huán)嵌套一般最常見的達到二重,,其次是三重,三重以上一般不常見,。
若結(jié)構(gòu)A是一個循環(huán)結(jié)構(gòu),,結(jié)構(gòu)B是A的循環(huán)體,且B也一個完整的循環(huán)結(jié)構(gòu),,則稱A為B的外循環(huán),,B為A的內(nèi)循環(huán)。
多重循環(huán)的執(zhí)行機制是,,外循環(huán)A每執(zhí)行一次,,其內(nèi)循環(huán)B要執(zhí)行多次直到循環(huán)B結(jié)束;如此繼續(xù),,直到最外層的循環(huán)執(zhí)行完畢,,整個多重循環(huán)才結(jié)束。
多重循環(huán)既可以出現(xiàn)在For循環(huán)語句中,,也可以出現(xiàn)在Do…Loop語句中,。
【例6.12】輸出100以內(nèi)的所有素數(shù)。
算法分析:
(1) 判斷某數(shù)m是否為素數(shù)最簡單的方法是分別判斷m能否被i整除,,i=2,,3,…,,m-1,。在判斷過程中,只要遇到一個i能整除m,,就說明m不是素數(shù),,否則m是素數(shù)。
(2) 對100以內(nèi)的每個自然數(shù)進行素數(shù)的判斷,,若是由輸出之,。
(3) 上述步驟(1)用一個內(nèi)循環(huán)實現(xiàn),步驟②用一個外循環(huán)實現(xiàn),。
圖片框Picture1的Click事件過程代碼如下:
Private Sub Picture1_Click()
Dim m%, i%, k%, count%
count = 0
For m = 101 To 200 Step 2 '外循環(huán)
k = Sqr(m + 1) '加1是為避免在求m時可能出現(xiàn)的誤差
For i = 2 To k '內(nèi)循環(huán)
If (m Mod i) = 0 Then Exit For
'若m能被i整除,,表明該m不是素數(shù),,退出內(nèi)循環(huán)
Next i
If i >= k + 1 Then '塊If是設(shè)計的輸出格式
Picture1.Print m;
count = count + 1
If (count Mod 5) = 0 Then Picture1.Print
End If
Next m
Label1.Caption = "100~200之間的素數(shù)共有" & count & "個。"
End Sub
程序運行結(jié)果如圖6-14所示,。
該程序是由兩層循環(huán)組成的循環(huán)嵌套結(jié)構(gòu),,外層是自For m = 101 To 200 Step 開始到Next m 結(jié)束的語句,內(nèi)層是由For i =2 To k 開始到Next結(jié)束的語句,。外循環(huán)的步長為2而不是1,,目的是將偶數(shù)減去,減少循環(huán)次數(shù),。
內(nèi)層循環(huán)中If (m Mod i)=0 Then Exit For 語句的作用是一旦m能被i整除,,強行結(jié)束內(nèi)循環(huán)。例如當m=105時,,由于105能被3整除,所以內(nèi)層循環(huán)執(zhí)行到i=3就強行結(jié)束,,不再執(zhí)行i=4, i=5……,。
一般情況下,循環(huán)過程要從頭到尾地執(zhí)行,,不能中途退出,。在某些情況下,為了減少循環(huán)次數(shù)或便于程序調(diào)試,,可能需要提前強制退出循環(huán),。VB為此提供了出口語句Exit。
一般編程時,,多采用條件形式的出口語句:
If條件 Then Exit For
If條件 Then Exit Do
If條件 Then Exit Sub
If條件 Then Exit Function
使用出口語句除能減少循環(huán)次數(shù)結(jié)構(gòu)外,,其意義還在于它顯式地標出了循環(huán)的出口點,這樣改善某些循環(huán)的可讀性,,并易于代碼的編寫,。
對于循環(huán)的嵌套,要注意下面事項:
① 在多重循環(huán)結(jié)構(gòu)中,,各層循環(huán)的循環(huán)控制變量不能同名,。但并列循環(huán)的循環(huán)控制變量名可以相同,也可以不同,。
② 外層循環(huán)必須完全包含內(nèi)層循環(huán),,不能交叉。
小結(jié):
循環(huán)結(jié)構(gòu)是用來描述現(xiàn)實世界中循環(huán)現(xiàn)象的重要手段,。所謂循環(huán)結(jié)構(gòu),,表示在執(zhí)行語句時,需要對其中的某些語句重復(fù)執(zhí)行多次,,被重復(fù)執(zhí)行的語句塊稱為循環(huán)體,。使用循環(huán)結(jié)構(gòu)避免不必要的操作,,簡化程序結(jié)構(gòu),節(jié)省存儲空間,。
常用的循環(huán)語句有For…Next循環(huán)語句和Do…Loop循環(huán)語句兩種格式,。無論何種類型的循環(huán)結(jié)構(gòu),循環(huán)體的執(zhí)行次數(shù)都由循環(huán)類型和條件決定,,并且在某個時候得以終止循環(huán),。通常,循環(huán)結(jié)構(gòu)從現(xiàn)實事物中抽象出一個計數(shù)器變量,,在計數(shù)器變量的取值范圍內(nèi),,進行循環(huán)操作。
作業(yè):
1,、 列出所學(xué)的循環(huán)語句,,試比較各種循環(huán)語句的功能。
2,、如果知道循環(huán)次數(shù),,應(yīng)選擇哪種循環(huán)語句?如果不知道循環(huán)次數(shù),,應(yīng)選擇哪種循環(huán)語句,?為什么?
3,、循環(huán)結(jié)構(gòu)允許嵌套嗎,?如果允許,在設(shè)計這種結(jié)構(gòu)時應(yīng)注意什么問題,?
|