电竞比分网-中国电竞赛事及体育赛事平台

分享

VB程序設(shè)計(jì)程序控制結(jié)構(gòu)(二)

 你喜歡那個(gè) 2012-05-13

For循環(huán)控制結(jié)構(gòu)

循環(huán)控制結(jié)構(gòu)屬于計(jì)數(shù)型循環(huán),程序按照此種結(jié)構(gòu)中指明的循環(huán)次數(shù)來(lái)執(zhí)行循環(huán)體部分,采用ForNext循環(huán)語(yǔ)句,其語(yǔ)法格式如下:

          For <循環(huán)變量> = <初始值> To <終值> [Step 步長(zhǎng)]

                         [循環(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. 步長(zhǎng)。用于決定循環(huán)變量每次的增值,為數(shù)值型變量。當(dāng)步長(zhǎng)為1時(shí),可以省略[Step 步長(zhǎng)]選項(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í)行過(guò)程是先給循環(huán)變量賦初值,然后判斷。若循環(huán)變量的值沒(méi)有超出終值,則執(zhí)行一輪循環(huán)體,然后將循環(huán)變量加上步長(zhǎng)值,判斷是否可以執(zhí)行下一輪循環(huán),接著重復(fù)上述過(guò)程;否則退出循環(huán)。

若循環(huán)體中存在Exit For語(yǔ)句,則在執(zhí)行過(guò)程中,滿足條件即可強(qiáng)制跳出For循環(huán)。若存在For循環(huán)嵌套,使用Exit For語(yǔ)句只能跳出最內(nèi)層的循環(huán),繼續(xù)執(zhí)行外層循環(huán)。

當(dāng)For循環(huán)的循環(huán)體內(nèi)沒(méi)有任何具體語(yǔ)句時(shí),該循環(huán)部分可作為延時(shí)工具使用。

【例6.7】編寫(xiě)程序,求1n(正整數(shù))的所有正整數(shù)之和。

(1) 分析。根據(jù)題意,n的值由用戶輸入。要求n個(gè)正整數(shù)的和,可看作n次加法操作,即加法操作被循環(huán)執(zhí)行n次,其中,n是循環(huán)變量,控制循環(huán)次數(shù)。

(2) 在窗體的單擊事件上編寫(xiě)下面的事件過(guò)程。

Private Sub Form_Click()

     Dim s As Single,i As Integer

     n=Val(InputBox("請(qǐng)輸入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的值,然后在窗體上顯示1nn個(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語(yǔ)句,可以在循環(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)語(yǔ)句,其講法格式為:

While 條件

                           [循環(huán)體]

Wend

說(shuō)明:

1.“條件”可以是關(guān)系表達(dá)式或邏輯表達(dá)式。While循環(huán)就是當(dāng)給定的“條件”為True時(shí),執(zhí)行循環(huán)體,為False時(shí)不執(zhí)行循環(huán)體。如果開(kāi)始條件就不成立,則循環(huán)體一次也不執(zhí)行。因此While循環(huán)出可直接稱為當(dāng)型循環(huán)。

2. 循環(huán)結(jié)構(gòu)執(zhí)行過(guò)程如下:

(1) 執(zhí)行While語(yǔ)句,判斷條件是否為真。

(2) 如果條件為真,就執(zhí)行循環(huán)體;否則,轉(zhuǎn)到④執(zhí)行。

(3) 執(zhí)行Wend語(yǔ)句,轉(zhuǎn)到①執(zhí)行。

(4) 執(zhí)行Wend語(yǔ)句下面的語(yǔ)句。

(5) While循環(huán)語(yǔ)句本身不能修改循環(huán)條件,所以必須在While…Wend語(yǔ)句的循環(huán)體內(nèi)設(shè)置相應(yīng)的語(yǔ)句,使得整個(gè)循環(huán)趨于結(jié)束,以避免死循環(huán)。

【例6.8】用While循環(huán)語(yǔ)句計(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)語(yǔ)句求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é)束的語(yǔ)句。例如在求累加中循環(huán)結(jié)束的條件是i>100,因此在循環(huán)體中應(yīng)該有使i增值以最終能使i>100的語(yǔ)句,例中使用i=i+1語(yǔ)句來(lái)表達(dá)到此目的。如果無(wú)此語(yǔ)句,則i的值始終不改變,循環(huán)永不結(jié)束,構(gòu)成死循環(huán),程序正常結(jié)束。

6.2.3  Do 循環(huán)控制結(jié)構(gòu)

在已知循環(huán)次數(shù)的情況下,使用For…Next 語(yǔ)句完成循環(huán)比較方便,但如果循環(huán)次數(shù)未知,則要使用Do 循環(huán)控制結(jié)構(gòu)來(lái)實(shí)現(xiàn),該控制結(jié)構(gòu)采用Do…Loop循環(huán)語(yǔ)句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. 語(yǔ)法格式一:          Do

                                   <語(yǔ)句塊>

                                   [Exit  Do

                                   語(yǔ)句塊]

                              Loop { While|Until} <條件>

2. 語(yǔ)法格式二:          Do { While|Until }<條件>

                                          <語(yǔ)句塊>

                                          [Exit  Do

                                             語(yǔ)句塊]

                                          Loop

                   

上述兩種格式構(gòu)成了Do循環(huán)的兩種使用方法。這兩種格式既有共同點(diǎn)又有明顯的差異。上面2種格式有下面4種共同點(diǎn)。

(1) 均可以有一定的循環(huán)條件,但循環(huán)體部分為空。此種情況下,可以用于延時(shí)。

(2) 均可以在程序的執(zhí)行過(guò)程中用“Exit Do”語(yǔ)句退出循環(huán)。

(3) 均可以嵌套使用,而且可以互相嵌套。

(4) 均有兩種判斷條件的格式:一種為“While <條件>”,判斷時(shí)只要條件成立,則繼續(xù)執(zhí)行循環(huán)體,然后重復(fù)上述判斷過(guò)程;否則退出循環(huán)。另一種為“Until <條件>”,判斷時(shí)只要條件成立就退出循環(huán),否則繼續(xù)執(zhí)行循環(huán)體,然后重復(fù)判斷過(guò)程。

上述兩種格式有下面兩個(gè)不同點(diǎn)。

(1) 第一種格式中的判斷條件“WhileUntil條件”的位置在整個(gè)循環(huán)體的最后,而第二種格式中的判斷條件“WhileUntil 條件”的位置在整個(gè)循環(huán)體的起始位置。

(2) 第一種格式的執(zhí)行過(guò)程是先執(zhí)行一遍循環(huán)體,再進(jìn)行判斷;而第二種格式的執(zhí)行過(guò)程是先對(duì)條件進(jìn)行判斷,判斷為能夠執(zhí)行循環(huán)體時(shí),才能進(jìn)入循環(huán)體執(zhí)行相應(yīng)語(yǔ)句。所以第一種格式至少要執(zhí)行一次循環(huán)體,而第二種格式則可能根本不執(zhí)行循環(huán)體。

【例6.10】編程求兩自然數(shù)mn的最大公約數(shù)。

(1) 分析。可采用輾轉(zhuǎn)相除法求得最大公約數(shù)。算法分析如下:

第一步 m除以n得到余數(shù)r;

第二步 r=0,則n為要求的最大公約數(shù),算法結(jié)束;否則執(zhí)行第三步;

第三步 n賦值給m,r賦值給n,再轉(zhuǎn)到第一步執(zhí)行。

(2) 在窗體上創(chuàng)建文本框Text1Text2,用來(lái)供用戶輸入mn的值;創(chuàng)建命令按鈕Command1,并為Command1的單擊事件編寫(xiě)下面過(guò)程。

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í)行程序后,用戶在文本框Text1Text2中輸入mn的值,單擊Command1按鈕,在窗體上輸出mn的最大公約數(shù)。例如,分別輸入812時(shí),運(yùn)行結(jié)果如圖6-12所示。

【例6.11】編程。目前我國(guó)人口約為13億,按人口年增長(zhǎng)0.8%計(jì)算,多少年后我國(guó)人口達(dá)到26億。

(1) 分析。由題目可知,每年人口增長(zhǎng)率相同,即由前一年人口數(shù)量求下一年人口數(shù)量的公式相同,經(jīng)過(guò)若干年循環(huán),人口達(dá)到26億,由于循環(huán)次數(shù)未知,所以只能用DoLoop循環(huán)實(shí)現(xiàn)x表示人口數(shù)量初值,n表示年數(shù)。

(2) 創(chuàng)建Command1按鈕,為Command1的單擊事件編寫(xiě)下面的過(guò)程。

Private Sub Command1_Click()

  Fontsize=12

  x = 13

  n = 0

  Do While x < 26

   x = x * 1.008

   n = n + 1

 Loop

  Print n;"年后,我國(guó)人口將達(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)嵌套一般最常見(jiàn)的達(dá)到二重,其次是三重,三重以上一般不常見(jiàn)。

若結(jié)構(gòu)A是一個(gè)循環(huán)結(jié)構(gòu),結(jié)構(gòu)BA的循環(huán)體,且B也一個(gè)完整的循環(huán)結(jié)構(gòu),則稱AB的外循環(huán),BA的內(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)語(yǔ)句中,也可以出現(xiàn)在Do…Loop語(yǔ)句中。

【例6.12】輸出100以內(nèi)的所有素?cái)?shù)。

算法分析:

(1) 判斷某數(shù)m是否為素?cái)?shù)最簡(jiǎn)單的方法是分別判斷m能否被i整除,i=2,3,,m1。在判斷過(guò)程中,只要遇到一個(gè)i能整除m,就說(shuō)明m不是素?cái)?shù),否則m是素?cái)?shù)。

(2) 對(duì)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)。

圖片框Picture1Click事件過(guò)程代碼如下:

  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 = "100200之間的素?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 開(kāi)始到Next m 結(jié)束的語(yǔ)句,內(nèi)層是由For i =2 To k 開(kāi)始到Next結(jié)束的語(yǔ)句。外循環(huán)的步長(zhǎng)為2而不是1,目的是將偶數(shù)減去,減少循環(huán)次數(shù)。

內(nèi)層循環(huán)中If (m Mod i)=0 Then Exit For 語(yǔ)句的作用是一旦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)過(guò)程要從頭到尾地執(zhí)行,不能中途退出。在某些情況下,為了減少循環(huán)次數(shù)或便于程序調(diào)試,可能需要提前強(qiáng)制退出循環(huán)。VB為此提供了出口語(yǔ)句Exit

一般編程時(shí),多采用條件形式的出口語(yǔ)句:

If條件 Then Exit For

If條件 Then Exit Do

If條件 Then Exit Sub

If條件 Then Exit Function

使用出口語(yǔ)句除能減少循環(huán)次數(shù)結(jié)構(gòu)外,其意義還在于它顯式地標(biāo)出了循環(huán)的出口點(diǎn),這樣改善某些循環(huán)的可讀性,并易于代碼的編寫(xiě)。

對(duì)于循環(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)是用來(lái)描述現(xiàn)實(shí)世界中循環(huán)現(xiàn)象的重要手段。所謂循環(huán)結(jié)構(gòu),表示在執(zhí)行語(yǔ)句時(shí),需要對(duì)其中的某些語(yǔ)句重復(fù)執(zhí)行多次,被重復(fù)執(zhí)行的語(yǔ)句塊稱為循環(huán)體。使用循環(huán)結(jié)構(gòu)避免不必要的操作,簡(jiǎn)化程序結(jié)構(gòu),節(jié)省存儲(chǔ)空間。

常用的循環(huán)語(yǔ)句有ForNext循環(huán)語(yǔ)句和DoLoop循環(huán)語(yǔ)句兩種格式。無(wú)論何種類型的循環(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)語(yǔ)句,試比較各種循環(huán)語(yǔ)句的功能。

2、如果知道循環(huán)次數(shù),應(yīng)選擇哪種循環(huán)語(yǔ)句?如果不知道循環(huán)次數(shù),應(yīng)選擇哪種循環(huán)語(yǔ)句?為什么?

3、循環(huán)結(jié)構(gòu)允許嵌套嗎?如果允許,在設(shè)計(jì)這種結(jié)構(gòu)時(shí)應(yīng)注意什么問(wèn)題?

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多