Ch04 流程控制 - 選擇結構(if) 視窗程式設計 授課教師:王大瑾
前言 程式基本流程 - 輸入、處理、輸出。 輸入和輸出 即輸出入介面透過工具箱提供的工具,在表單上 拉一拉不用編寫程式碼,就可製作出 視窗應用程 式的輸出入介面。 處理部份 需熟悉結構化程式的語法及清晰程式邏輯,才能 編寫出程式。 結構化程式 - 循序、 選擇、重複結構。 選擇結構 - 根據條件,做出不同的選擇。 2018/12/5
從生活中找出選擇結構 2018/12/5
關係運算子 關係運算子 亦稱 比較運算子。 使用 > 、 < 、 = 運算子組合成六種。 關係運算子:>、<、=、>=、<=、<>。 關係運算子除可比較數值也可做字串比較。 關係運算式語法: 結果 = 運算元1 關係運算子 運算元2 關係運算式會將比較的結果以布林值傳回。 布林值:True (真)或False (假) 兩種。 如條件成立傳回 True; 條件不成立傳回 False。 運算元可為 常值 或 運算式。
關係運算子 關係運算式
關係運算子 時間和日期視同數值 當兩個時間做比較時,時間較晚者大於時間較前。 算術運算子優先次序較關係運算子高 10 - 5 >= 8 先做減法結果為5,再比較 5 ≧ 8 ? 結果 False。 字串以 ASCII 碼的大小來比較 a 的 ASCII 碼為 97, b 的 ASCII 碼為 98,所以 b > a。 若字串第一個字元相同,比第二字元的 ASCII 碼 ….。 ASCII 依序:數字字元值最小,接著大寫字母、小寫字母、最後是中文字。 “0”<“1”<”2”…<”9”<”A”<”B”…<”Z” <”a”<”b”…<”z” <”中”…。 2018/12/5
字串比較除用關係運算子外,若要做到更彈性比對, 就要用相似程度 Like 運算子來比較 兩個字串。 語法: 結果 = string Like pattern [說明] string :需符合字串型別資料。 Like 運算子 將 string 和 pattern(模板)做比較後,結果以 Boolean 值傳回。 Pattern 用來比較的一個模板,可以是字元、萬用字元或 字串的組合成比對的字串。
下表是 pattern 中允許使用的對應字元:
例3 "apple " Like "a*e" True 例4 "apple " Like "a?e" False 例1 "a" Like "a" True 例2 "a" Like "A" False 例3 "apple " Like "a*e" True 例4 "apple " Like "a?e" False 例5 "apple " Like "a???e" True 例6 "1234" Like "####" True 例7 "A" Like "[BASIC]" True 例8 "B" Like "[!a-z]" True 例9 "A1234" Like "[A-Z]###" False 例10 "04-1234567" Like "##-#######" True 例11 "張四丰" Like "張?丰" True 2018/12/5
邏輯運算子 邏輯運算子可將多個關係運算式,組合成較複雜邏輯 運算式。 邏輯運算式的結果可為True(真)或False(假)。 邏輯運算子運算優先順序: Not > And、AndAlso > Or、OrElse > Xor。 邏輯運算式表示方式: 語法: 結 果 = 運算元A 邏輯運算子 運算元B
2018/12/5
例1 條件式 : 1,000 < 金額(money) 10,000 寫 法: 寫 法: (money >1000) And (Money <=10000) (money >= 1000) AndAlso (money < 10000) 例2 條件式 :金額(money) 小於1,000 或 大於10,000 (money<1000) Or (money >10000) (money < 1000) OrElse (money > 10000) 2018/12/5
If …Then …Else 雙重選擇 If.... Then ... Else 敘述只有兩種選擇流向 意思是「若 ... 則 ... 否則 ... 」。 當條件式為真時,執行 敘述區段A;不滿足條件式時, 執行 敘述區段B。語法:
上面程式碼用中文字當變數名稱是允許, 建議以英文字當變數名稱較宜。 由於條件內的敘述區段只有一行允許寫成一行: 上面流程圖程式碼寫法: If (分數 >= 60) Then Msgbox( "及格”) Else Msgbox(“不及格”) End If 上面程式碼用中文字當變數名稱是允許, 建議以英文字當變數名稱較宜。 由於條件內的敘述區段只有一行允許寫成一行: If 分數 >= 60 Then Msgbox( "及格”) Else Msgbox(“不及格”) 2018/12/5
若If.... Then ... Else 敘述語法,當條件式不滿足時,不做執行任何敘述,就可省略Else部分,而變成「單一選擇」。其語法如下: 上面流程圖的程式碼寫法如下: If 分數 >= 95 Then 獎學金 = 1000 End If 上面的程式碼也可以寫成一行: If 分數 >= 95 Then 獎學金 = 1000
習題一: 2018/12/5
Filename: passCheck.sln 01 Private Sub Form1_Load(ByVal sender …) Handles MyBase.Load 02 If InputBox("帳號") = "abcd" And InputBox("密碼") = "123" Then 03 MsgBox("登入成功!") 04 Else 05 MsgBox("登入失敗!") 06 End If 07 End 08 End Sub 2018/12/5
If…ElseIf…Else 多重選擇 當程式流程需兩個條件以上作判斷,且條件式是由上而下逐一檢查時,就可用到 If… ElseIf …Else 敘述,語法:
2018/12/5
習題二: 2018/12/5
Step1 建立輸出入介面 2018/12/5
02 Dim ans, times As Integer ‘ 宣告ans、 times為共用成員整數變數 Filename: guessNo.sln 01 Public Class Form1 02 Dim ans, times As Integer ‘ 宣告ans、 times為共用成員整數變數 03 Private Sub Form1_Load(ByVal …… ) Handles MyBase.Load 04 Dim rnd As New Random ' 宣告rnd為一個亂數 05 ans = rnd.Next(2, 100) ' 用Next方法隨機產生2-99(100-1)的數值 06 lblShow.Text = "請輸入1到100之間的數字" 07 End Sub 2018/12/5
09 Private Sub btnOK_Click(ByVal sender …. ) Handles btnOK.Click 10 Dim guess As Integer 11 guess = Val(txtGuess.Text) 12 times += 1 13 If guess = ans Then 14 lblShow.Text = "您答對了!共猜了 " & times.ToString & " 次!" 15 ElseIf guess < ans Then '若輸入數值小於答案 16 lblShow.Text = "數字太小了!已猜了 " & times.ToString & " 次!" 17 Else ' 其餘情況 18 lblShow.Text = "數字太大了!已猜了 " & times.ToString & " 次!" 19 End If 20 End Sub 2018/12/5
Select Case多重選擇 若有兩個以上不同條件需做判斷,需使用多重選擇結構。如條件性質不一樣時,可用If… ElseIf …Else 敘述。 如條件性質都一樣時,使用 Select Case 敘述。
2018/12/5
例4 Case Is < 60: 條件值為小於60 例2 Case 1 To 10: 條件值1到10 例3 Case 5,10,15: 條件值為5、10或15 例4 Case Is < 60: 條件值為小於60 例5 Case Is>=90, Is<=10: 條件值為大於等於90或小於等於10 例6 Case “Y” , ”y” : 條件值為 “Y” 或 ”y” 例7 Case “A” To ”D”: 條件值為 “A”、”B”、”C” 或 ”D” 2018/12/5
習題三: 2018/12/5
03 Private Sub Form1_Load(ByVal sender ….. ) Handles MyBase.Load FileName:bloodPressure.sln 03 Private Sub Form1_Load(ByVal sender ….. ) Handles MyBase.Load 04 Dim pressure As Integer 05 Me.Text = "高血壓篩選" 06 pressure = Val(InputBox("請輸入您的收縮壓︰", "輸入血壓值", "120")) 07 Select Case pressure 08 Case Is >= 140 09 MsgBox("您的血壓為" & pressure & " 為高血壓,應該就醫檢查!") 10 Case 120 To 139 11 MsgBox("您的血壓為" & pressure & " 為高血壓高危險群,應該特別留意!") 12 Case 115 To 119 13 MsgBox("您的血壓為" & pressure & " 為正常範圍,但應該按時量血壓!14") 15 Case Is < 115 16 MsgBox("您的血壓為" & pressure & " 非常正常,恭喜!") 17 End Select 18 End 19 End Sub 2018/12/5
巢狀選擇結構 如選擇結構的敘述區段內,又有選擇結構便形成 所謂的巢狀結構。 如判斷三個數字何者最大,需先任取兩個數字做判斷, 然後依結果再執行第二次判斷,就是巢狀選擇結構。 2018/12/5
2018/12/5
習題四: 2018/12/5
2018/12/5
03 Private Sub Form1_Load(ByVal sender … ) Handles MyBase.Load 04 Dim card As String 05 Dim money As Integer 06 card = InputBox("是否持有本公司聯名卡?輸入Y或N", "聯名卡", "Y") 07 money = Val(InputBox("請輸入本次消費金額︰", "消費金額")) 08 If card Like "[Yy]" Then 09 Select Case money 10 Case Is >= 100000 11 MsgBox("持本公司聯名卡消費金額" & money & "元,回饋禮券“ _ & money * 0.07 & "元") 12 Case 50000 To 99999 13 MsgBox("持本公司聯名卡消費金額" & money & "元,回饋禮券" & _ money * 0.06 & "14元") 14 Case 6000 To 49999 15 MsgBox("持本公司聯名卡消費金額" & money & "元,回饋禮券" & _ money * 0.05 & "元") 16 Case Else 17 MsgBox("持本公司聯名卡消費金額" & money & "元,回饋禮券" & _ money * 0.02 & "元") 18 End Select 2018/12/5
21 MsgBox("本次消費金額" & money & "元,可以摸彩" & _ Int(money / 3000) & "次") 19 Else 20 If money >= 3000 Then 21 MsgBox("本次消費金額" & money & "元,可以摸彩" & _ Int(money / 3000) & "次") 22 Else 23 MsgBox("本次消費金額" & money & "元,歡迎再次光臨") 24 End If 25 End If 26 End 27 28 End Sub 2018/12/5
IIf、Choose 與 Switch 函式 IIf 函式 If…Then…Else 雙重選擇結構,也可用 IIf 函式 來達成。 IIf 函式內的三個參數都不可省略,當條件運算式 結果為True,會傳回第二個參數;若結果為 False, 則傳回第三個參數。 語法: IIf (條件運算式,True的傳回值,False的傳回值) 2018/12/5
例1 若分數大於等於60訊息框就顯示「及格」; 否則顯示「不及格」。 例1 若分數大於等於60訊息框就顯示「及格」; 否則顯示「不及格」。 MsgBox(IIf(分數 >= 60, ”及格”, ”不及格”)) 例2 若性別等於 ”男”,稱謂變數值為「先生」; 否則為「小姐」。 稱謂 = IIf (性別=”男”, ”先生”, ”小姐”) 2018/12/5
Choose函式 語法:Choose(Index, V1[, V2,…[,Vn]]) Choose 函式是多重選擇結構的一種。 若 Choose 函式中第一個參數 Index = 1 時,函式傳回值 為 V1;Index = 2 傳回 V2 值,以此類推 ….。 若 Index 值小於 1 或大於 n 時,傳回值為 Null (無對應值) 語法:Choose(Index, V1[, V2,…[,Vn]]) 例1 根據數值 (1-5) 傳回大寫的國字,如 2 傳回 貳。 chi = Choose(i, "壹", "貳", "參", "肆", "伍") 2018/12/5
Switch 函式 Switch 函式也算是多重選擇結構。 Switch 函式會根據運算式的值,傳回對應的參數值 先判斷運算式1 是否為真 - 若為真就傳回 V1; - 否則再判斷運算式 2,依此類推。 若所有運算式結果皆為假,則傳回 Nothing。 2018/12/5
例1 根據郵遞區號(zip) 傳回鄉鎮名(city) 如 zip = 400 傳回「台中市」。 city = Microsoft.VisualBasic.Switch(zip = 400, "台中市", _ zip = 420, "豐原市", zip = 411, "太平市") 例2 根據分數傳回獎學金的金額,例如分數=81時傳回 獎學金50。 獎學金 = Microsoft.VisualBasic.Switch (分數>=95,200,分數>=90 _ And 分數<=94, 100, 分數>=80 And分數<=89,50, 分數<=79,0) 2018/12/5
Radio Button 選項按鈕控制項 設計輸入介面時,若多個選項只能挑選其中一項,可用選項按鈕控制項來設計。 只要其中一個選項按鈕控制項被選取,其它選項按鈕 自動變成不被選取。 若在表單中有多組選項,同時可選取時。此時可用工具箱的群組或面板控制項,將多個同性質選項組成群組。 2018/12/5
選項按鈕常用屬性 1. Checked屬性(預設值為False) - False :當選項按鈕控制項呈未選取狀態。 - True:當選項按鈕控制項呈選取狀態。並同時觸動 選項按鈕的 CheckedChanged 事件程序。 - 執行階段 將 RadioButton1 控制項設成被選取狀態, 其寫法: RadioButton1.Checked=True 選項按鈕為被選取狀態 RadioButton1.Checked=False 選項按鈕為未選取狀態 2018/12/5
程式執行階段檢查 RadioButton1 控制項按鈕 是否被選取? 若被選取執行 敘述區段A,否則執行 敘述區段B。 寫法: If (RadioButton1.Checked=True) Then 敘述區段A Else EndIf 2018/12/5
2. Appearance屬性(預設值為Normal) 用來設定選項按鈕的外觀。 若設為 Button,變為 按鈕。 執行階段將 Radiobutton1 控制項變成按鈕型式 寫法: RadioButton1.Appearance =Appearance.Button 3. CheckAlign、TextAlign 對齊屬性(預設值為MiddleLeft) 用來調整圓形按鈕的位置 TextAlign屬性用來設定選項按鈕上面文字的位置。 2018/12/5
4. Text屬性 (預設值為RadioButton1) 設定選項按鈕的文字內容。 如 選項按鈕 顯示「Up」,按鍵盤的「U」鍵, 就可選擇或取消該項按鈕。 將選項按鈕的 Text 屬性設為『&Up』即可。 2018/12/5
當Enabled = True,表該選項按鈕允許被點選 若為 False ,表不允許被點選,控制項呈現淺灰色。 5. AutoCheck屬性 (預設值為True) 當 AutoCheck = True ,自動判斷選項按鈕的狀態, 並維持同群組的選項按鈕只有一個被選取。 若為 False 時,將使點選動作失效。 2018/12/5
選項按鈕常用事件 若 AutoCheck=True 在選項按鈕控制項上按一下,Checked 屬性值會變更, 先觸動 CheckedChanged 事件,接著觸動 Click 事件。 如該選項按鈕已被選取,重複點選時,因Checked 值不變 只會觸發 Click 事件。 Click事件: 無論 Checked 屬性值是否改變,只要被點選就觸發 Click 事件。 CheckedChanged事件: 是選項按鈕的預設事件,當 Checked 屬性值改變時才會 觸發。一般判斷選取狀態的程式碼,都寫在此事件程序中。 2018/12/5
習題五: 2018/12/5
Step1 建立輸出入介面 2018/12/5
2018/12/5
FileName : moneyTicket.sln 03 Private Sub Form1_Load(ByVal sender ….) Handles MyBase.Load 04 rdbTicket.Checked = True 05 lbl500.Text = "" 06 lbl200.Text = "" 07 lblCash.Text = "" 08 End Sub 09 10 Private Sub Button1_Click(ByVal sender …) Handles btnOK.Click 11 12 ‘ n500 : 500元張數 n200 : 200元張數 change:未兌換剩餘金額 13 Dim n500, n200, change As Integer 2018/12/5
15 If (rdbTicket.Checked = True) Then ' 16 If (Val(txtSum.Text) >= 3600) Then 17 change = Val(txtSum.Text) - 3600 18 n500 = 6 19 n200 = 3 20 Else 21 n500 = Str(Int(Val(txtSum.Text) / 500)) 22 change = Val(txtSum.Text) - n500 * 500 23 If n500 > 6 Then 25 n500 = 6 26 change += 500 27 End If 28 29 n200 = Str(Int((change / 200))) 30 change = change - n200 * 200 31 If n200 > 3 Then 32 n200 = 3 33 change += (n200 - 3) * 200 34 End If 35 End If 2018/12/5
38 lblCash.Text = Str(change) & " 元" 39 40 Else 36 lbl500.Text = Str(n500) & " 張" 37 lbl200.Text = Str(n200) & " 張" 38 lblCash.Text = Str(change) & " 元" 39 40 Else 41 lbl500.Text = " 0 張 " 42 lbl200.Text = " 0 張 " 43 lblCash.Text = txtSum.Text & " 元" 44 End If 45 End Sub 46 47 Private Sub btnQuit_Click(ByVal sender …) Handles btnQuit.Click 48 End 49 End Sub 2018/12/5
CheckBox核取方塊控制項 核取方塊和選項按鈕 控制項都供選取項目用 選項按鈕具互斥性,只能單選。 核取方塊選項每個核取方塊都可獨立挑選,允許多選。 下圖三個核取方塊,每個方塊都可獨立勾選或不勾選 2018/12/5
核取方塊常用屬性 1. Checked屬性 (預設值為False) 若為True,表核取方塊被勾選。 若為 False,表未被勾選。 如要在程式執行階段才設為勾選,寫法: CheckBox1.Checked = True ‘ 被選取 CheckBox1.Checked = False ‘未被選取 2. ThreeState屬性 (預設值為False) 若為 False,表只有勾選或未被勾選兩種狀態。 若為True ,表有三種變化,此屬性和 CheckState 屬性相關連。 2018/12/5
3. CheckState 屬性 (預設值為Unchecked) 用來設定核取方塊目前勾選的狀態。 當 ThreeState = False 時,此屬性只有 Checked(勾選) 和 Unchecked (未勾選)兩種狀態。 當 ThreeState = True 時,此屬性有 Checked(勾選)、Unchecked(未勾選) 和 Indeterminate (不確定勾選) 三種狀態。 CheckState 屬性可用常數表示,也可用數字表示: 2018/12/5
核取方塊常用事件 當 ThreeState = False 時,按核取方塊依序觸動 CheckedChanged ()事件 CheckStateChanged ()事件 Click()事件 CheckedChanged 事件是核取方塊控制項的預設事件, 當 Checked 屬性值改變時,就會觸發此事件。 當 CheckState 屬性值改變時,會觸發 CheckStateChanged 事件。 2018/12/5
核取方塊常用事件 當 ThreeState = True 時,若勾選狀態為「不確定」時, 是不會觸動 CheckedChanged 事件程序。 判斷核取方塊勾選狀態程式碼: 若 ThreeState = False 時,寫在 CheckedChanged 事件程序中。 若 ThreeState = True 時,寫在 CheckStateChanged 事件程序中。 2018/12/5
GroupBox 框架與 Panel 面板控制項 選項按鈕具備有互斥性。 若有多組選項要同時存在表單時,需要 GroupBox 框架與 Panel 面板控制項來隔離。 GroupBox 與 Panel 控制項具有容器功能,也就 該控制項內可安置其他物件,和容器外物件隔離。 如希望 將物件和其他物件隔離,或分類擺放使畫面 整齊時,需使用框架、面板控制項。 2018/12/5
GroupBox框架與Panel面板控制項 容器內物件的座標值是以容器為基準,和表單物件無關。 當移動容器時,其中的物件也隨移動。 因容器和所屬物件有隸屬關係,在建立物件時要 特別留意。 容器(GroupBox、Panel控制項)要先建立,然後容器內 的物件需在容器內拖曳出來,才會成為所隸屬的物件。 我們可移動容器,若物件隨之移動表該物件被安置在容器中。 2018/12/5
框架控制項常用屬性 1. Text屬性 GroupBox框架控制項主要用來當容器用,所以沒有重要的屬性。 2018/12/5
面板控制項常用屬性 Panel 面板控制項也具有容器功能,和框架控制項 外觀最大不同是左上角沒文字,但可顯示捲軸。 1. AutoScroll屬性(預設值為False) 設定當物件超出面板時,是否自動顯示捲軸。 2. BorderStyle屬性(預設值為 None) 設定面板的邊框樣式,樣式有三種: - None 無邊框 - FixedSingle 單線框 - Fixed3D 立體框。 2018/12/5
習題六: 2018/12/5
step1 建立輸出入介面 2018/12/5
FileName : bodyCheck.sln 03 Private Sub OK_Click(ByVal sender ….) Handles OK.Click 04 Dim show As String = "" 05 If txtWaist.Text = "" Or txtBottom.Text = "" Then 06 show = "請務必輸入腰圍和臀圍!!" 07 Else 08 Dim sex As String '性別稱呼(你or妳) 09 Dim waist As Integer '標準腰圍的最大值 10 Dim case1, case2 As Single 11 If rdbMan.Checked = True Then 12 sex = "你" : waist = 90 13 case1 = 0.9 : case2 = 0.85 14 Else 15 sex = "妳" : waist = 80 16 case1 = 0.8 : case2 = 0.75 17 End If 2018/12/5
18 If Val(txtWaist.Text) > waist Then 19 show &= sex & "的腰圍太粗!" & vbNewLine 20 Else 21 show &= sex & "的腰圍正常!" & vbNewLine 22 End If 23 Select Case Val(txtWaist.Text) / Val(txtBottom.Text) 24 Case Is > case1 25 show &= "上半身肥胖屬蘋果型身材!" & vbNewLine 26 Case case2 To case1 27 show &= "WHR腰臀圍比例正常!" & vbNewLine 28 Case Is < case2 29 show &= "下半身肥胖屬梨子型身材!" & vbNewLine 30 End Select 2018/12/5
FileName : bodyCheck.sln 31 show &= IIf(chk1.Checked = True, "有", "沒有") & _ "遺傳的肥胖因子" & vbNewLine 32 show &= IIf(chk2.Checked = True, "有", "沒有") & _ "飲食習慣的肥胖因子" & vbNewLine 33 show &= IIf(chk3.Checked = True, "有", "沒有") & _ "缺乏運動的肥胖因子" & vbNewLine 34 show &= IIf(chk4.Checked = True, "有", "沒有") & _ "心理方面的肥胖因子" & vbNewLine 35 End If 36 MsgBox(show) 38 End Sub 2018/12/5
期中考(A) 2018/12/5
期中考(B) 2018/12/5