1.34k likes | 1.46k Views
第 6 章. 流程控制 ─ 選擇性執行程式. 本章重點提要. 6-1 條件式:判斷真或假的運算式 6-2 If 敘述:選擇性執行 6-3 If() 運算子:依條件傳回不同的值 6-4 Select Case :依資料做多重選擇 6-5 做為選擇用的控制項. 本章閱讀建議. 『 流程控制 』 就是改變程式的執行流程 , 例如我們想依照使用者的性別 , 來決定要顯示 『XXX 先生 』 或 『XXX 小姐 』, 這時就可以使用 If 之類的敘述來加以判別 , 以決定要執行哪段程式。
E N D
第 6 章 流程控制 ─選擇性執行程式
本章重點提要 • 6-1 條件式:判斷真或假的運算式 • 6-2 If 敘述:選擇性執行 • 6-3 If() 運算子:依條件傳回不同的值 • 6-4 Select Case:依資料做多重選擇 • 6-5 做為選擇用的控制項
本章閱讀建議 • 『流程控制』就是改變程式的執行流程, 例如我們想依照使用者的性別, 來決定要顯示『XXX 先生』或『XXX 小姐』, 這時就可以使用 If 之類的敘述來加以判別, 以決定要執行哪段程式。 • 本章及下一章都會介紹流程控制, 讀者只要多看範例, 多跟著做, 就能完全學會。
本章閱讀建議 • 6-1 條件式:判斷真或假的運算式:它是由比較運算 (大於、小於...) 或邏輯運算 (且、或...) 所組成, 而運算的結果只有 2 種:True 或 False。這部分很容易, 只要有一點數學基礎就可以輕鬆過關。 • 6-2 If 敘述:選擇性執行:就是依照條件式的真假, 來決定要執行哪些程式。If 的觀念很簡單, 但在使用上有幾種變化,請讀者務必要熟悉這些用法。
本章閱讀建議 • 6-3 If() 運算子:依條件傳回不同的值:這是一種簡化的 If 敘述,讀者只要看看範例就能馬上學會。如果好好利用, 可讓您的程式更加簡潔有力喔! • 6-4 Select Case:依資料做多重選擇:如果對同一份資料要做許多的判斷, 例如依照各年齡層做不同的處理, 這時就可以改用Select Case 敘述, 讓程式更容易撰寫及閱讀。
本章閱讀建議 • 6-5 做為選擇用的控制項:包括『單選鈕』與『多選鈕』二種, 其用法就和考試的單選題與多選題類似。本節的範例比較有趣, 會搭配單選鈕、多選鈕來展示字體的變化 (包括改變字型、大小、粗體、斜體等), 千萬別錯過哦!
6-1 條件式:判斷真或假的運算式 • 在程式中我們經常要判斷真假, 例如在計算成績時, 如果成績小於60 分就評為 "不及格", 那麼『成績是否小於 60 分』就是一個條件式, 可以寫成如下的程式:
條件式:判斷真或假的運算式 • If...Then...Else...End If 是條件判斷敘述, 可依照條件式的真假來決定要執行哪一部份的程式。If 的用法我們留到下一節再介紹, 本節先來看看條件式的組成。條件式可由以下二種運算所組成, 而其運算的結果則是一個布林值 (True 或 False): • 比較運算:就是比較大小或比較是否相等, 例如 『a > 9』、『s = "ok"』 都是。 • 邏輯運算:就是『且 (And)』、『或 (Or)』之類的運算, 例如『a>1 And a<3』, 則必須二個子條件都成立, 即 a>1、a<3 都是 True, 那麼『且』的運算結果才會是 True。
比較運算 • 比較運算的結果會是一個布林值 (True 或 Fasle), 在 VB 中共有 6種比較運算子:
比較運算 • 請將以下條件寫成條件式: (1) 成績 (g) 大於或等於 90? (2) 價錢 (p) 不等於 100? (3) 年齡 (a) 不超過 18? (4) 優勝者 (w) 是 "Mary"? (5) 飛機 (時速:a) 比火車快 (時速:t)? (1) g >= 90 (2) p <> 100 (3) a <= 18 (4) w = "Mary" (5) a > t
字串與字串的比較 • 在上一章中, 我們介紹過字串是由『Unicode 編碼』的字元所組成, 因此在比較字串或字元時, 也是以 Unicode 編碼來比較。底下我們將一些常用的字元由小到大列出:
字串與字串的比較 • 接著我們來看實例: • 如果想知道字元的 U n i c o d e 編碼, 可使用 A s cW( ) 函式。例如AscW("0") = 48、 AscW("A") = 65、AscW("a") = 97、AscW("好")= 22909。
字串與字串的比較 • 在比較字串時, 會先比較字串中的第一個字元, 若相等就再比較第二個字元, 以此類推, 直到比出大小、或有一方先結束 (字串長度較短的視為比較小) 為止。下面比較的結果均為 True:
字串與字串的比較 • 請判斷下面各條件式的結果: (1) "abc" < "abC" (2) "100" > "50" (3) "Big" < "大" (4) "A112" > "A12" (5) "大家" < "大家好" (6) "A" = "A"c (7) "Flag" > "G"c (8) "flag" >= "Flag" (9) "3.14" <= "3.1415926"
字串與字串的比較 (1) False (2) False (因為字元"1"<"5") (3) True (4) False (5) True (6) True (字元 "A" c 會先轉為字串 "A" 再進行比較) (7) False (8) True (9) True
"100" > 50? • 字串與數值的比較時, 會優先將字串『自動型別轉換』為數值, 然後再做比較,例如: • "100" > 50 100 > 50 結果為 True • 不過『自動型別轉換』雖然方便, 但卻容易混淆, 因此建議讀者還是自行利用Val() 函式來轉換型別, 會比較保險一些。例如: • Val(s) > 50 '先將 s 轉換為數值, 再與 50 比較
日期與日期的比較 • 日期資料可包含『日期』與『時間』二部份, 在做比較時, 會先比較日期, 若相等則再比較時間。例如下面的條件式均為 True:
日期與日期的比較 • 如果只有日期沒有時間, 那麼時間就是最小的 #0:0:0#(凌晨, 也可寫成#12:00:00 AM# );如果只有時間沒有日期, 則日期為最小值#1/1/0001#。請再看以下的例子 (運算結果均為 True):
日期與日期的比較 • 請判斷下面各條件式的結果: (1) #2/2/2009 8:00# < #2/2/2008 9:00# (2) #02/02/2009# < #2/2/2009# (3) "02/02/2009" < "2/2/2009" (4) #8:00# = #8:00 AM# (5) #8:00# > #5/5/2008 7:00# (1) False (2) False (日期相同) (3) True (因為是字串的比較) (4) True (5) False
邏輯運算 • 邏輯運算是針對布林值 (True 或 False) 來做運算, 而運算的結果也是布林值。例如:
邏輯運算 • Not 是『不是』(相反) 的意思, 因此『不是 True』的結果, 就變成False 了。常用的『邏輯運算子』除了 Not 之外, 還有 And、Or、及 Xor 三種, 如下表所示:
邏輯運算 • 前 3 個邏輯運算子的意義, 就和我們口語的『不是、且、或』完全相同, 所以應該很容易理解;最後一個 Xor, 則是當 A 和 B 的邏輯值不相同 (恰好一真一假) 時才為真, 否則為假。下表將所有可能的運算組合與結果都列出來 (稱為真值表), 供您參考:
邏輯運算 • 由於 Not 只需要一個運算對象 (運算元), 因此稱為『一元邏輯運算子』;而其他 3 個則為『二元邏輯運算子』, 需要二個運算對象。底下我們來看一些實例:
邏輯運算 • 在上面的最後一行, 由於『比較運算的優先順序大於邏輯運算』,因此 9>6、3<2 會先運算, 然後再將這二個運算結果做 And 運算。另外, 多個邏輯運算子也可以同時出現, 此時的運算優先順序為『Not > And > Or > Xor』, 例如:
邏輯運算 • 以上的式子其實並不容易了解, 而且順序也很容易弄錯。因此, 建議大家還是多用小括號來標出運算的順序:
邏輯運算 • 所有比較運算子的優先順序都相同, 而且都高於邏輯運算子, 但低於算術 (+ - * / . . . ) 和串接 (&) 運算子。 • 請填寫以下的真值表:
邏輯運算 • 請寫出以下所描述的條件式: (1) 我的年齡(a) 大於 15 歲, 但小於 25 歲。 (2) 考試日期(d) 不是在 10/21/2008 以前, 就是在 10/25/2008 以後。 (3) 她的名字(n) 既不是 "Jenny", 也不是 "Mary"。 (4) 如果真的要考試(isEx), 而且日期(d) 是今天, 而且時間(t) 是現在。 (5) 紅燈(r) 與藍燈(b) 必須保持一個燈亮(True) 一個燈暗(False)的狀況, 否則視為固障(False)。 (6) 她們二個人 (x、y) 只有一個人的名字叫 "Sue"。
邏輯運算 (1) a < 25 And a > 15 (2) d < #10/21/2008# Or d > #10/25/2008# (3) n <> "Jenny" And n <> "Mary" (也可寫成 Not n = "Jenny" And Not n = "Mary") (4) isEx And d = Today And t = TimeOfDay (isEx 也可寫成 isEx = True) (5) r Xor b (6) x = "Sue" Xor y = "Sue"
邏輯運算 • 使用 T o d a y 可取得今天的日期 (時間固定為 #0:0:0# );使用TimeOfDay 則可取得目前的時間 (日期固定為 #1/1/0001#)。
檢查範圍的條件式 • 如果 a 是在某個範圍之內, 則通常會用 And 條件來指定, 例如『a> 5 And a < 25』, 或『a >= 5 And a <= 25』(包含 5 及 25 時)。
檢查範圍的條件式 • 反之, 如果 a 是在某個數值範圍之外, 則可用 Or 條件來指定, 例如『a < 5 Or a > 25』, 或『a <= 5 Or a >= 25』(包含 5 及 25 時)。
檢查範圍的條件式 • 在上一章中, 我們曾寫了一個將使用者輸入的數值, 分別以十進位、十六進位、及八進位顯示出來的程式;請再加入『檢查使用者輸入值是否正確』的功能。
檢查範圍的條件式 • 請開啟範例專案 Ch06-01。 • 請加入下面灰底區程式, 以進行簡單的數值檢查 ( 為了不要太複雜, 我們只檢查第一個字元):
檢查範圍的條件式 • 其實 VB 有提供一個 IsNumeric(字串) 函式, 可用來判斷字串中是否為正確的數值格式。請將上面程式改良為使用 IsNumeric() 函式來檢查。
檢查範圍的條件式 • 和 IsNumeric( ) 類似的函式還有 IsDate( ), 可用來判斷是否為正確的日期時間格式, 例如:IsDate("08 15, 2009 10:22 AM") 會傳回True, IsDate("Hello") 則傳回 False。
6-2 If 敘述:選擇性執行 • 相信大家對於 If 敘述已經很熟悉了, 本節會先為您做個總整理, 然後再補充一些新的應用, 讓您在寫程式時可以有更多的選擇!
3 種基本的 If 結構 • 最簡單的 If 結構只有一行, 就是『If ... Then ...』, Then 後面只接一個指令, 例如:
3 種基本的 If 結構 • 如果當條件成立時要執行多行的程式, 則可使用『If ... Then ...End If』結構, 例如:
3 種基本的 If 結構 • 當我們在程式中輸入 IF ... Then 然後按[Enter] 鍵換行時, VB 會很體貼地在下二行的位置自動加入 End If, 幫我們節省一些打字的時間。
3 種基本的 If 結構 • 最後, 則是加入 Else (否則) 的結構, 例如:
巢狀的 If 結構 • 在 If 結構中還可以再有 If 結構, 我們稱之為『巢狀 If 結構』, 例如:
巢狀的 If 結構 • 百貨公司週年慶, 促銷折扣的規則如下, 請寫一個程式來計算應付金額。
巢狀的 If 結構 • 請開啟範例專案 Ch06-02, 我們已加入了所需的控制項:
巢狀的 If 結構 • 除了以上標示的屬性設定外, 表單的 AcceptButton ( 預設按鈕)屬性也設為 Button1, 而 TextBox2 的 Enabled ( 可以操作) 屬性則設為 False, 表示不允許輸入或編輯資料。
巢狀的 If 結構 • 先大致畫出計算的流程圖:
巢狀的 If 結構 • 雙按 Button1 按鈕, 然後輸入下面程式:
巢狀的 If 結構 • 以上是先輸入『計算應付金額』的程式, 請按 鍵測試看看, 如果沒問題則再輸入剩下的部份 ( 下面灰底的程式):