程式語言(I)- Visual Basic 6.0 第 8 章 模組化程式設計I-副程式與自定函數
一、模組化設計的概念 模組通常是指一段具有某種 特定功能、大小適中、容易 閱讀及維護的程式 將程式切割成許多個子功能 後,便可分別撰寫成模組程 式 模組1 模組2 模組3 模組n 大型程式 …
二、模組設計的原則 設計功能單純的模組程式,以便提供給更多程式使用 儘量減少模組之間相互影響的程度,以使模組成為獨立的程式基本單元 將模組控制在適當的大小(例如不超過50行敘述),以方便閱讀與維護
三、使用模組的優點 模組可重覆使用 程式開發易於分工 程式易於測試與偵錯 可簡化維護的工作 模組A 模組B 模組F … 模組A' 呼叫 模組A 模組B 模組F … 模組A' 模組A具有檢查產品編號功能 產品編號的檢查規則改變時 只要修改模組A即可
四、模組設計的方法 在專案中加入空白模組檔,撰寫副程式或自定函數,以設計模組程式(如左下圖) 在專案中匯入某個專案中的模組檔(如右下圖) 表單檔 模組檔 程式專案P1 程式專案P2 匯入現有模組檔 撰寫模組程式
五、副程式(1/6) 副程式是一段具有特定功能的程式區塊;它通常必須透過主程式的呼叫才能被啟動起來執行 … …… ….. 呼叫 執行 返回 Call 副程式A 呼叫 Sub 副程式A End Sub … …… ….. 執行 返回 主程式 副程式
五、副程式(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 '計算家庭用電費 Sub F_Expense…… End Sub '計算營業用電費 Sub C_Expense…… … … … 主程式 副程式
五、副程式(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/3) 自定函數的功能與副程式類似;差別在於自定函數在執行結束後會產生一個傳回值給呼叫它的程式 1.呼叫 2.執行 主程式 Public Class Form1 X = 自定函數A( ) End Class 自定函數 Function 自定函數A( ) As Short 自定函數A = 100 End Function 3.返回並將值100傳回給變數X 2.執行 4.執行下一行程式敘述 … …
六、自定函數(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 ck(4) As Short For i = 1 To 4 rnd_n = Int(Rnd() * 4) + 1 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 Loop N(i) = rnd_n ck(rnd_n) = 1 Next
副程式(版本一) Sub Generate_Random_Number() 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 Loop N(i) = rnd_n ck(rnd_n) = 1 Next End sub 使用方法:Call Generate_Random_Number()
副程式(版本二-加入模組) Sub Generate_Random_Number() 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 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) End sub 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 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 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)
自定函數 使用方法: all_money = money(all_money, ans) 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 money = all End Function 使用方法: all_money = money(all_money, ans)