流程控制 ─ 選擇性執行程式

134
著著著著著 © 著著著著著著著著著著 著著著著著著著著著著著 ( 著著 GPL 著) 著著著著著著著著著著著著著 著著著著著著著著 著著著著著著著著著 著著著著著著著著著著 ,(), 著著著著著 著著著著著 著著著著著著著著著著著著著著著著著著著著著著 著著著 著著著著著著著著著著著 著著著著著著著著著著著 ,,、、、。 著著著著 ─ 著著著著著著著 第 6 第

description

第 6 章. 流程控制 ─ 選擇性執行程式. 本章重點提要. 6-1 條件式:判斷真或假的運算式 6-2 If 敘述:選擇性執行 6-3 If() 運算子:依條件傳回不同的值 6-4 Select Case :依資料做多重選擇 6-5 做為選擇用的控制項. 本章閱讀建議. 『 流程控制 』 就是改變程式的執行流程 , 例如我們想依照使用者的性別 , 來決定要顯示 『XXX 先生 』 或 『XXX 小姐 』, 這時就可以使用 If 之類的敘述來加以判別 , 以決定要執行哪段程式。 - PowerPoint PPT Presentation

Transcript of 流程控制 ─ 選擇性執行程式

Page 1: 流程控制 ─ 選擇性執行程式

著作權所有 © 旗標出版股份有限公司

本著作含書附光碟之內容 (不含 GPL 軟體 ),僅授權合法持有本書之讀者(包含個人及法人)非商業用途之使用,切勿置放在網路上播放或供人下載,除此之外,未經授權不得將全部或局部內容以任何形式重製、轉載、散佈或以其他任何形式、基於任何目的加以利用。

流程控制 ─選擇性執行程式

第 6 章

Page 2: 流程控制 ─ 選擇性執行程式

2

本章重點提要 6-1 條件式:判斷真或假的運算式 6-2 If 敘述:選擇性執行 6-3 If() 運算子:依條件傳回不同的值 6-4 Select Case:依資料做多重選擇 6-5 做為選擇用的控制項

Page 3: 流程控制 ─ 選擇性執行程式

3

本章閱讀建議 『流程控制』就是改變程式的執行流程 , 例

如我們想依照使用者的性別 , 來決定要顯示『 XXX 先生』或『 XXX 小姐』 , 這時就可以使用 If 之類的敘述來加以判別 , 以決定要執行哪段程式。

本章及下一章都會介紹流程控制 , 讀者只要多看範例 , 多跟著做 , 就能完全學會。

Page 4: 流程控制 ─ 選擇性執行程式

4

本章閱讀建議 6-1 條件式:判斷真或假的運算式:它是

由比較運算 ( 大於、小於 ...) 或邏輯運算 ( 且、或 ...) 所組成 , 而運算的結果只有 2 種: True 或 False 。這部分很容易 , 只要有一點數學基礎就可以輕鬆過關。

6-2 If 敘述:選擇性執行:就是依照條件式的真假 , 來決定要執行哪些程式。 If 的觀念很簡單 , 但在使用上有幾種變化 , 請讀者務必要熟悉這些用法。

Page 5: 流程控制 ─ 選擇性執行程式

5

本章閱讀建議 6-3 If() 運算子:依條件傳回不同的值:這

是一種簡化的 If 敘述 , 讀者只要看看範例就能馬上學會。如果好好利用 , 可讓您的程式更加簡潔有力喔!

6-4 Select Case :依資料做多重選擇:如果對同一份資料要做許多的判斷 , 例如依照各年齡層做不同的處理 , 這時就可以改用 Select Case 敘述 , 讓程式更容易撰寫及閱讀。

Page 6: 流程控制 ─ 選擇性執行程式

6

本章閱讀建議 6-5 做為選擇用的控制項:包括『單選

鈕』與『多選鈕』二種 , 其用法就和考試的單選題與多選題類似。本節的範例比較有趣 , 會搭配單選鈕、多選鈕來展示字體的變化 ( 包括改變字型、大小、粗體、斜體等 ), 千萬別錯過哦!

Page 7: 流程控制 ─ 選擇性執行程式

7

6-1 條件式:判斷真或假的運算式 在程式中我們經常要判斷真假 , 例如在計

算成績時 , 如果成績小於 60 分就評為 " 不及格 ", 那麼『成績是否小於 60 分』就是一個條件式 , 可以寫成如下的程式:

Page 8: 流程控制 ─ 選擇性執行程式

8

條件式:判斷真或假的運算式 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 。

Page 9: 流程控制 ─ 選擇性執行程式

9

比較運算 比較運算的結果會是一個布林值 (True 或

Fasle), 在 VB 中共有 6 種比較運算子:

Page 10: 流程控制 ─ 選擇性執行程式

10

比較運算 請將以下條件寫成條件式:

(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

Page 11: 流程控制 ─ 選擇性執行程式

11

字串與字串的比較 在上一章中 , 我們介紹過字串是由『 Unico

de 編碼』的字元所組成 , 因此在比較字串或字元時 , 也是以 Unicode 編碼來比較。底下我們將一些常用的字元由小到大列出:

Page 12: 流程控制 ─ 選擇性執行程式

12

字串與字串的比較 接著我們來看實例:

如果想知道字元的 U n i c o d e 編碼 , 可使用 A s cW( ) 函式。例如 AscW("0") = 48 、 AscW("A") = 65 、 AscW("a") = 97 、AscW(" 好 ")= 22909 。

Page 13: 流程控制 ─ 選擇性執行程式

13

字串與字串的比較 在比較字串時 , 會先比較字串中的第一個

字元 , 若相等就再比較第二個字元 , 以此類推 , 直到比出大小、或有一方先結束 ( 字串長度較短的視為比較小 ) 為止。下面比較的結果均為 True :

Page 14: 流程控制 ─ 選擇性執行程式

14

字串與字串的比較 請判斷下面各條件式的結果:

(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"

Page 15: 流程控制 ─ 選擇性執行程式

15

字串與字串的比較

(1) False (2) False (因為字元 "1"<"5")

(3) True (4) False (5) True

(6) True ( 字元 "A" c 會先轉為字串 "A" 再進行比較 )

(7) False (8) True (9) True

Page 16: 流程控制 ─ 選擇性執行程式

16

"100" > 50? 字串與數值的比較時 , 會優先將字串『自

動型別轉換』為數值 , 然後再做比較 , 例如: "100" > 50 100 > 50 結果為 True 不過『自動型別轉換』雖然方便 , 但卻容

易混淆 , 因此建議讀者還是自行利用 Val() 函式來轉換型別 , 會比較保險一些。例如:

Val(s) > 50 ' 先將 s 轉換為數值 , 再與 50 比較

Page 17: 流程控制 ─ 選擇性執行程式

17

日期與日期的比較 日期資料可包含『日期』與『時間』二部

份 , 在做比較時 , 會先比較日期 , 若相等則再比較時間。例如下面的條件式均為 True :

Page 18: 流程控制 ─ 選擇性執行程式

18

日期與日期的比較 如果只有日期沒有時間 , 那麼時間就是最

小的 #0:0:0#(凌晨 , 也可寫成 #12:00:00 AM# );如果只有時間沒有日期 , 則日期為最小值 #1/1/0001# 。請再看以下的例子 ( 運算結果均為 True) :

Page 19: 流程控制 ─ 選擇性執行程式

19

日期與日期的比較 請判斷下面各條件式的結果:

(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

Page 20: 流程控制 ─ 選擇性執行程式

20

邏輯運算 邏輯運算是針對布林值 (True 或 False)

來做運算 , 而運算的結果也是布林值。例如:

Page 21: 流程控制 ─ 選擇性執行程式

21

邏輯運算 Not 是『不是』 (相反 ) 的意思 , 因此

『不是 True 』的結果 , 就變成 False 了。常用的『邏輯運算子』除了 Not 之外 , 還有 And 、 Or 、及 Xor 三種 , 如下表所示:

Page 22: 流程控制 ─ 選擇性執行程式

22

邏輯運算 前 3 個邏輯運算子的意義 , 就和我們口語

的『不是、且、或』完全相同 , 所以應該很容易理解;最後一個 Xor, 則是當 A 和 B 的邏輯值不相同 (恰好一真一假 ) 時才為真 , 否則為假。下表將所有可能的運算組合與結果都列出來 (稱為真值表 ), 供您參考:

Page 23: 流程控制 ─ 選擇性執行程式

23

邏輯運算 由於 Not 只需要一個運算對象 ( 運算元 ),

因此稱為『一元邏輯運算子』;而其他 3 個則為『二元邏輯運算子』 , 需要二個運算對象。底下我們來看一些實例:

Page 24: 流程控制 ─ 選擇性執行程式

24

邏輯運算 在上面的最後一行 , 由於『比較運算的優

先順序大於邏輯運算』 ,因此 9>6 、 3<2 會先運算 , 然後再將這二個運算結果做 And 運算。另外 , 多個邏輯運算子也可以同時出現 , 此時的運算優先順序為『 Not > And > Or > Xor 』 , 例如:

Page 25: 流程控制 ─ 選擇性執行程式

25

邏輯運算 以上的式子其實並不容易了解 , 而且順序

也很容易弄錯。因此 , 建議大家還是多用小括號來標出運算的順序:

Page 26: 流程控制 ─ 選擇性執行程式

26

邏輯運算 所有比較運算子的優先順序都相同 , 而且

都高於邏輯運算子 , 但低於算術 (+ - * / . . . ) 和串接 (&) 運算子。

請填寫以下的真值表:

Page 27: 流程控制 ─ 選擇性執行程式

27

邏輯運算 請寫出以下所描述的條件式:

(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" 。

Page 28: 流程控制 ─ 選擇性執行程式

28

邏輯運算

(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"

Page 29: 流程控制 ─ 選擇性執行程式

29

邏輯運算 使用 T o d a y 可取得今天的日期 ( 時間

固定為 #0:0:0# );使用 TimeOfDay 則可取得目前的時間 (日期固定為 #1/1/0001#) 。

Page 30: 流程控制 ─ 選擇性執行程式

30

檢查範圍的條件式 如果 a 是在某個範圍之內 , 則通常會用

And 條件來指定 , 例如『 a> 5 And a < 25 』 , 或『 a >= 5 And a <= 25 』 ( 包含 5 及 25 時 ) 。

Page 31: 流程控制 ─ 選擇性執行程式

31

檢查範圍的條件式 反之 , 如果 a 是在某個數值範圍之外 , 則

可用 Or 條件來指定 , 例如『 a < 5 Or a > 25 』 , 或『 a <= 5 Or a >= 25 』 ( 包含 5 及 25 時 ) 。

Page 32: 流程控制 ─ 選擇性執行程式

32

檢查範圍的條件式 在上一章中 , 我們曾寫了一個將使用者輸

入的數值 , 分別以十進位、十六進位、及八進位顯示出來的程式;請再加入『檢查使用者輸入值是否正確』的功能。

Page 33: 流程控制 ─ 選擇性執行程式

33

檢查範圍的條件式

Page 34: 流程控制 ─ 選擇性執行程式

34

檢查範圍的條件式1. 請開啟範例專案 Ch06-01 。2. 請加入下面灰底區程式 , 以進行簡單的數值檢查 ( 為了不要太複雜 , 我們只檢查第一個字元 ) :

Page 35: 流程控制 ─ 選擇性執行程式

35

檢查範圍的條件式

Page 36: 流程控制 ─ 選擇性執行程式

36

檢查範圍的條件式 其實 VB 有提供一個 IsNumeric( 字串 )

函式 , 可用來判斷字串中是否為正確的數值格式。請將上面程式改良為使用 IsNumeric() 函式來檢查。

Page 37: 流程控制 ─ 選擇性執行程式

37

檢查範圍的條件式 和 IsNumeric( ) 類似的函式還有 IsDate(

), 可用來判斷是否為正確的日期時間格式 , 例如: IsDate("08 15, 2009 10:22 AM") 會傳回 True, IsDate("Hello") 則傳回 False 。

Page 38: 流程控制 ─ 選擇性執行程式

38

6-2 If 敘述:選擇性執行 相信大家對於 If 敘述已經很熟悉了 , 本節

會先為您做個總整理 , 然後再補充一些新的應用 , 讓您在寫程式時可以有更多的選擇!

Page 39: 流程控制 ─ 選擇性執行程式

39

3 種基本的 If 結構 最簡單的 If 結構只有一行 , 就是『 If ... T

hen ... 』 , Then 後面只接一個指令 , 例如:

Page 40: 流程控制 ─ 選擇性執行程式

40

3 種基本的 If 結構 如果當條件成立時要執行多行的程式 , 則

可使用『 If ... Then ...End If 』結構 , 例如:

Page 41: 流程控制 ─ 選擇性執行程式

41

3 種基本的 If 結構 當我們在程式中輸入 IF ... Then 然後按

[Enter] 鍵換行時 , VB 會很體貼地在下二行的位置自動加入 End If, 幫我們節省一些打字的時間。

Page 42: 流程控制 ─ 選擇性執行程式

42

3 種基本的 If 結構 最後 , 則是加入 Else (否則 ) 的結構 , 例

如:

Page 43: 流程控制 ─ 選擇性執行程式

43

巢狀的 If 結構 在 If 結構中還可以再有 If 結構 , 我們稱

之為『巢狀 If 結構』 , 例如:

Page 44: 流程控制 ─ 選擇性執行程式

44

巢狀的 If 結構 百貨公司週年慶 , 促銷折扣的規則如下 ,

請寫一個程式來計算應付金額。

Page 45: 流程控制 ─ 選擇性執行程式

45

巢狀的 If 結構

Page 46: 流程控制 ─ 選擇性執行程式

46

巢狀的 If 結構1. 請開啟範例專案 Ch06-02, 我們已加入了所需的控制項:

Page 47: 流程控制 ─ 選擇性執行程式

47

巢狀的 If 結構 除了以上標示的屬性設定外 , 表單的 Accep

tButton ( 預設按鈕 )屬性也設為 Button1, 而 TextBox2 的 Enabled ( 可以操作 ) 屬性則設為 False, 表示不允許輸入或編輯資料。

Page 48: 流程控制 ─ 選擇性執行程式

48

巢狀的 If 結構2. 先大致畫出計算的流程圖:

Page 49: 流程控制 ─ 選擇性執行程式

49

巢狀的 If 結構3. 雙按 Button1 按鈕 , 然後輸入下面程式:

Page 50: 流程控制 ─ 選擇性執行程式

50

巢狀的 If 結構4. 以上是先輸入『計算應付金額』的程式 , 請按 鍵測試看看 , 如果沒問題則再輸入剩下的部份 ( 下面灰底的程式 ) :

Page 51: 流程控制 ─ 選擇性執行程式

51

巢狀的 If 結構

Page 52: 流程控制 ─ 選擇性執行程式

52

巢狀的 If 結構

Page 53: 流程控制 ─ 選擇性執行程式

53

巢狀的 If 結構 因此使用者在輸入金額後無論是按 [Enter]

鍵或 鈕 , 程式都會立即顯示計算結果 , 然後自動將輸入焦點移到 TextBox1 中並選取所有文字 , 以方便繼續輸入下一個要計算的金額 (輸入新的金額時會覆蓋掉舊的金額 ) 。

Page 54: 流程控制 ─ 選擇性執行程式

54

巢狀的 If 結構 利用 InputBox() 和 MsgBox(), 將使用者

輸入的數值取絕對值 , 然後判斷是個位、十位、或百位以上的數值。

Page 55: 流程控制 ─ 選擇性執行程式

55

巢狀的 If 結構

建立一 Windows 程式 , 然後撰寫表單的 Load 事件程序如下:

Page 56: 流程控制 ─ 選擇性執行程式

56

巢狀的 If 結構

Page 57: 流程控制 ─ 選擇性執行程式

57

多條件逐一過濾的 ElseIf 有時我們會用多個條件來逐一過濾 , 例如:

如果成績『 >= 90 』則為甲 , 否則若『 >=80 』則為乙 , 否則若『 >=70 』則為丙 , 否則為丁。這類情況如果使用巢狀的 If, 必須寫好幾層:

Page 58: 流程控制 ─ 選擇性執行程式

58

多條件逐一過濾的 ElseIf

Page 59: 流程控制 ─ 選擇性執行程式

59

多條件逐一過濾的 ElseIf 此時 , 我們可使

用逐一過濾的 ElseIf 來簡化程式 , 讓程式更容易了解:

Page 60: 流程控制 ─ 選擇性執行程式

60

多條件逐一過濾的 ElseIf 利用 InputBox() 、 MsgBox() 、和 ElseIf,

將使用者輸入的成績依上述規則 , 轉換為甲、乙、丙、丁的評等 , 另外如果小於 60 分 , 則要評為 “不及格”。

建立一 Windows 程式 , 然後撰寫表單的 Load 事件程序如下:

Page 61: 流程控制 ─ 選擇性執行程式

61

多條件逐一過濾的 ElseIf

Page 62: 流程控制 ─ 選擇性執行程式

62

6-3 If() 運算子:依條件傳回不同的值 If() 運算子是一個很特殊的運算子 , 它可依

據指定條件的真假 , 而傳回不同的值。其主要功能 , 就是用來簡化類似『 If A Then m=B Else m=C End If 』的敘述:

Page 63: 流程控制 ─ 選擇性執行程式

63

If() 運算子:依條件傳回不同的值 因此原本 5 行的 If...Else...End If 敘述 ,

可以用 If() 簡化為一行。例如我們可將巢狀的 If 加以簡化:

Page 64: 流程控制 ─ 選擇性執行程式

64

If() 運算子:依條件傳回不同的值 不過請注意 , 適度的簡化程式能增加『可

讀性』 , 讓程式更容易了解;但過度的簡化則可能適得其反 , 例如我們將上面的程式再度簡化成為一行:

以上程式雖然可以正確執行 , 但卻不易閱讀 , 也容易出錯!因此建議大家盡量不要使用巢狀的 If(), 以免造成反效果。

Page 65: 流程控制 ─ 選擇性執行程式

65

If() 運算子:依條件傳回不同的值 請將前面計算百貨公司折扣的範例 ( 可開

啟範例專案 Ch06-02ok 來修改 ), 用 If() 運算子加以簡化。

Page 66: 流程控制 ─ 選擇性執行程式

66

If() 運算子:依條件傳回不同的值

VB 另外還提供一個 Iif() 函式 , 其用法就跟 If() 運算子相同。這二者都可以使用 , 但我們建議使用 If() 運算子 , 因為執行效率比較好。

Page 67: 流程控制 ─ 選擇性執行程式

67

6-4 Select Case :依資料做多重選擇 有時候我們會依照一個變數的值 , 或是一

個運算式的結果來做多重選擇 , 例如:

Page 68: 流程控制 ─ 選擇性執行程式

68

Select Case :依資料做多重選擇 這時用 If 來寫就顯得有點累贅了 , 因為要

不斷重複地寫 "num =...",連看的人都會覺得頭昏呢!這時我們就可以用 Select Case 敘述來加以簡化:

Page 69: 流程控制 ─ 選擇性執行程式

69

Select Case :依資料做多重選擇 這樣是不是清爽多了呢!底下是 Select C

ase 的流程圖:

Page 70: 流程控制 ─ 選擇性執行程式

70

Select Case :依資料做多重選擇 在每一個 Case 之後 , 除了直接列出可能

的值之外 , 還可以用 To 來指定範圍 , 或是用 Is 來設定比較條件 , 底下我們來看實例:

寫一程式 , 可依照下表的年齡來判斷學生的教育層級。

Page 71: 流程控制 ─ 選擇性執行程式

71

Select Case :依資料做多重選擇

Page 72: 流程控制 ─ 選擇性執行程式

72

Select Case :依資料做多重選擇1. 建立 Windows Form 應用程式專案 Ch0

6-03 。2. 用滑鼠雙按表單 , 然後在 Form1 的 Load 事件程序中加入以下程式:

Page 73: 流程控制 ─ 選擇性執行程式

73

Select Case :依資料做多重選擇

Page 74: 流程控制 ─ 選擇性執行程式

74

Select Case :依資料做多重選擇

Page 75: 流程控制 ─ 選擇性執行程式

75

Select Case :依資料做多重選擇 當我們在程式中輸入 Select Case ... 然後

按 [Enter] 鍵換行時 , VB 也會很體貼地在下二行位置加入 End Select, 幫我們節省一些打字的時間。

請寫一輸入帳號的程式 , 並依下表判斷是先生、小姐、或特殊身份。

Page 76: 流程控制 ─ 選擇性執行程式

76

Select Case :依資料做多重選擇

Page 77: 流程控制 ─ 選擇性執行程式

77

Select Case :依資料做多重選擇

Page 78: 流程控制 ─ 選擇性執行程式

78

Select Case :依資料做多重選擇

Page 79: 流程控制 ─ 選擇性執行程式

79

Select Case :依資料做多重選擇 請寫一個猜數字遊戲 , 玩法如下:

Page 80: 流程控制 ─ 選擇性執行程式

80

Select Case :依資料做多重選擇

Page 81: 流程控制 ─ 選擇性執行程式

81

Select Case :依資料做多重選擇1. 請開啟範例專案 Ch06-04, 表單中已放入所需的控制項:

Page 82: 流程控制 ─ 選擇性執行程式

82

Select Case :依資料做多重選擇 在表單中我們利用 4 個 Label 控制項來

暫存資料: vAns 用來存放答案 , vMin 、 vMax 是存放猜測範圍的下限及上限 , 而 vCnt 則是記錄一共猜了多少次:

Page 83: 流程控制 ─ 選擇性執行程式

83

Select Case :依資料做多重選擇2. 請在表單中空白處雙按滑鼠 , 然後輸入表單

Load 事件程序的內容:

Page 84: 流程控制 ─ 選擇性執行程式

84

如何取得隨機的整數值? Rnd() 函式可傳回一個『大於或等於 0 且

小於 1 的實數』 , 但在第一次使用前應先執行 Randomize() 函式 ( 會以當時的時間做亂數的初始化 ), 否則每次啟動程式後 , 第一次執行 Rnd() 函式時都會得到相同的值。如果我們想取得介於 A 到 B 的隨機整數值 , 則可使用以下公式:

Page 85: 流程控制 ─ 選擇性執行程式

85

如何取得隨機的整數值? Int() 函式可直接移除掉小數點的部份 ( 但

不會轉換型別 );而 CInt() 可將資料轉換為整數型別 ( 但如果有小數則會四捨六入五成雙 ) 。這二者的組合 , CInt(Int(...)),則會先去除小數 , 然後轉換為整數型別。

Page 86: 流程控制 ─ 選擇性執行程式

86

Select Case :依資料做多重選擇3. 我們來撰寫 Button1 的 Click 事件程序:

Page 87: 流程控制 ─ 選擇性執行程式

87

Select Case :依資料做多重選擇 這個猜數字遊戲的基本邏輯其實很簡單 ,

就是不斷比較使用者猜的數字並調整猜測範圍 , 直到猜對為止。除此之外 , 比較特別的有下列 3 點:

1. 87需要取得一個隨機的整數做為答案:取得的方法前面已介紹過了 , 就是一開始先執行 Randomize() 函式做初始化 , 然後在需要時即可使用 Rnd() 函式來取得隨機亂數 (>= 0 且 < 1) 。如需將亂數轉換為特定範圍內的整數 , 則只要套用固定的運算公式即可。

Page 88: 流程控制 ─ 選擇性執行程式

88

Select Case :依資料做多重選擇2. 使用標籤 (Label) 來保存資料:我們使用

標籤控制項 vAns 的 Text 屬性來保存『答案』 , 以便後續每次使用者按下按鈕時做比對之用 (vAns 的 Visible 屬性已設為 False, 因此執行時看不到答案 ) 。

其他 3 個標籤: vMin 、 vMax 、 vCnt 則是同時做為顯示及保存資料之用。

3. 為了讓使用者可以方便地輸入數字 , 我們將表單的 Accept Button 屬性設為 Button1, 並在程式的最後加入 TextBox1.Focus() 及 TextBox1.SelectAll() 敘述。

Page 89: 流程控制 ─ 選擇性執行程式

89

Select Case :依資料做多重選擇 在前面程式中 , 為什麼要用隱藏的標籤 v

Ans 來保存答案 , 而不直接儲存在程序的 ans 變數中呢?

Page 90: 流程控制 ─ 選擇性執行程式

90

Select Case :依資料做多重選擇 這是由於凡是在程序中宣告的變數 , 只在

該程序被執行時才會產生 , 而當程序結束時變數也會隨之消失。因此每次程序被執行 ( 使用者按下按鈕 ) 時 , 該變數都會重新產生 , 所以根本無法持續保存資料。

如果想要建立一個能持續保存資料 , 而且在所有程序中都能存取的變數 , 則可將變數宣告在程序之外 , 而成為表單層級的變數。例如底下的改良版程式:

Page 91: 流程控制 ─ 選擇性執行程式

91

Select Case :依資料做多重選擇

Page 92: 流程控制 ─ 選擇性執行程式

92

6-5 做為選擇用的控制項 常見的選擇用控制項有二種 , 一種是 Radi

oButton ( 單選鈕 , 或稱選項按鈕 ), 另一種則為 CheckBox ( 多選鈕 , 或稱核取方塊 ) :

Page 93: 流程控制 ─ 選擇性執行程式

93

做為選擇用的控制項 以上的 GroupBox (群組方塊 ) 是做為分

組之用 , 它就像是小容器 , 我們可將視窗內的各類控制項放到不同的容器中 , 以達到分組的效果。

Page 94: 流程控制 ─ 選擇性執行程式

94

RadioButton ( 單選鈕 ) RadioButton ( 單選鈕 ) 就好像是考試的單

選題一樣 , 每一題都只能選擇其中的一個答案。直接放在表單中的所有 RadioButton 會被視為一題 , 因此每次只能有一項被選取;如果想要分為多題 , 則可用 GroupBox (群組方塊 ) 來加以區分。

Page 95: 流程控制 ─ 選擇性執行程式

95

RadioButton ( 單選鈕 ) 製作一個可以選擇字體及大小的表單。

Page 96: 流程控制 ─ 選擇性執行程式

96

RadioButton ( 單選鈕 )1. 請建立 Windows Form 應用程式專案 Ch0

6-05 。2. 使用工具箱的 將 3 個 Radi

oButton 加入表單中 , 並依下圖設定其 Text 屬性 , 然後再將表單調小一點:

Page 97: 流程控制 ─ 選擇性執行程式

97

RadioButton ( 單選鈕 )3. 按 [F5] 鍵啟動程式 , 然後每一個項目都選

選看:

Page 98: 流程控制 ─ 選擇性執行程式

98

RadioButton ( 單選鈕 ) 由以上的操作可以得知 , 凡是擁有輸入焦

點的選項 , 就會變成選取的狀態 , 而其他選項則會自動變成非選取狀態。

由於 RadioButton1 是我們第一個加入的控制項 ( 其 TabIndex 屬性為 0), 所以當表單開啟時 , 輸入焦點就會落在 RadioButton1 上 , 因而成為自動被選取的選項。

Page 99: 流程控制 ─ 選擇性執行程式

99

RadioButton ( 單選鈕 )4. 按 鈕關閉視窗 , 然後在工具箱中展開

容器項目 , 將加入表單中並調整大小:

Page 100: 流程控制 ─ 選擇性執行程式

100

RadioButton ( 單選鈕 )5. 將群組方塊 GroupBox1 的 Text 屬性改為

" 大小 ", 然後將 RadioButton3 拉曳到群組方塊中:

Page 101: 流程控制 ─ 選擇性執行程式

101

RadioButton ( 單選鈕 )6. 繼續在群組方塊 GroupBox1 中新增 3 個

單選鈕 , 並分別設定 Text 屬性為 10 、 11 、 12 :

Page 102: 流程控制 ─ 選擇性執行程式

102

RadioButton ( 單選鈕 )

Page 103: 流程控制 ─ 選擇性執行程式

103

RadioButton ( 單選鈕 )7. 按 [F5] 鍵 , 然後選擇不同的選項看看:

其實表單、群組方塊都是一種容器 , 而單選鈕是以容器做為分組的依據 , 因此放在同一個容器中的單選鈕即為同一組。

Page 104: 流程控制 ─ 選擇性執行程式

104

表單開啟時 , 預設會選取哪一個單選鈕?

有時在開啟表單時 , 單選鈕的預設選取狀態會很奇怪 , 例如下圖:

Page 105: 流程控制 ─ 選擇性執行程式

105

表單開啟時 , 預設會選取哪一個單選鈕?

由於單選鈕是以 Checked 屬性來記錄選取狀態 ( 為 True 時表示選取 , 為 False 時則為未選取 ), 因此我們在設計時即可利用此屬性來指定預設選取的單選鈕:

Page 106: 流程控制 ─ 選擇性執行程式

106

RadioButton ( 單選鈕 ) 注意 , 如果將單選鈕直接放在表單中 , 而

且其 TabIndex ( 定位順序 ) 屬性的值最小 , 那麼表單在開啟時 , 輸入焦點就會直接落在此單選鈕上 , 所以不管在設計時如何設定 Checked 屬性 , 在執行時該單選鈕均會自動被選取 (因為擁有輸入焦點 ) 。

Page 107: 流程控制 ─ 選擇性執行程式

107

CheckBox ( 多選鈕 ) CheckBox ( 多選鈕 ) 就好像是考試的多選

題一樣 , 每一個答案都可以單獨地選取或不選取 , 而不會影響到其他答案。 CheckBox 也可以用 GroupBox (群組方塊 ) 來加以區分 , 但只有視覺上的區隔效果 , 而沒有任何分組選擇的功能。

Page 108: 流程控制 ─ 選擇性執行程式

108

CheckBox ( 多選鈕 ) 製作一個可以選擇字體、大小、以及樣式

( 粗體 / 斜體 /刪除線 /底線 ) 的表單。

Page 109: 流程控制 ─ 選擇性執行程式

109

CheckBox ( 多選鈕 )1. 請開啟範例專案 Ch06-06, 我們已經加入

一些基本的控制項:

Page 110: 流程控制 ─ 選擇性執行程式

110

CheckBox ( 多選鈕 )2. 使用工具箱的 , 在視窗

右邊的樣式群組方塊中加入 4 個多選鈕:

Page 111: 流程控制 ─ 選擇性執行程式

111

CheckBox ( 多選鈕 )3. 多選鈕和單選鈕一樣 , 都是利用 Checked

屬性來決定是否選取 ( 等於 True 時代表選取 ) 。請將第 2 及第 4 個多選鈕設定為預設選取的項目:

Page 112: 流程控制 ─ 選擇性執行程式

112

CheckBox ( 多選鈕 )4. 按 [F5] 鍵測試看看:

Page 113: 流程控制 ─ 選擇性執行程式

113

展示各種字型效果 在設計表單時 , 我們可以展開屬性窗格的

Font 屬性 , 來設定 Label 、 TextBox 、 Button 等控制項的字型效果:

Page 114: 流程控制 ─ 選擇性執行程式

114

展示各種字型效果

Page 115: 流程控制 ─ 選擇性執行程式

115

展示各種字型效果 不過 , 以上 Font 屬性的 Name 、 Size 、

Bold 等子屬性 , 在程式執行時都是唯讀的 ( 只能讀取不能更改 ), 因此如果想用程式動態改變控制項的字型 , 就必須建立一個 Font 物件來設定:

Page 116: 流程控制 ─ 選擇性執行程式

116

展示各種字型效果 其中 Font() 的樣式參數共有 5 種 , 如下

表所示:

Page 117: 流程控制 ─ 選擇性執行程式

117

展示各種字型效果 如果要同時套用多種樣式 , 可將各樣式用

Or 組合起來 , 例如:

除了 Or 之外 , 也可以使用 + 號來組合。

Page 118: 流程控制 ─ 選擇性執行程式

118

為什麼使用 Or 來組合『粗體、斜體』?

之前所介紹的邏輯運算子 Or, 不但可以針對布林資料進行『或』的運算 , 當其運算對象為數值時 , 還會變成位元運算子 , 可針對每一個位元來進行『或』的運算。例如:

Page 119: 流程控制 ─ 選擇性執行程式

119

為什麼使用 Or 來組合『粗體、斜體』?

位元運算子最常見的用法 , 就是拿來做為不同設定值的組合 , 例如 FontStyle 的設定值有下列幾種:

Page 120: 流程控制 ─ 選擇性執行程式

120

為什麼使用 Or 來組合『粗體、斜體』?

由於每一種設定值都使用不同的位元來表示 ( 例如 Bold 使用右邊第 1 個位元 ,而 Italic 則使用第 2 個位元 ), 因此我們可以用 Or 來進行不同設定值的組合 , 例如粗體加斜體就是:

Page 121: 流程控制 ─ 選擇性執行程式

121

為什麼使用 Or 來組合『粗體、斜體』?

除了 Or 外 , Not 、 And 、及 Xor 也都具有相同的特性 , 也就是當運算對像為數值 (若為非整數的數值會先自動轉換為整數 ) 時 , 就會變成位元運算子 , 以位元為單位來進行『不是、且、恰有一為真』的運算。

Page 122: 流程控制 ─ 選擇性執行程式

122

展示各種字型效果 利用前面範例做過的字型設定表單 , 來動

態展示各種字型的設定效果。

Page 123: 流程控制 ─ 選擇性執行程式

123

展示各種字型效果1. 請開啟範例專案 Ch06-07, 我們已經準備

好了所需的控制項:

Page 124: 流程控制 ─ 選擇性執行程式

124

展示各種字型效果2. 雙按右下角的 Button1 按鈕 , 開啟程式碼

視窗來建立 Button1 的 Click 事件程序:

Page 125: 流程控制 ─ 選擇性執行程式

125

展示各種字型效果

Page 126: 流程控制 ─ 選擇性執行程式

126

展示各種字型效果3. 按 [F5] 鍵進行測試。

無論是單選鈕或多選鈕 , 都可使用其 Checked 屬性來判讀是否被選取。在上面程式中 , 有許多地方使用了 If() 運算子來簡化程式 , 如果讀者對 If() 還不熟 , 可往前翻到 6-3 節再複習一下。

Page 127: 流程控制 ─ 選擇性執行程式

127

展示各種字型效果 請修改前面的範例 , 當使用者更改任何一

個單選鈕或多選鈕時 , 就立即在上方顯示出更改後的效果 , 而不用再按右下角的按鈕;另外 , 請將粗體多選鈕設為預設呈勾選狀態 , 並將右下角按鈕的功能改為『回復正常樣式』 ( 就是清除所有已勾選的樣式 ) 。

Page 128: 流程控制 ─ 選擇性執行程式

128

展示各種字型效果

Page 129: 流程控制 ─ 選擇性執行程式

129

展示各種字型效果

1. 在設計視窗中將粗體多選鈕的 Checked 屬性設為 True,然後將 Button1 的 Text 屬性改為『回復正常樣式』。

2. 切換到程式碼視窗 , 將 Button1_Click 事件程序的第一行修改如下:

Page 130: 流程控制 ─ 選擇性執行程式

130

展示各種字型效果 Handles 就是『要處理』的意思 , 每當所

Handles 的事件發生時 , 即會觸發 ( 執行 ) 該事件程序來處理。

3. 在程序中處理樣式的部份 , 增加以下灰底的程式:

Page 131: 流程控制 ─ 選擇性執行程式

131

展示各種字型效果

Page 132: 流程控制 ─ 選擇性執行程式

132

展示各種字型效果 寫一個程式如圖

所示 , 按 [-] 時可將字體大小減 1, 按 [+] 時則加 1 。

Page 133: 流程控制 ─ 選擇性執行程式

133

展示各種字型效果

Page 134: 流程控制 ─ 選擇性執行程式

134

展示各種字型效果

在上面程式中 , 利用 TextBox1.Font.Name 、TextBox1.Font.Size 、及 TextBox1.Font.Style 來讀取 TextBox1 的字體名稱、大小、及樣式。 ( 請注意 , 這些子屬性都是唯讀的喔! )

另外 , 文字方塊 (TextBox) 的高度會隨著其字體大小而自動調整 ,因此我們只要預留足夠的空間給它縮放就好 , 而不必在程式中另做處理。