|
For循環(huán)控制結(jié)構(gòu)
循環(huán)控制結(jié)構(gòu)屬于計(jì)數(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)變量
在此格式中,使用了這樣幾個(gè)參數(shù):
1. 循環(huán)變量。用于統(tǒng)計(jì)循環(huán)次數(shù),該變量為數(shù)值型變量。
2. 初始值。用于設(shè)置循環(huán)變量的初始值,該變量為數(shù)值型變量。
3. 終值。用于設(shè)置循環(huán)變量的終止值,該變量為數(shù)值型變量。
4. 步長。用于決定循環(huán)變量每次的增值,為數(shù)值型變量。當(dāng)步長為1時(shí),可以省略[Step 步長]選項(xiàng)。
5. 循環(huán)體。重復(fù)執(zhí)行的部分。
6. Exit For。在某些情況下,可強(qiáng)制退出For循環(huán)。
7. Next循環(huán)變量。用于結(jié)束一輪For循環(huán)。根據(jù)終止值和當(dāng)前循環(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í)行過程中,滿足條件即可強(qiáng)制跳出For循環(huán)。若存在For循環(huán)嵌套,使用Exit For語句只能跳出最內(nèi)層的循環(huán),繼續(xù)執(zhí)行外層循環(huán)。
當(dāng)For循環(huán)的循環(huán)體內(nèi)沒有任何具體語句時(shí),該循環(huán)部分可作為延時(shí)工具使用。
【例6.7】編寫程序,求1~n(正整數(shù))的所有正整數(shù)之和。
(1) 分析。根據(jù)題意,n的值由用戶輸入。要求n個(gè)正整數(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) 程序功能。運(yùn)行程序后,單擊窗體彈出一個(gè)輸入框由用戶輸入n的值,然后在窗體上顯示1到n這n個(gè)數(shù)的和。當(dāng)輸入100時(shí),運(yùn)行結(jié)果如圖6-7所示。

6.2.2 當(dāng)循環(huán)控制結(jié)構(gòu)
雖然在For…Next結(jié)構(gòu)中增加帶條件的Exit For語句,可以在循環(huán)次數(shù)不確定只給出循環(huán)結(jié)束條件的情況退出循環(huán)結(jié)構(gòu),但是在這種情況下,使用當(dāng)循環(huán)控制結(jié)構(gòu)會(huì)更方便,當(dāng)循環(huán)控制結(jié)構(gòu)采用While…Wend循環(huán)語句,其講法格式為:
While 條件
[循環(huán)體]
Wend
說明:
1.“條件”可以是關(guān)系表達(dá)式或邏輯表達(dá)式。While循環(huán)就是當(dāng)給定的“條件”為True時(shí),執(zhí)行循環(huán)體,為False時(shí)不執(zhí)行循環(huán)體。如果開始條件就不成立,則循環(huán)體一次也不執(zhí)行。因此While循環(huán)出可直接稱為當(dāng)型循環(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)的語句,使得整個(gè)循環(huán)趨于結(jié)束,以避免死循環(huán)。
【例6.8】用While循環(huán)語句計(jì)算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語句來表達(dá)到此目的。如果無此語句,則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)來實(shí)現(xiàn),該控制結(jié)構(gòu)采用Do…Loop循環(huán)語句。Do…Loop循環(huán)比較靈活,可以根據(jù)需要決定是條件滿足時(shí)執(zhí)行循環(huán)體,還是一直執(zhí)行循環(huán)體直到條件滿足。Do…Loop循環(huán)可以有兩種格式,既可以在初始位置判斷條件是否成立,也可以在執(zhí)行一輪循環(huán)體后再判斷條件是否成立,能否進(jì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)的兩種使用方法。這兩種格式既有共同點(diǎn)又有明顯的差異。上面2種格式有下面4種共同點(diǎn)。
(1) 均可以有一定的循環(huán)條件,但循環(huán)體部分為空。此種情況下,可以用于延時(shí)。
(2) 均可以在程序的執(zhí)行過程中用“Exit Do”語句退出循環(huán)。
(3) 均可以嵌套使用,而且可以互相嵌套。
(4) 均有兩種判斷條件的格式:一種為“While <條件>”,判斷時(shí)只要條件成立,則繼續(xù)執(zhí)行循環(huán)體,然后重復(fù)上述判斷過程;否則退出循環(huán)。另一種為“Until <條件>”,判斷時(shí)只要條件成立就退出循環(huán),否則繼續(xù)執(zhí)行循環(huán)體,然后重復(fù)判斷過程。
上述兩種格式有下面兩個(gè)不同點(diǎn)。
(1) 第一種格式中的判斷條件“While或Until條件”的位置在整個(gè)循環(huán)體的最后,而第二種格式中的判斷條件“While或Until 條件”的位置在整個(gè)循環(huán)體的起始位置。
(2) 第一種格式的執(zhí)行過程是先執(zhí)行一遍循環(huán)體,再進(jìn)行判斷;而第二種格式的執(zhí)行過程是先對條件進(jìn)行判斷,判斷為能夠執(zhí)行循環(huán)體時(shí),才能進(jì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時(shí),運(yùn)行結(jié)果如圖6-12所示。

【例6.11】編程。目前我國人口約為13億,按人口年增長0.8%計(jì)算,多少年后我國人口達(dá)到26億。
(1) 分析。由題目可知,每年人口增長率相同,即由前一年人口數(shù)量求下一年人口數(shù)量的公式相同,經(jīng)過若干年循環(huán),人口達(dá)到26億,由于循環(huán)次數(shù)未知,所以只能用Do…Loop循環(huán)實(shí)現(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;"年后,我國人口將達(dá)到";x;"億"
End Sub
(3) 程序功能。運(yùn)行程序,在窗體上顯示所求結(jié)果,如圖6-13所示。
6.2.4 多重循環(huán)
多重循環(huán)又叫循環(huán)嵌套,如果在一個(gè)循環(huán)的循環(huán)體內(nèi)又包括一個(gè)完整的循環(huán)結(jié)構(gòu),則稱循環(huán)嵌套。嵌套可以繼續(xù)下去形成多個(gè)層次。循環(huán)嵌套一般最常見的達(dá)到二重,其次是三重,三重以上一般不常見。
若結(jié)構(gòu)A是一個(gè)循環(huán)結(jié)構(gòu),結(jié)構(gòu)B是A的循環(huán)體,且B也一個(gè)完整的循環(huán)結(jié)構(gòu),則稱A為B的外循環(huán),B為A的內(nèi)循環(huán)。
多重循環(huán)的執(zhí)行機(jī)制是,外循環(huán)A每執(zhí)行一次,其內(nèi)循環(huán)B要執(zhí)行多次直到循環(huán)B結(jié)束;如此繼續(xù),直到最外層的循環(huán)執(zhí)行完畢,整個(gè)多重循環(huán)才結(jié)束。
多重循環(huán)既可以出現(xiàn)在For循環(huán)語句中,也可以出現(xiàn)在Do…Loop語句中。
【例6.12】輸出100以內(nèi)的所有素?cái)?shù)。
算法分析:
(1) 判斷某數(shù)m是否為素?cái)?shù)最簡單的方法是分別判斷m能否被i整除,i=2,3,…,m-1。在判斷過程中,只要遇到一個(gè)i能整除m,就說明m不是素?cái)?shù),否則m是素?cái)?shù)。
(2) 對100以內(nèi)的每個(gè)自然數(shù)進(jìn)行素?cái)?shù)的判斷,若是由輸出之。
(3) 上述步驟(1)用一個(gè)內(nèi)循環(huán)實(shí)現(xiàn),步驟②用一個(gè)外循環(huán)實(shí)現(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時(shí)可能出現(xiàn)的誤差
For i = 2 To k '內(nèi)循環(huán)
If (m Mod i) = 0 Then Exit For
'若m能被i整除,表明該m不是素?cái)?shù),退出內(nèi)循環(huán)
Next i
If i >= k + 1 Then '塊If是設(shè)計(jì)的輸出格式
Picture1.Print m;
count = count + 1
If (count Mod 5) = 0 Then Picture1.Print
End If
Next m
Label1.Caption = "100~200之間的素?cái)?shù)共有" & count & "個(gè)。"
End Sub
程序運(yùn)行結(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整除,強(qiáng)行結(jié)束內(nèi)循環(huán)。例如當(dāng)m=105時(shí),由于105能被3整除,所以內(nèi)層循環(huán)執(zhí)行到i=3就強(qiáng)行結(jié)束,不再執(zhí)行i=4, i=5……。
一般情況下,循環(huán)過程要從頭到尾地執(zhí)行,不能中途退出。在某些情況下,為了減少循環(huán)次數(shù)或便于程序調(diào)試,可能需要提前強(qiáng)制退出循環(huán)。VB為此提供了出口語句Exit。
一般編程時(shí),多采用條件形式的出口語句:
If條件 Then Exit For
If條件 Then Exit Do
If條件 Then Exit Sub
If條件 Then Exit Function
使用出口語句除能減少循環(huán)次數(shù)結(jié)構(gòu)外,其意義還在于它顯式地標(biāo)出了循環(huán)的出口點(diǎn),這樣改善某些循環(huán)的可讀性,并易于代碼的編寫。
對于循環(huán)的嵌套,要注意下面事項(xiàng):
① 在多重循環(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)實(shí)世界中循環(huán)現(xiàn)象的重要手段。所謂循環(huán)結(jié)構(gòu),表示在執(zhí)行語句時(shí),需要對其中的某些語句重復(fù)執(zhí)行多次,被重復(fù)執(zhí)行的語句塊稱為循環(huán)體。使用循環(huán)結(jié)構(gòu)避免不必要的操作,簡化程序結(jié)構(gòu),節(jié)省存儲(chǔ)空間。
常用的循環(huán)語句有For…Next循環(huán)語句和Do…Loop循環(huán)語句兩種格式。無論何種類型的循環(huán)結(jié)構(gòu),循環(huán)體的執(zhí)行次數(shù)都由循環(huán)類型和條件決定,并且在某個(gè)時(shí)候得以終止循環(huán)。通常,循環(huán)結(jié)構(gòu)從現(xiàn)實(shí)事物中抽象出一個(gè)計(jì)數(shù)器變量,在計(jì)數(shù)器變量的取值范圍內(nèi),進(jìn)行循環(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è)計(jì)這種結(jié)構(gòu)時(shí)應(yīng)注意什么問題?
|