450 likes | 601 Views
計算機 概論 Visual BASIC 程式設計. 德霖技術學院 廖文淵 E-Mail: andres@dlit.edu.tw. Chapter 8. 迴圈. 8-1 For...Next 陳述式 8-2 Print 方法 8-3 多層迴圈 8-4 程式範例. 8-1-1 For...Next 迴圈陳述式. 8-1 For...Next 陳述式. 當我們在設計程式時,若碰到所要解決的問題程式行有其規則性或相似時,可以設計成迴圈結構。 Visual Basic 提供的迴圈指令是 For…Next 和 Do… Loop( 第10章)兩種結構 。
E N D
計算機概論Visual BASIC 程式設計 德霖技術學院 廖文淵 E-Mail: andres@dlit.edu.tw
Chapter 8 迴圈 8-1 For...Next陳述式8-2 Print方法8-3 多層迴圈8-4 程式範例
8-1-1 For...Next迴圈陳述式 8-1 For...Next陳述式 • 當我們在設計程式時,若碰到所要解決的問題程式行有其規則性或相似時,可以設計成迴圈結構。 • Visual Basic提供的迴圈指令是For…Next和Do… Loop(第10章)兩種結構 。 • 當程式中某段敘述要重覆執行的次數是可以計數時,可用到計數迴圈For…Next陳述句。 • 利用迴圈的索引指標的定義來控制迴圈中的陳述句要執行幾次,且可使用索引指標的資料來計算 。
語法 • 語法 : • For counter = start To End [Step Step][statements][Exit For][statements]Next [counter] • For 計數變數 = 起始值 To 終止值 [Step 間隔值]陳述式[Exit For]陳述式Next 計數變數
運作說明 • 一進入For迴圈,計數變數先等於起始值,「檢查終值條件」是否成立,若成立則開始執行敘述,一直執行到Next敘述時又跳回For處,此時計數變數等於起始值+間隔值,再繼續「檢查終值條件」,以此類推,直到「檢查終值條件」不成立為止。 • 「檢查終值條件」的法則有二 • 1.若間隔值是正數,則counter<=End代表條件成立。 • 2.若間隔值是負數,則counter>=End代表條件成立。 • 跳出迴圈時,可以利用Exit For指令和配合If...Then來控制。
【程式】CH08-01 密碼檢查程式 • Private Sub Form_Activate() • Rem 輸入三次密碼,若其中一次正確,即離開迴圈 • Rem XPASS1是系統的密碼,XPASS2是輸入的密碼 • XPASS1=”1234” : XFLAG =”False” • For I = 1 To 3 • XPASS2=InputBox(“請輸入密碼”) • If XPASS1=XPASS2 Then • XFLAG = “True” • Exit For • End If • Next I • If XFLAG = “True” Then • MsgBox “密碼正確” • Else • MsgBox “密碼不正確” • End If • End Sub
8-1-2 For...Next範例 8-1-2 For...Next範例 • 【程式】CH08-02 計算1到10的總和 • Private Sub Form_Activate( ) • Dim xsum As Integer • Form1.Font.Size=20 • xsum=0 • For i=1 To 10 • xsum=xsum+i • Next i • Print “1+2+3+........+10=” ; xsum • End Sub
程式說明-1 • 1.此段程式碼執行的結果如右圖: • 2.為了讓輸出的資料字體可以大一點,所以設定Form1的字體大小為20,其程式行如下,之後的範例中,若要顯示大一點的字體時,可以加入此行程式:Form1.Font.Size=20 • 3.此段程式說明如何應用For...Next來計算1+2+......+10之總和。首先宣告xsum為整數變數,並令其初值為0。 • 4.程式碼For i=1 To 10表示由i=1執行到i=10,每次計數變數自動加1,共執行10次。由於間隔值為1,故省略Step。
程式說明-2 • 5.程式碼xsum=xsum+i表示將計數變數i的值累計至總和xsum裡面,故迴圈執行時,會產生下列情形:第1圈xsum=xsum+1=0+1=1(當i=1時,原先xsum=0)第2圈xsum=xsum+2=1+2=3(當i=2時,原先xsum=1)第3圈xsum=xsum+3=3+3=6(當i=3時,原先xsum=3)...第10圈xsum= xsum+10=45+10=55 (當i=10時,原先xsum=45)
For...Next範例2 • 【程式】CH08-03 計算1到100的奇數和 • Private Sub Form_Activate( ) • Dim xsum As Integer • Form1.Font.Size=20 • xsum=0 • For i=1 To 100 Step 2 • xsum=xsum + i • Next i • Print “1+3+5+........+99=” ; xsum • End Sub
程式說明 • 1.此段程式碼執行的結果如右圖: • 2.迴圈執行時,會產生下列情形:第1圈 xfact=xfact*1=1*1=1第2圈 xfact=xfact*2=1*2=2第3圈 xfact=xfact*3=2*3=6第4圈 xfact=xfact*4=6*4=24第5圈 xfact=xfact*5=24*5=120
8-2-1 基本輸出Print 8-2 Print方法 • Print是最基本的輸出陳述式 。 • Object.Print陳述式可以在object(物件)中顯示資料,object通常是表單(Form)或Debug。 • 例如之前我們以Debug.Print陳述式可在「立即視窗」中顯示資料。
語法&語法說明 • 語法: • object.Print [outputlist] • object.Print [輸出串] • 語法說明 : • Debug.Print “程式名稱:Print練習” ‘輸出文字 • Debug.Print ‘印一空白行 • Debug.Print “日期:2002/02/02” ‘輸出文字
outputlist 引數語法說明 • 語法: • {Spc(n) | Tab(n)} expression charpos • {Spc(n) | Tab(n)} 運算式 位置控制符號 • Debug.Print Spc(10);“程式名稱:Print練習” • Debug.Print Tab(10);“日期:2002/02/02” • Debug.Print Tab(10);“指令:Print ”;Spc(2);”Spc ”; • Debug.Print “tab”
Print範例1 • 【程式】CH08-05 輸出文字圖形 • Private Sub Form_Activate() • Form1.Font.Size=20 • For N=1 To 5 • Print string(N*2-1,”$”) • Next N • End Sub • 【說明】 • 1.String函數是產生指定的符號,語法 String(N,Character) • 2.N=1 時,N*2-1=1,輸出 $N=2 時,N*2-1=3,輸出 $$$N=3 時,N*3-1=5,輸出 $$$$$N=4 時,N*4-1=7,輸出 $$$$$$$N=5 時,N*5-1=9,輸出 $$$$$$$$$
Spc函數範例1 • 【程式】CH08-06 用Spc函數輸出文字圖形 • Private Sub Form_Activate() • Form1.Font.Size=20 • For N=1 To 5 • Print Spc(6-N) ; String(N*2-1,”$”) • Next N • End Sub • 【說明】 • 1.String函數是產生指定的符號,語法 String(N,Character) • 2.N=1時,N*2-1=1,空5格再輸出,即 $N=2時,N*2-1=3,空4格再輸出,即 $$$N=3時,N*3-1=5,空3格再輸出,即 $$$$$N=4時,N*4-1=7,空2格再輸出,即 $$$$$$$N=5時,N*5-1=9,空1格再輸出,即 $$$$$$$$$
Tab函數範例1 • 【程式】CH08-07 且用Tab排列N!的值 • Rem 計算N!的值,N!=N*(N-1)*……*3*2*1,且用Tab排列 • Private Sub Form_Activate() • Form1.Font.Size=20 • xfact=1:n=5 ‘注意XFACT的起始值是1 • Print Tab(10);”i”;Tab(20);;”i!” • Print Tab(9);”---”;Tab(19);;”------” • For i=1 To n • xfact=xfact*i • Print Tab(9);i;Tab(20);;xfact • Next i • End Sub
Tab函數範例1 • 【說明】 • 1.此段程式碼執行的結果如右圖: • 2.迴圈執行時,會產生下列情形:第1圈 xfact=xfact*1=1*1=1第2圈 xfact=xfact*2=1*2=2第3圈 xfact=xfact*3=2*3=6第4圈 xfact=xfact*4=6*4=24第5圈 xfact=xfact*5=24*5=120
8-2-2 Space函數 8-2-2 Space函數 • Space函數可以傳回特定數目的空格,通常和字串合用 。 • 語法 : • Space(n) • 運作說明 : • n是必要引數,n是為我們想要的空格數。一般用來和字串結合使用。
Space函數範例 • 【程式】CH08-08 用Space函數輸出文字圖形 • Private Sub Form_Activate() • Form1.Font.Size=20 • For N=5 To 1 Step -1 • Print Space(6-N)+String(N*2-1,”$”) • Next N • End Sub • 【說明】 • 1.Str函數是產生指定的符號,語法格式String(N,Character) • 2.N=1時,N*2-1=1,合併1格空白,即 $$$$$$$$$N=2時,N*2-1=3,合併2格空白,即 $$$$$$$N=3時,N*3-1=5,合併3格空白,即 $$$$$N=4時,N*4-1=7,合併4格空白,即 $$$N=5時,N*5-1=9,合併5格空白,即 $
8-3-1 巢狀式For…Next 8-3 多層迴圈 • 當我們要處理的問題可以用二個索引變數來控制迴圈時,可以設計成二層迴圈,它和巢狀式If...Then...Else結構相似 。 • 在巢狀式迴圈中,每層迴圈中的索引變數(或稱計數器),要使用不同的變數名稱,且要符合配對方式 。
8-3-2 巢狀式For...Next 範例 8-3-2 巢狀式For...Next 範例 • 【程式】CH08-09 顯示九九乘法表 • Private Sub Form_Activate( ) • For I=1 To 9 • For J=1 To 9 • Debug.Print J;”x”;I;”=”;I*J, • Next J • Debug.Print • Next I • End Sub • 【說明】 • 1.此段程式碼執行的結果如下圖:
巢狀式For...Next範例1 • 2.此段程式主要是運用兩層巢狀式For...Next來列出「九九乘法表」。 • 3.I變數控制從1到9,J變數也控制從1到9,第1行Print敘述印出I*J的結果,且不跳行。 • 4.當J迴圈結束時,執行Print敘述,會跳一行且回到I迴圈,I遞增1,繼續執行J迴圈。 • 5.當I迴圈執行完9次後,程式結束。
8-4-1 範例1:求某數最接近的倍數值 8-4 程式範例 • 「邏輯運算式」是用來處理二項資料之間的邏輯關係,其結果非真(True)即假(False)。 • Visual Basic所提供的邏輯運算子有以下六種:NOT、AND、OR、XOR、EQV、IMP。 • 右表是VB邏輯運算子的運算方式與優先順序。
題目和分析-1 • 【題目1】CH08-10 • 輸入數字X,求出比X大且最接近Y的倍數的數值。 • 例:X=3,Y=5,則比3大,最接近5的倍數值的數值是5。 • 例:X=9,Y=5,則比9大,最接近5的倍數值的數值是10。 • 【分析】 • 1.這個問題從字面上的文字不易看出解題的方法,不能夠一下子即開始編寫程式,但若經過仔細地分析其數值的關係時,這個題目並不難,還是可以用幾行程式行或一個運算式求得結果,這就是演算法和分析問題的重要性。
題目和分析-2 • 2.先觀察下列數值的推演:若X=3、Y=5,則答案是5,因為5=5*1若X=9、Y=5,則答案是10,因為10=5*2若X=13、Y=5,則答案是15,因為15=5*3 • 3.上式中最右邊的1、2、3是否和原來的3、9、13有規則嗎? 有的,若將3、9、13除以5取其整數再加1,即是1、2、3了。所以運算式應該是=5 * ( Int(X/5) + 1 )。例如:X=3、Y=5,則答案 = 5 * ( Int(3/5) + 1 ) = 5 * ( Int(0.6) + 1 ) = 5 * ( 0 + 1 ) = 5例如:X=9,Y=5,則答案 = 5 * ( Int( 9 / 5 ) + 1 ) = 5 * ( Int(1.8) + 1 )= 5 * (1+1) = 10例如:X=13,Y=5,則答案 = 5 * (Int( 13 / 5 ) + 1 ) = 5 * (Int(2.6)+1) = 5 * (2+1) = 15
設計和程式 • 【設計】 • 1.由InputBox輸入X值,令Y=5,答案為Z。 • 2.由上述分析知道運算公式 Z=5 * ( Int(X / 5) + 1 ) • 【程式】 • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 X=InputBox(“輸入數字”) • 4 Y=5 • 5 Z=Y*(Int(X/5)+1) • 6 Print “比”;X;”值大的5的倍數值=”;Z • 7 End Sub
【題目2】CH08-11 • 若要求得任何數值的倍數值,可將Y由鍵盤輸入,程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 X=InputBox(“輸入數字”) • 4 Y=InputBox(“輸入倍數數值”) • 5 Z= Y*(Int(X/Y)+1) • 6 Print “比”;X;”值大的”;Y;”倍數值=”;Z • 7 End Sub
8-4-2 範例2:計算數列加總 8-4-2 範例2:計算數列加總 • 【題目1】CH08-12 • 計算1到100的總和。 • 【分析】 • 計算數值數列的加總是用到累計技巧,只要設定一個要累計的變數,例如xsum,然後利用迴圈控制累計變數,每次加上正確的值。 • 【流程】 • 1.設定加總變數為xsum。 • 2.設計一個從1執行到100的迴圈,迴圈變數設定為i。 • 3.迴圈中做累加計算,程式為xsum = xsum + i
程式和說明 • 【程式】 • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 For i=1 To 100 • 5 xsum=xsum+i • 6 Next i • 7 Print ”1加到100總和=”;xsum • 8 End Sub • 【說明】 • 這是一個最簡單的加總計算模式,程式如下:xsum = xsum + i
【題目2】CH08-13 • 若將100設定為變數n,則上述程式可以計算1到n的總和,程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 : n=100 • 4 For i=1 To n • 5 xsum=xsum+i • 6 Next i • 7 Print “1加到100總和=”;xsum • 8 End Sub
【題目3】CH08-14 • 若起始值1也設定成變數xstart,終止值設定為xend,且xstart和xend由鍵盤輸入,則可以設計出計算xstart到xend的總和,例如輸入xstart=2,xend=7,則程式xsum=2+3+4+5+6+7=27,程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 xstart=InputBox(“輸入起始值”) • 5 xend=InputBox(“輸入終止值”) • 6 For i=xstart To xend • 7 xsum=xsum+i • 8 Next i • 9 Print “總和=”;xsum • 10 End Sub
8-4-3 範例3:求數列的偶數和 8-4-3 範例3:求數列的偶數和 • 【題目1】CH08-15 • 計算1到100的偶數和。 • 【分析】 • 計算數值數列的偶數加總會用到累計技巧,只要設定一個要累計的變數xsum,再控制迴圈的變數值的變化,且每次迴圈執行時,都將變數值加到累計變數中。 • 【流程】 • 1.設定加總變數為xsum。 • 2.設計一個可執行2到100的迴圈,且每次間隔值2,即迴圈變數出現奇數2,4,6,8,10……100。 • 3.迴圈中做累加計算,程式為xsum = xsum + i
程式和說明 • 【程式】 • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 For i=2 To 100 Step 2 • 5 xsum=xsum+i • 6 Next i • 7 Print “總和=”;xsum • 8 End Sub • 【說明】 • 此程式和範例2相似,只是此程式多了上間隔值2,控制迴圈指標變數只出現2,4,6,8,10.....。
【題目2】CH08-16 • 若要計算1到100的奇數和,則只要將起始值改為1,其餘程式皆不變。程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 For i=1 To 100 Step 2 • 5 xsum=xsum+i • 6 Next i • 7 Print “xsum=”;xsum • 8 End Sub
【題目3】CH08-17 • 若要計算某個倍數數列的和,例如1到1000中5,10,15,20...等5的倍數數值之和時,只要改變間隔值為5,且起始值是第一個5的倍數即可。程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 For I=5 To 1000 Step 5 • 5 xsum=xsum+i • 6 Next i • 7 Print “總和=”;xsum • 8 End Sub
【題目4】CH08-18 • 若要設計一個可以計算任何數字範圍,及任何數值倍數的程式時,可由InputBox輸入起始值、終止值和倍數數字。此程式較困難的一點是要由輸入的值,找出正確的起始值,才能套用上述程式模式,這個程式可參考範例CH08-10(找出比某數值大,且為另一數值的倍數)。程式如下: • 1 Private Sub Form_Activate() • 2 Form1.Font.Size=20 • 3 xsum=0 • 4 xstart=InputBox(“輸入起始值”) • 5 xend=InputBox(“輸入終止值”) • 6 xmul=InputBox(“輸入倍數值”) • 7 xstart=xmul*(Int(xstart/xmul)+1) • 8 For i=xstart To xend Step xmul • 9 xsum=xsum+i • 10 Next i • 11 Print “總和=”;xsum • 12 End Sub
8-4-4 範例4:用雙層迴圈輸出文字圖形 8-4-4 範例4:用雙層迴圈輸出文字圖形 • 【題目1】CH08-19 • 試設計一程式,可以印出下列圖形。 @ @@ @@@ @@@@ @@@@@ • 【程式】 • Private Sub Form_Activate( ) • Form1.Font.Size=20 • For I = 1 To 5 • For J = 1 To I • Print “@”; • Next J • Print • Next I • End Sub
【題目2】CH08-20 • 【題目】 • 試設計一程式,可以印出下列圖形。 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ • 【程式】 • Private Sub Form_Activate( ) • Form1.Font.Size=20 • For I = 5 To 1 Step -1 • Print Spc(I); • Next J • Print • Next I • End Sub
【題目2】CH08-20(續) • 【說明】 • 1.同樣地若欲顯示N行,可以將外圈的For I=5 To 1 Step -1 中的5改為N,而內圈的For J = 1 To 6-I 中的6更改為N-1即可。 • 2.若將Print Spc(I) 改成Print Spc(I+P),則整個圖樣會右移P個位置。
8-4-5 範例5:計算樂透彩的頭彩機率 8-4-5 範例5:計算樂透彩的頭彩機率 • 【題目】CH08-21 • 先算出42個號碼選6個的所有組合數(令其為X),中頭彩是6個號碼全中,即在所有的組合數中只有1個是頭彩,所以中頭彩機率是1/X。 • 42個號碼選6個的所有組合數=42!/(6!*36!)=(42*41*40*39*38*37)/(1*2*3*4*5*6) • 【程式】 • Rem 計算樂透彩的所有組合數 • Rem 組合數=(42*41*40*39*38*37)/(1*2*3*4*5*6) • Rem 令 XFACT=(42*41*40*39*38*37) • Rem 令 YFACT=(1*2*3*4*5*6) • Rem 令XNO=XFACT/YFACT,輸出XNO,機率即是1/XNO • Private Sub Form_Activate( ) • Dim XFACT,YFACT,XNO AS Single
程式(續) • Form1.Font.Size=16 • XFACT=1 : YFACT=1 : XNO=0 • For I=42 To 37 Step –1 • XFACT=XFACT*I • Next I • For I=1 To 6 • YFACT=YFACT*I • Next I • XNO=XFACT/YFACT • Print “樂透彩的所有組合數=”;XNO • Print “樂透彩的頭彩機率=”;1/XNO • End Sub
說明 • 【說明】 • 1.程式執行結果如下圖: • 2.計算(42*41*40*39*38*37)的值可以用遞減迴圈來處理,控制索引變數從42到37,間隔值是-1。For I=42 To 37 Step –1 XFACT=XFACT*INext I
Chapter 8 學習評量 本章結束! 要記得做學習評量哦!