Chapter 流程控制 本章重點 3.1 選擇結構 3.2 重複結構 3.3 實例 - 猜數字遊戲 3.4 習題
程式設計經典 3.1 選擇結構 學習程式語言首先熟悉如何宣告各變數的資料型別後, 接著便要熟悉該程式語言各敘述的語法, 其中用來設計輸入介面的輸出入敘述和控制程式的流程控制敘述是最基本的語法, 靈活使用這些敘述便可寫出簡單的程式出來 至於一個控制程式流程是由循序 選擇和重複三者敘述組合而成 循序結構的特性是敘述由上而下逐行地執行 選擇結構是當程式執行時, 欲改變程式執行的順序時使用 重複結構俗稱迴圈 (Loop), 當程式中有某個敘述區塊需要重複執行時使用 因此, 欲設計出一個具有結構化的程式, 除了必須具有清晰的邏輯分析能力外, 必須配合上面所述的三種結構才能達成 選擇結構 是當程式執行時, 因需要必須改變執行的流程, 就必須使用條件來做判斷, 若滿足條件 ( 即結果為 True) 則執行某個敘述區段 A, 若不滿足條件 ( 即結果為 False) 則執行另一個敘述區段 B 敘述區段完畢都會回到同一終點處繼續往下執行 本節將介紹 VB 2008 所提供的各種選擇敘述 3.1.1 If Then Else 敘述 設計程式時, 常會碰到 若... 則 此種情況便需用到語法 1 的 If... Then ; 碰到 若... 則... 否則... 此種情況便需用到語法 2 的 If... Then... Else 敘述來完成 語法 1: If (condition) Then [Then 敘述區段 ] End If 語法 2: If (condition) Then [Then 敘述區段 ] Else [Else 敘述區段 ] End If 3-2
流程控制 說明 1. 語法 1 若滿足條件 (condition) 就執行 Then 敘述區段, 不滿足時, 都不做任何事是屬於單一選擇 2. 語法 2, 若滿足條件 (condition) 就執行 Then 敘述區段, 不滿足條件就執行 Else 敘述區段 此種屬於雙向選擇 ; 至於其中條件 (condition) 可為關係運算式 或是多個關係運算式中間用邏輯運算子連起來所組成的邏輯運算式 [ 例 ] 下面寫法用來判斷分數 score 是否大於等於 60, 若成立則印出 Pass! ; 否則印出 Down! 假設 score 初值為 54, 在 If 的判斷中 score 大於等於 60 並不成立, 所以會執行 Else 下面的敘述區段, 印出 Down! 訊息 Dim score As Integer = 54 宣告 score 整數變數並給予初值 54 If score >= 60 Then 判斷 score 是否大於等於 60 Console.WriteLine("Pass!") 此行敘述不執行 Else Console.WriteLine("Down!") 結果印出 分數不及格 End If 範例試用雙向選擇敘述練習由鍵盤輸入帳號和密碼 假設帳號為 gotop 且密碼為 5168 : 若輸入的帳號與密碼兩者都正確, 顯示 Pass... ; 若輸入的帳號與密碼其中之一不正確, 顯示 No Pass... 3-3
程式設計經典 輸出入介面 程式碼 FileName:ConsolePwd.sln 01 Module Module1 02 03 Sub Main() 04 Dim password, userid As String 05 Console.Write(" 請輸入帳號 :") 06 userid = Console.ReadLine ' 輸入的資料指定給 userid 變數 07 Console.Write(" 請輸入密碼 :") 08 password = Console.ReadLine() ' 輸入的資料指定給 password 變數 09 Console.WriteLine() 10 ' 判斷 userid 是否為 "gotop" 且 password 是否為 5168 11 If userid = "gotop" And password = "5168" Then 12 Console.WriteLine("Pass...") 13 Else 14 Console.WriteLine("No Pass...") 15 End If 16 Console.ReadLine() ' 藉等待由鍵盤輸入資料, 以方便觀看執行結果 17 End Sub 18 19 End Module 3.1.2 If Then ElseIf 多項選擇敘述 設計程式時, 若碰到 若... 則... 否則若 則... 否則..., 此種情形便需使用到 If... Then... ElseIf... Then... Else... 敘述來完成 如下面語法, 若 condition1 的結果為 True, 則執行 Then 敘述區段 1, 接著繼續執行接在 End If 後面的敘述 ; 若 3-4
流程控制 condition1 的結果為 False, 則檢查 condition2 的結果, 若為 True 則執行 ElseIf 敘述區段 2, 接著繼續執行接在 End If 後面的敘述 若所有的 condtion( 條件 ) 都不滿足時, 才執行接在 Else 後面的 Else 敘述區段 : 語法 :If (condition1) Then [Then 敘述區段 1] ElseIf (condition2) Then [ElseIf 敘述區段 2] ElseIf (condition3) Then [ElseIf 敘述區段 3] Else [Else 敘述區段 ] End If 範例 試使用多項選擇敘述, 由鍵盤輸入信用卡的前兩位數字做下列判斷 : 若為 03, 顯示 " 聯合信用卡 " 若為 35, 顯示 "JCB 信用卡 " 若為 45, 顯示 "VISA 信用卡 " 若為 54, 顯示 "MASTER 信用卡 " 其他顯示 " 非商業用的信用卡 " 輸出入介面 3-5
程式設計經典 程式碼 FileName:ConsoleCreditCard.sln 01 Module Module1 02 03 Sub Main() 04 Dim type, bank As String 05 Console.Write(" 請輸入信用卡最前面兩位數字 :") 06 type = Console.ReadLine() 07 If type = "03" Then 08 bank = " 聯合信用卡 " 09 ElseIf type = "35" Then 10 bank = "JCB 信用卡 " 11 ElseIf type = "45" Then 12 bank = "VISA 信用卡 " 13 ElseIf type = "54" Then 14 bank = "MASTER 信用卡 " 15 Else 16 bank = " 非商業用的信用卡 " 17 End If 18 Console.WriteLine(" 你是持 " & bank) 19 Console.Read() 20 End Sub 21 22 End Module 3.1.3 Select Case 敘述 程式設計時若碰到有多向選擇時, 當然您可使用上一節的 If Then ElseIf 或巢狀的 If Then Else 來完成, 但是太多的 If 會使得程式的複雜度提高, 造成不易閱讀且難維護 ; 若改用下面的 Select Case 敘述程式不但看起來簡潔且易維護 如下面語法, 若 expression 的結果滿足 value1, 則執行接在 Case value1 後面的敘述區段後, 便繼續執行接在 End Select 後面的敘述 ; 若 expression 不滿足 value1, 但滿足 value2, 則執行接在 Case value2 後面的敘述區段, 以此類推下去 ; 若都不滿足所設定的 Case value 值, 便執行接在 Case Else 後面的敘述區段後, 離開 End Select 繼續往下執行下去 其語法如下 : 3-6
流程控制 語法 :Select Case expression Case value1 [Statements for value1] Case value2 [Statements for value2] Case Else [Statements for Else] End Select 說明 expression 可以為變數 數值或字串運算式 但要注意 Case 子句中的 Value 必須和 expression 的資料型別要一致 Case 子句允許使用下列方式來設定 value 值 : Case 1,2,6 to 8 只要 expression 的結果為 1,2,6,7,8 便正確 Case Is <= 20 只要 expression 的結果小於等於 20 便正確 Case a, A, K 只要 expression 的結果為 a,a,k 便正確 Case a To z 只要 expression 的結果為 a~z 便正確 範例試用 Select 選擇敘述的 Case 子句, 由鍵盤輸入一個字元, 判斷輸入的字元是否為大寫字母 小寫字母或是阿拉伯數字 若符合上述條件, 分別顯示對應的各類訊息 ; 若不屬於前面三者, 則顯示 " 非文數字資料 " 輸出入介面 3-7
程式設計經典 程式碼 FileName:ConsoleFilter.sln 01 Module Module1 02 03 Sub Main() 04 Dim mycheck As Char, str1 As String 05 Console.Write(" 請輸入一字元 :") 06 mycheck = Console.ReadLine() 07 Select Case mycheck ' 此處 mycheck 可以為數值 字串 運算式 08 Case "A" To "Z" 09 str1 = " 大寫字母 " 10 Case "a" To "z" 11 str1 = " 小寫字母 " 12 Case "0" To "9" 13 str1 = " 阿拉伯數字 " 14 Case Else 15 str1 = " 非文數字資料 " 16 End Select 17 Console.WriteLine(" 你輸入的字元是屬於 : {0}", str1) 18 Console.Read() 19 End Sub 20 21 End Module 範例試用 Select 選擇敘述的 Case 子句做數值判斷, 由鍵盤輸入你是民國多少年出生? 若你的年紀小於 14 歲, 則顯示 " 兒童 "; 若年紀介於 14~17 歲, 則顯示 " 青少年 "; 若年紀介於 18~30 歲, 則顯示 " 青年 "; 若年紀介於 31~45 歲, 則顯示 " 壯年 "; 若年紀 46~60 歲, 則顯示 " 中年 "; 若年紀大於 61 歲, 則顯示 " 老年 " 3-8
流程控制 輸出入介面 程式碼 FileName:ConsoleAge.sln 01 Module Module1 02 03 Sub Main() 04 Dim birthyear, age As Integer, str1 As String 05 Console.Write(" 請輸入你出生的年份 ( 民國 ) : ") 06 birthyear = Console.ReadLine() 07 age = Year(Now) - 1911 - birthyear 08 Select Case age ' 此處可以為運算式或變數 09 Case Is < 14 ' 年齡小於 14, 執行下一敘述後, 便跳出 End Select 10 str1 = " 兒童 " 11 Case 14, 15, 16, 17 ' 年齡 14-17, 執行下一敘述後, 便跳出 End Select 12 str1 = " 青少年 " 13 Case 18 To 30 ' 年齡 18-30, 執行下一敘述後, 便跳出 End Select 14 str1 = " 青年 " 15 Case 31 To 45 ' 年齡 31-45, 執行下一敘述後, 便跳出 End Select 16 str1 = " 壯年 " 17 Case 46 To 60 ' 年齡 46-60, 執行下一敘述後, 便跳出 End Select 18 str1 = " 中年 " 19 Case Else ' 年齡大於 60, 執行下一敘述後, 便跳出 End Select 20 str1 = " 老年 " 21 End Select 22 Console.WriteLine(" 你的年齡 : {0} 歲, 是處於 {1} 時期 ", age, str1) 23 Console.Read() ' 藉等待由鍵盤輸入資料, 以方便看執行結果 24 End Sub 25 26 End Module 3-9
程式設計經典 說明 Now 可取得目前的西元的日期時間,Year() 函式可取得日期的年份, 因此 Year(Now) 可取得目前的西元年份 因此第 7 行敘述可依據使用者輸入的民國年份來求出使用者年齡 3.1.4 IIf 函式 IIF 是一個雙重選擇函式, 如下面語法, 若 Expression 運算式的結果為 True, 則傳回 V1, 否則傳回 V2 傳回值可以為數值 字串或運算式 IIf 函式裡面若還有 IIf 函式就構成 巢狀選擇結構 其語法如下 : 語法 :IIf(Expression, V1, V2) [ 例 ] 試以 IIF() 函式判斷, 若平均成績 (avg) 小於 60, 顯示 不及格, 否則顯示 及格 將訊息置入 msg 字串變數 msg = IIF (avg<60, 不及格, 及格 ) 或 msg = IIF (avg>=60, 及格, 不及格 ) [ 例 ] 使用巢狀 IIF() 函式, 按照年度所得 (income) 取得各級稅率 (TaxRate): 1 若 income < 100 萬元, 稅率 15% 2 若 100 萬 income < 200 萬, 稅率 20% 3 若 income 200 萬, 稅率 40% 寫法 : income< 100 income 100 TaxRate = IIf ( income<100, 0.15, IIf (income<200,0.2, 0.4) ) 3-10 100 income<200 income 200
流程控制 結果 ( 參考範例 ConsoleIIf.sln) 3.1.5 Switch 函式 Switch 是一個多重選擇函式, 當選項不多而且必須將對應的結果 ( 資料型別不拘 ) 傳回時使用 其語法如下, 首先檢查是否滿足 Expression1 運算式, 若結果為 True, 則傳回 V1, 若結果為 False, 檢查是否滿足 Expression2, 若結果為 True, 則傳回 V2, 其他依此類推 此函式中的傳回值 V1,V2 Vn 允許傳回不同資料型別的資料 若所有運算式都不滿足時, 傳回 Nothing 值 ( 無對應值 ) 要注意由於 Switch 函式是放在 Microsoft.VisualBasic 命名空間 (NameSpace) 中, 因此使用該函式時必須在 Switch 前面加上 Microsoft.VisualBasic. : 語法 : Microsoft.VisualBasic.Switch ( Expression1, V1[, Expression2,_ V2, [,ExpressionN, Vn]]) [ 簡例 ] 試使用 Switch 多重選擇敘述, 由鍵盤輸入信用卡最前面兩位數字置入 no 整數變數中, 判斷信用卡的種類 將輸出訊息置入 str1 字串變數其分類如下 : 03 聯合信用卡 35 JCB 信用卡 45 VISA 信用卡 54 MASTER 信用卡 3-11
程式設計經典 寫法 : no = Console.ReadLine() str1 = Microsoft.VisualBasic.Switch(no=3," 聯合 ", no=35, "JCB", _ no=45,"visa", no=54,"master", no<>0 Or no=0, " 非商業 ") Console.WriteLine(" 你是使用 {0} 信用卡 ", str1) 結果 (FileName:ConsoleSwitch.sln) 3.1.6 Choose 函式 Choose 函式和 Switch 函式都是用來做數量少的選項, 彼此間的差異處是 Switch 函式每個選項都條件運算式, 運算式的結果只能為 True 或 False, 至於 Choose 函式只有一個數值運算式或數值變數, 此 Expression 運算式放在函式名稱後面的第一個引數 如下面 Choose 語法, 若該運算式或變數結果為 1 時, 則傳回 V1; 若結果為 2, 則傳回 V2, 其他依此類推 此函式中的傳回值 V1,V2 Vn 允許傳回不同資料型別的資料 若運算式或變數的結果小於 1 或大於 n 時, 則傳回 Nothing 值 ( 無對應值 ) 語法 :Choose(Expression, V1 [, V2, [,Vn]]) 範例延續上例使用 Choose() 函式, 由選項選擇你的信用卡最前面兩位數字屬於哪一類, 電腦自動告知是屬於哪家公司的信用卡 分類如下 : 03 聯合信用卡 35 JCB 信用卡 45 VISA 信用卡 54 MASTER 信用卡 3-12
流程控制 輸出入介面 程式碼 FileName:ConsoleChoose.sln 01 Module Module1 02 03 Sub Main() 04 Dim str1 As String, choice As Integer 05 Console.WriteLine(" 請問你的信用卡號碼最前面兩位數是 : ") 06 Console.WriteLine(" 1. 03 開頭 ") 07 Console.WriteLine(" 2. 35 開頭 ") 08 Console.WriteLine(" 3. 45 開頭 ") 09 Console.WriteLine(" 4. 54 開頭 ") 10 Console.Write(" 請選擇 : ") 11 choice = Console.ReadLine() 12 If choice >= 1 And choice <= 4 Then 13 str1 = Choose(choice, " 聯合 ", "JCB", "VISA", "Master") 14 Else 15 str1 = " 非商業 " 16 End If 17 Console.WriteLine(" 你是使用 {0} 信用卡 ", str1) 18 Console.Read() ' 藉等待由鍵盤輸入資料, 以方便看執行結果 19 End Sub 20 21 End Module 3-13
程式設計經典 3.2 重複結構 當程式執行時, 需要將某個敘述區段執行多次時, 便需要使用 重複結構 VB 2008 所提供的重複結構敘述, 按照重複執行次數確定與否分成 For...Next 敘述 ( 每次執行重複次數確定 ) 和 Do... 敘述 ( 次數由當時條件決定 ) 兩大類 : 3.2.1 For Next 敘述 程式設計時, 若希望由某個值開始, 每執行指定的敘述區段一次, 便將該數值做增 ( 減 ) 一次, 若結果還比終值小 ( 大 ), 便繼續執行該敘述區段, 一直到不滿足終值才離開該敘述區段 譬如重複顯示某個文數字十次, 連續輸入資料到陣列等都必須使用下面語法來完成 : 語法 :For counter = start To end [Step Increment] Statements [Exit For] Statements Next For 說明 1. 若 start < end, 則 Increment 為正 若 Incremnet=1 則 Step 參數可省略 2. 若 start> end, 則 Step 不能省略, 且 Increment 為負值 3. Start 和 End 參數可以為小數 [ 例 1] 下面簡例使用 For 迴圈印出 1 2 3 4 5 ( 表示空白 ) Dim i As Integer For i=1 To 5 Console.Write( {0}, i) Next 宣告計數整數變數 i 3-14
流程控制 [ 例 2] 下面簡例使用 For 迴圈印出 5 4 3 2 1 Dim i As Integer For i=5 To 1 Step -1 Console.Write( {0}, i) Next 宣告計數整數變數 i [ 例 3] 下面簡例使用 For 迴圈印出 5 4 Dim i As Integer 宣告計數整數變數 i For i=5 To 1 Step -1 If i=3 Then 若 i 等於 3 時則執行 Exit For 敘述 Exit For 離開 For 迴圈 End If Console.Write( {0}, i) Next 範例由鍵盤輸入四個字元的密碼, 密碼為 "ymca" : 若輸入的密碼正確, 則顯示 "Login 成功, 歡迎進入本系統 ", 再離開 For 迴圈 若密碼錯誤, 最多允許連續輸入三次, 若三次都錯誤, 則顯示 " 密碼錯誤, 無法進入!" 輸出入介面 3-15
程式設計經典 程式碼 FileName:ConsoleFor.sln 01 Module Module1 02 03 Sub Main() 04 Dim str1 As String 05 Dim count As Integer 06 For count = 1 To 3 Step 1 07 Console.Write(" 請輸入密碼 ( 四個字元 ):") 08 str1 = Console.ReadLine() 09 If (str1 = "ymca") Then 10 Exit For 11 Else 12 Console.WriteLine(" 密碼錯誤, 無法進入!") 13 End If 14 Next 15 Console.WriteLine() 16 If str1 = "ymca" Then 17 Console.WriteLine("Login 成功, 歡迎進入本系統 ") 18 Else 19 Console.WriteLine(" 非法進入...!") 20 End If 21 Console.Read() ' 等待由鍵盤輸入資料, 以方便看執行結果 22 End Sub 23 End Module For Next 常用在有規律性可循多水平列資料顯示上, 此種模式必須使用巢狀迴圈, 即 For... Next 裡面還有 For...Next, 迴圈彼此不交叉有如巢狀般, 其寫法如下示 : For i=1 to 5 For k=1 to 5 Next Next 3-16
流程控制 [ 例 1] 練習使用巢狀迴圈完成右圖資料顯示 1. i=1 ( 第 1 列 ) k=1~1( 第 k 欄 ) 印 k 值 2. i=2 ( 第 2 列 ) k=1~2( 第 k 欄 ) 印 k 值 3. i=3 ( 第 3 列 ) k=1~3( 第 k 欄 ) 印 k 值 4. i=4 ( 第 4 列 ) k=1~4( 第 k 欄 ) 印 k 值 5. i=5 ( 第 5 列 ) k=1~5( 第 k 欄 ) 印 k 值 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 程式寫法 : For i = 1 To 5 代表水平列 For k = 1 To i 代表垂直欄 Console.Write(" {0}", k) ' 游標停在同一列 Next Console.WriteLine() ' 強迫換列 Next 結果 (FileName:ConsoleNestFor.sln) 3.2.2 Do While. Loop 敘述 設計程式時, 希望當條件 (condition) 為 True 時才進入迴圈, 執行迴圈內的敘述區段一直碰到 Loop 再回到 Do While, 檢查是否滿足條件 (condition), 若滿足繼續執行迴圈內的敘述區段, 一直到不滿足才跳離迴圈繼續執行接在 Loop 後面的敘述 因此, 迴圈內必須有敘述將條件 (conditon) 變為 False, 否則會變成無窮迴圈而無法跳出 欲中途離開迴圈可在欲離開的地方插入 Exit Do 即可 此種語法為前測式迴圈, 其語法如下 : 3-17
程式設計經典 語法 :Do While (condition) [Exit Do] Loop 範例 輸入一個整數 n, 並列出 1 到 100 之間可以被 n 整除的整數, 每一列顯示五個整數並統計有多少個整數能被 n 整除 輸出入介面 程式碼 FileName:ConsoleDoWhile.sln 01 Module Module1 02 03 Sub Main() 04 Dim n, sum, i As Integer 05 Console.WriteLine(" = 求 1 到 100 可以被 n 整除的整數 =") 06 Console.WriteLine() 07 Console.Write(" 請輸入 1 到 100 的整數 n:") 08 n = Console.ReadLine 09 If n >= 1 And n <= 100 Then 10 Do While sum + n <= 100 3-18
流程控制 11 sum += n 12 Console.Write(" {0},", sum) 13 i += 1 14 If i Mod 5 = 0 Then 15 Console.WriteLine() 16 End If 17 Loop 18 Console.WriteLine() 19 Console.WriteLine(" 由 1 到 100 有 {0} 個整數可以被 {1} 整除! ", i, n) 20 Else 21 Console.WriteLine(" 輸入的資料錯誤!@_@") 22 End If 23 Console.ReadLine() 24 End Sub 25 26 End Module 說明 1. 第 4 行 : 宣告 n sum i 為整數變數 i 用來累計迴圈執行的次數 ;n 表示為輸入數字 ;sum 用來作為累加的總和, 用來表示可以被輸入數字 n 整除的整數 2. 第 9 行 : 當輸入的數字在 1~100 之間, 才執行第 10-19 行, 否則執行第 21 行顯示提示文字 3. 第 10 行 : 當累計的數 sum 加上輸入的數 n 還小於等於 100 時, 才執行累計的 while 迴圈敘述 4. 第 11 行 : 執行累計, 目前 sum 加上輸入的數 n 5. 第 12 行 : 印出每次可以被輸入數字 n 整除的整數 6. 第 13 行 : 將 i( 迴圈執行次數 ) 加 1 7. 第 14-16 行 : 每行印 5 個數字 8. 第 19 行 : 印出 1~100 之間有幾個整數可以被輸入數 n 所整除 3-19
程式設計經典 3.2.3 Do. Loop While 敘述 程式中使用迴圈時, 若需要第一次進入迴圈時不必檢查是否滿足條件, 直接進入迴圈, 第二次以後才需要檢查是否滿足條件, 若條件 (Condition) 為 True 時, 才能再進入迴圈執行, 此時便需要使用 Do...Loop While 敘述 因此此種情況, 迴圈至少執行一次, 是屬於 後測式迴圈 其語法如下 : 語法 :Do Statements [Exit Do] Statements Loop While (condition) 範例 利用 Do...Loop While 顯示計算進入迴圈的次數,ch 使用 Or 運算子判斷是否繼續進入迴圈, 若按 Y 或 y 繼續進入迴圈 ; 其它按鍵則離開迴圈 ch 為字元變數, 用來當做判斷是否繼續進入迴圈 count 用來存放進入迴圈的次數 輸出入介面 程式碼 FileName:ConsoleDoLoopWhile.sln 01 Module Module1 02 03 Sub Main() 3-20
流程控制 04 Dim ch As Char 05 Dim count As Integer = 0 06 Do 07 count += 1 08 Console.WriteLine(" 第 {0} 次進入迴圈 ", count) 09 Console.Write(" 是否繼續 (Y/N)?") 10 ch = Console.ReadLine() 11 Console.WriteLine() 12 Loop While (ch = "y" Or ch = "Y") 13 Console.WriteLine(" 已離開迴圈! ") 14 Console.Read() 15 End Sub 16 17 End Module 3.2.4 Do Until. Loop 敘述 此敘述和 Do While...Loop 敘述都屬於前測式迴圈, 兩者使用上的差異在於, 若不滿足條件才進入迴圈時, 必須使用 Do Until Loop; 若滿足條件才進入迴圈時, 才使用 Do While Loop Do Until Loop 語法如下 : 語法 :Do Until(condition) Statements [Exit Do] Statements Loop 3.2.5 Do Loop Until 敘述 此敘述和 Do...Loop While 敘述都屬於後測式迴圈, 兩者使用上的差異在於, 若不滿足條件才進入迴圈時, 必須使用 Do Loop Until 若滿足條件才進入迴圈時, 才使用 Do Loop While Do Loop Until 語法如下 : 3-21
程式設計經典 語法 :Do Statements [Exit Do] Statements Loop Until (condition) 範例由鍵盤鍵入一個正整數放入 num 整數變數中, 透過 Do...Loop Until 來檢查輸入的數值是否大於等於 1, 若 num 沒有大於等於 1, 便一直在迴圈中等到輸入的數值 num 大於等於 1 符合條件為止才離開此迴圈 接著使用 Do Until Loop 來求該數值的階乘, 將計算的結果存入 factorial 整數變數內, 最後再顯示其結果 輸出入介面 程式碼 FileName:ConsoleDoUntil.sln 01 Module Module1 02 03 Sub Main() 04 Dim str1 As String 05 Dim num, factorial As Integer 06 factorial = 1 07 Do 08 Console.Write(" 請輸入階乘數 ( 正整數 ):") 09 num = Console.ReadLine() 10 Loop Until (num >= 1) 11 str1 = num.tostring 12 Do Until (num < 1) 13 factorial *= num 3-22
流程控制 14 num -= 1 15 Loop 16 Console.WriteLine("{0}! = {1}", str1, factorial) 17 Console.ReadLine() 18 End Sub 19 20 End Module 3.2.6 While End While 敘述 While End While 的功能和 Do While Loop 的功能相同, 當條件 (condition) 為 True 時才進入迴圈, 若為 False 才跳離迴圈繼續執行接在 End While 後面的敘述 欲中途離開迴圈可在欲離開的地方插入 Exit While 即可 此種語法為前測式迴圈, 其語法如下 : 語法 :While (condition) [Exit While] End While 3.2.7 Continue VB 2008 新增了 Continue, 當迴圈中碰到此敘述時會無條件跳至迴圈的條件式中繼續判斷是否可以進入迴圈 在 VB 2008 所提供的 For Next, Do Loop, While End While 迴圈中依序可使用 Continue For, Continue Do, Continue While 敘述 範例 由鍵盤輸入一個最上限值 (input), 並印出 1 + 2..+ n 小於等於 sum 的 n 值及 1+2+ n 的總和 (sum) 本例使用 Exit 和 Continue 陳述式 3-23
程式設計經典 輸出入介面 最上限值 程式碼 FileName:ConsoleContinue.sln 01 Module Module1 02 03 Sub Main() 04 Dim sum, n As Integer 05 sum = 0 06 n = 0 07 Console.Write(" 請輸入 1+2+...+n<=sum, sum 值 :") 08 Dim input As Integer = Console.ReadLine() 09 Do 10 n += 1 11 If (sum <= input) Then 判斷 sum 是否小於等於輸入的上限值 input 12 sum += n 13 Continue Do 跳到 Loop While 處判斷 n 是否大於 0 14 Else 15 sum -= n - 1 16 Exit Do 離開迴圈 17 End If 18 Loop While n > 0 19 Console.WriteLine("1+2...+{0} 等於 {1}", n - 2, sum) 20 Console.Read() 21 End Sub 22 23 End Module 說明 1. 第 8 行 : 輸入上限值並指定給 input 2. 第 9-18 行 : 求出 n 值及 sum 值 3. 第 19 行 : 印出結果 3-24
流程控制 3.3 實例 - 猜數字遊戲 實例 FileName:Guess.sln 製作猜數字遊戲 程式會先產生 1~99 之間的亂數當作被猜的數字, 執行過程中會提示您所猜的數字應該再大一點或再小一點, 並縮小猜的範圍, 若猜到正確的數字會印出 賓果! 猜對了, 答案是 xx 及 總共猜了 n 次 輸出入介面 分析 1. 若在程式直接設定初值當作被猜數字, 每次執行所猜的數字會一樣, 不具彈性, 為了使每次執行的猜數字能隨機, 可使用下面敘述來產生 1-99 之間的亂數 3-25
程式設計經典 Dim r As New Random guess = r.next(1, 100) ' 建立亂數物件 r ' 透過 Next 方法產生 1-99 之間的亂數並指定給 guess 2. 本例猜到正確的數字才結束程式的執行, 因此猜數字是否正確的程式必須撰寫在無窮迴圈中, 若要離開無窮迴圈可按 + 鍵結束程式的執 行 流程圖 count 0 次數 min 最小值 max 最大值 產生 1~99 亂數當被猜數, 置入 guess 變數中 提示 超出範圍 假 keyin 輸入值 count count+1 1 keyin 100? 真 顯示 已猜次數 和縮小猜的範圍 keyin>guess? 假 keyin<guess? 假 提示 賓果猜對了 顯示總共猜的次數 真 真 提示 再小ㄧ點 max keyin 提示 再大ㄧ點 min keyin 結束 3-26
流程控制 程式碼 FileName:Guess.sln 01 Module Module1 02 03 Sub Main() 04 Dim keyin, guess, count, min, max As Integer 05 count = 0 06 min = 0 07 max = 100 08 ' 建立亂數物件 r 09 Dim r As New Random 10 ' 透過亂數物件 r 的 Next 方法產生 1-99 之間的亂數並指定給 guess 11 guess = r.next(1, 100) 12 Console.WriteLine("======= 猜數字遊戲 =======") 13 Console.WriteLine() 14 Do 15 Console.Write(" 猜數子範圍 {0} <? < {1} :", min, max) 16 keyin = Val(Console.ReadLine) ' 透過 Val 將輸入的資料轉成數值 17 count += 1 18 If keyin >= 1 And keyin < 100 Then 19 If keyin = guess Then 20 Console.WriteLine(" 賓果! 猜對了, 答案是 {0}", guess) 21 Exit Do 22 ElseIf keyin > guess Then 23 max = keyin ' 將目前輸入的數字 keyin 指定給 max 24 Console.Write(" 再小一點!!") 25 ElseIf keyin < guess Then 26 min = keyin ' 將目前輸入的數字 keyin 指定給 min 27 Console.Write(" 再大一點!!") 28 End If 29 Console.WriteLine(" 您猜了 {0} 次 ", count) 30 Console.WriteLine() 31 Else 32 Console.WriteLine(" 請輸入提示範圍內的數字!") 33 End If 34 Loop While True 35 Console.ReadLine() 36 End Sub 37 38 End Module 3-27
程式設計經典 說明 1. 第 4 行 : 宣告 keyin 表示使用者所猜的數字 ;guess 用來存放電腦產生的亂數 ;count 是使用者猜數字的次數 ;min 為猜數字的最小值 ;max 為猜數字的最大值 2. 第 9,11 行 : 產生 1-99 之間的亂數並指定給 guess 3. 第 14-34 行 : 為無窮迴圈, 是猜數字遊戲的主程式 4. 第 16 行 : 使用者輸入的數字會指定給 keyin 5. 第 18 行 : 判斷 keyin 是否介於 1~99 之間, 若成立則執行第 19-30 行, 否則執行第 32 行 6. 第 19 行 : 判斷 keyin 是否等於 guess, 若成立則執行第 20,21 行顯示猜對了的相關訊息並離開迴圈 7. 第 22 行 : 判斷 keyin 是否大於 guess, 若成立則執行第 23,24 行顯示再小一點訊息 8. 第 25 行 : 判斷 keyin 是否小於 guess, 若成立則執行第 26,27 行, 顯示再大一點訊息 3.4 習題 一. 選擇題 1. a=18 : b=19, 則執行 a==b 會傳回? (1) True (2) False (3) 1 (4) 0 2. 使用 Select 敘述時, 假如所有的 Case 不滿足的話, 可以使用什麼保留字來處理其他情形 (1) IIf (2) Else (3) Case Else (4) End If 3-28
流程控制 3. 下列何者不是 VB 選擇結構的敘述? (1) If Then Else (2) IIf (3) switch (4) Select Case 4. Dim score As Integer score=57 Console.Write( {0}, IIf(score>=60, 當掉, 過關 )) 結果印出? (1) 當掉 (2) 過關 5. Dim price As Integer=200 Console.Write("{0}", IIf(price<100," 便宜 ",IIf( price < 150," 可接受 "," 好貴 "))) 請問上述程式會顯示什麼訊息? (1) 便宜 (2) 可接受 (3) 好貴 (4) 程式當掉 6. Dim price As Integer=140 Console.Write("{0}", IIf(price<100," 便宜 ",IIf( price < 150," 可接受 "," 好貴 "))) 請問上述程式會顯示什麼訊息? (1) 便宜 (2) 可接受 (3) 好貴 (4) 程式當掉 7. Dim r As Random Dim n As Integer = r.next(5, 99) 請問上述 n 值為何? (1) 1~100 (2) 5-99 (3) 5-98 (4) 5-100 8. 下例何者不是 VB 的重複結構? (1) For (2) While End While (3) Do while Loop (4) If 9. 下列哪種迴圈敘述最少會執行一次? (1) For (2) Do Loop While (3)Select (4) Do While Loop 3-29
程式設計經典 10. 下列哪種迴圈敘述最少連一次都不會執行? (1) For (2) Do Loop While (3)Select (4) Do While Loop 11. 可使用哪一個敘述用來跳離無窮迴圈? (1) Continue (2) break (3) Do (4) Exit 12. For i As Integer=-5 To 10, 請問這個 for 迴圈做幾次? (1) 14 次 (2) 15 次 (3) 16 次 (4) 17 次 13. 在 For Do While Loop Do Loop While 迴圈內, 執行到哪個敘述, 會再重新回到迴圈的開始, 並判斷迴圈的條件運算式 (1) Continue (2) break (3) If (4) Exit 14. Dim i As Integer=5 Do While i>5 i+=1 Loop 請問這個迴圈會執行幾次 (1) 0 次 (2) 1 次 (3) 2 次 (4) 無窮迴圈 15. Dim i As Integer=5 Do While True i+=1 Loop 請問這個迴圈會執行幾次 (1) 0 次 (2) 1 次 (3) 2 次 (4) 無窮迴圈 3-30
流程控制 二. 程式設計 1. 輸入一個成績, 依據成績高低, 給予下列不同評語 1 90-100: 太強了 2 80-89: 表現不錯 3 70-79: 再加油, 再加油 4 60-69: 剛好及格 5 其他或是 0-59: 準備被當吧 2. 使用巢狀的重複結構印出九九乘法表 3. 印出 1-1000 的質數 ( 只能被 1 和自己本身的數所整除的數即是質數 ) 4. 透過 Do While...Loop 由鍵盤輸入一個符號放入 symbol 字串變數內, 以及將重複顯示的次數放入 count 整數變數 輸入完畢透過 For...Next 將鍵入的符號做 count 次合併放入 str1 變數後, 再將合併結果顯示出來, 接著會詢問是否繼續? 若按 Y 或 y 便繼續將新輸入的符號重複顯示指定的次數 ; 若按其他鍵, 便離開迴圈結束程式執行 結果如下圖 : 5. 輸入 A, B, C 三角形的三個邊長, 並判斷是何種三角形 1 A 2 =B 2 +C 2 為直角三角形 2 A 2 >B 2 +C 2 為純角三角形 3 A 2 <B 2 +C 2 為銳角三角形 3-31