200 likes | 286 Views
第 8 章 模組化程式設計 I -副程式與自定函數. 大型程式. 模組 1. 模組 2. 模組 3. …. 模組 n. 一、模組化設計的概念. 模組 通常是指一段具有某種 特定功能、大小適中、容易 閱讀及維護的程式 將程式切割成許多個子功能 後,便可分別撰寫成模組程 式. 二、模組設計的原則. 設計功能單純的模組程式,以便提供給更多程式使用 儘量減少模組之間相互影響的程度,以使模組成為獨立的程式基本單元 將模組控制在適當的大小 ( 例如不超過 50 行敘述 ) ,以方便閱讀與維護. 模組 A. 模組 A'. 模組 B. 模組 B. 呼叫. 呼叫.
E N D
大型程式 模組1 模組2 模組3 … 模組n 一、模組化設計的概念 • 模組通常是指一段具有某種特定功能、大小適中、容易閱讀及維護的程式 • 將程式切割成許多個子功能後,便可分別撰寫成模組程式
二、模組設計的原則 • 設計功能單純的模組程式,以便提供給更多程式使用 • 儘量減少模組之間相互影響的程度,以使模組成為獨立的程式基本單元 • 將模組控制在適當的大小(例如不超過50行敘述),以方便閱讀與維護
模組A 模組A' 模組B 模組B 呼叫 呼叫 … … 產品編號的檢查規則改變時 模組F 模組F 呼叫 呼叫 … … 模組A具有檢查產品編號功能 只要修改模組A即可 三、使用模組的優點 • 程式易於測試與偵錯 • 可簡化維護的工作 • 模組可重覆使用 • 程式開發易於分工
程式專案P2 程式專案P1 表單檔 表單檔 模組檔 撰寫模組程式 匯入現有模組檔 模組檔 四、模組設計的方法 • 在專案中加入空白模組檔,撰寫副程式或自定函數,以設計模組程式(如左下圖) • 在專案中匯入某個專案中的模組檔(如右下圖)
… 呼叫 Call副程式A Sub副程式A End Sub 執行 …… ….. 返回 主程式 副程式 五、副程式(1/6) • 副程式是一段具有特定功能的程式區塊;它通常必須透過主程式的呼叫才能被啟動起來執行
五、副程式(2/6) • 語法:《定義副程式的語法》Sub副程式名稱 ([形式參數1 [As資料型別], 形式參數2 [As資料型別], …]) 程式敘述區塊End Sub 《呼叫副程式的語法》Call副程式名稱 ([實際參數1, 實際參數2, …])
五、副程式(3/6) • 範例:計算家庭用電費與營業用電費 Private Sub Form1_Activated…… 讀取用電類型 讀取用電量 If 用電類型為家庭用電 Then 呼叫副程式F_Expense( ) ElseIf用電類型為營業用電 Then 呼叫副程式C_Expense( ) End If End Sub '計算家庭用電費 SubF_Expense…… End Sub '計算營業用電費 SubC_Expense…… End Sub … … … 主程式 副程式
五、副程式(4/6) • 副程式F_Expense( ) Sub F_Expense(ByVal volume As Single) '計算家庭用電 110: Dim fee As Integer 120: If volume > 500 Then'用電量超過500度 130: fee = 110 * 2.1 + 390 * 2.875 + (volume - 500) * 3.6 140: ElseIf volume > 110 Then'用電量超過110度 150: fee = 110 * 2.1 + (volume - 110) * 2.875 160: Else'用電量在110度以內 170: fee = volume * 2.1 180: End If 190: MsgBox("電費為" & fee & " 元", , "電費試算") End Sub
五、副程式(5/6) • 副程式C_Expense( ) Sub C_Expense(ByVal volume As Single) '計算營業用電費 200: Dim fee As Integer 210: Const rate As Single = 3.1 220: fee = rate * volume '計算電費 230: MsgBox("電費為" & fee & " 元", , "電費試算") End Sub
五、副程式(6/6) • 主程式 Private Sub Form1_Activated(ByVal sender ……) Handles Me.Activated 10: Dim ecase As Short 20: Dim usage As Single 30: ecase = InputBox("請輸入用電類型:1)家庭用電2)營業用電", _ "電費試算") 40: usage = InputBox("請輸入用電量,單位:度", "電費試算") 50: If ecase = 1 Then 60: Call F_Expense(usage) '呼叫副程式計算家庭用電費 70: Else 80: Call C_Expense(usage) '呼叫副程式計算營業用電費 90: End If 100: End End Sub
主程式 自定函數 1.呼叫 Public ClassForm1 X = 自定函數A( ) End Class Function 自定函數A( ) AsShort 自定函數A = 100 End Function … … 2.執行 3.返回並將值100傳回給變數X … … 4.執行下一行程式敘述 六、自定函數(1/3) • 自定函數的功能與副程式類似;差別在於自定函數在執行結束後會產生一個傳回值給呼叫它的程式
六、自定函數(2/3) • 語法:《定義自定函數的語法》Function 自定函數名稱([形式參數1[As 資料型別], 形式參數2_[As 資料型別], …]) As 資料型別 程式敘述區塊自定函數名稱 = 傳回值End Function《呼叫自定函數的語法》 變數名稱 = 自定函數名稱([實際參數1, 實際參數2, …])
六、自定函數(3/3) • 範例:華氏溫度換算為攝氏溫度 Function Convert_temp(ByVal F As Short) As Short'F為形式參數 60: Convert_temp = (F - 32) * 5 / 9 '攝氏溫度= (華氏溫度- 32 ) * 5 / 9 End Function Private Sub Form1_Activated(ByVal sender …) Handles Me.Activated 10: Dim F_temp, C_temp As Short 20: F_temp = InputBox("請輸入華氏溫度:", "溫度換算") 30: C_temp = Convert_temp(F_temp) 'F_temp為實際參數 40: MsgBox("華氏" & F_temp & " 度= 攝氏" & C_temp & " 度", , _ "溫度換算") 50: End End Sub
隨機不重覆 Dim rnd_n As Short Dim ck(4) As Short For i = 1 To 4 rnd_n = Int(Rnd() * 4) + 1 Do While ck(rnd_n) = 1 rnd_n = Int(Rnd() * 4) + 1 Loop N(i) = rnd_n ck(rnd_n) = 1 Next
副程式(版本一) Sub Generate_Random_Number() Dim rnd_n As Short Dim ck(4) As Short For i = 1 To 4 rnd_n = Int(Rnd() * 4) + 1 Do While ck(rnd_n) = 1 rnd_n = Int(Rnd() * 4) + 1 Loop N(i) = rnd_n ck(rnd_n) = 1 Next End sub 使用方法:Call Generate_Random_Number()
副程式(版本二-加入模組) Sub Generate_Random_Number() Dim rnd_n As Short Dim ck(4) As Short For i = 1 To 4 rnd_n = Int(Rnd() * 4) + 1 Do While ck(rnd_n) = 1 rnd_n = Int(Rnd() * 4) + 1 Loop Form1.N(i) = rnd_n ck(rnd_n) = 1 Next End sub 使用方法:1. 在專案中加入空白模組檔”Module1.vb” 2. Public N(4) as short 3. Call Generate_Random_Number()
副程式(版本三-加入參數) Sub Generate_Random_Number(ByVal num as short) Dim rnd_n As Short Dim ck(4) As Short For i = 1 To num rnd_n = Int(Rnd() * num) + 1 Do While ck(rnd_n) = 1 rnd_n = Int(Rnd() * num) + 1 Loop Form1.N(i) = rnd_n ck(rnd_n) = 1 Next End sub 使用方法:1. 在專案中加入空白模組檔”Module1.vb” 2. Public N(4) as short 3. Call Generate_Random_Number(4)
副程式(版本四-加入陣列參數) Sub Generate_Random_Number(ByVal k() as short, ByVal num as short) Dim rnd_n As Short Dim ck(4) As Short For i = 1 To num rnd_n = Int(Rnd() * num) + 1 Do While ck(rnd_n) = 1 rnd_n = Int(Rnd() * num) + 1 Loop K(i)= rnd_n ck(rnd_n) = 1 Next End sub 使用方法:1. 在專案中加入空白模組檔”Module1.vb” 2. Public N(4) as short 3. Call Generate_Random_Number(4)
自定函數 Function money(ByVal all As Integer, ByVal ans As Boolean) As Integer Dim rate As Integer If RadioButton1.Checked = True Then rate = 1 ElseIf RadioButton2.Checked = True Then rate = 10 ElseIf RadioButton3.Checked = True Then rate = 100 ElseIf RadioButton4.Checked = True Then rate = 1000 End If If ans = True Then all = all + rate Else all = all - rate End If money = all End Function 使用方法: all_money = money(all_money, ans)