程式語言(I)- Visual Basic 6.0 第 9 章 結構化程式設計
一、結構化程式設計的概念 (1) 主程式 : 呼叫副程式a 呼叫副程式b 副程式a : End a 副程式b : End b goto b c goto d b goto e d goto a e goto c 主程式 : 呼叫副程式a 呼叫副程式b 副程式a : End a 副程式b : End b 未使用結構化程式設計的程式 使用結構化程式設計的程式
一、結構化程式設計的概念 (2) 未使用結構化程式設計的缺點: 個人的設計風格 隨意使用GoTo敘述
一、結構化程式設計的概念 (3) 結構化程式設計的原則: 遵循由上到下的程式設計 模組化的程式設計 使用程式基本結構
二、由上到下的程式設計 由整個程式的主要功能開始設計,然後再依序往下設計各個子功能 … 檢查 記錄
三、模組化的程式設計 模組 (module)通常是指一段 具有某種特定功能、大小適 中、容易閱讀及維護的程式 將程式切割成許多個子功能 後,便可分別撰寫成模組程 式 模組1 模組2 模組3 模組n 大型程式 .
四、設計模組時應儘量遵循的原則 設計功能單純的模組程式,以便提供給更多程式使用 儘量減少模組之間相互影響的程度,以使模組成為獨立的程式基本單元 將模組控制在適當的大小(例如不超過50行敘述),以方便閱讀與維護
五、使用模組的優點 模組可重覆使用 程式開發易於分工 程式易於測試與偵錯 可簡化維護的工作
六、使用程式基本結構
七、副程式(1) 副程式(subprogram)是一段可用來執行特定功能的程式敘述,它通常必須透過主程式(main program)的呼叫才能被啟動起來執行
七、副程式(2) 語法: 《定義副程式的語法》 Sub 副程式名稱[(參數1 [As 資料型別], 參數2 [As 資料型別], …)] 程式敘述區塊 End Sub 《呼叫副程式的語法》 Call副程式名稱[(參數1,參數,2,…)]
七、副程式(3) 範例:華氏溫度換算為攝氏溫度 Sub Change_temp(F As Integer) 'F為形式參數 Dim C As Integer C = (F - 32) * 5 / 9 MsgBox "華氏 " & F & " 度 = 攝氏 " & C & " 度", , "溫度換算" End Sub Private Sub Form_Activate( ) Dim F_temp As Integer F_temp = InputBox("請輸入華氏溫度:", "溫度換算") Call Change_temp(F_temp) 'F_temp為實際參數
七、副程式(4) 在Sub敘述中的參數,稱為形式參數 在Call敘述中的參數,稱為實際參數 若兩者參數的資料型別不符,VB會以形式參數的資料型別為準 形式參數 Sub Sum_x(x As Integer) For I=1 to x … End Sub Private Sub Command1_Click() Call Sum_x(10) … End Sub 實際參數
八、函數 函數 (function) 的功能與副程式類似;不同的是,函數在執行結束後會產生一個傳回值給呼叫它的程式 VB 的函數種類: 內建的函數(build-in function) :例如 Input() 函數、Rnd() 函數、Str() 函數 自定函數 (user-defined function) :即依實際需要所自行撰寫函數
九、自定函數(1) 語法: 《定義自定函數的語法》 《呼叫自定函數的語法》 變數名稱 = 自定函數名稱[(參數1, 參數2,…)} Function 函數名稱 [(參數1 As 資料型別, 參數2 As 資料型別,..)] As資料型別 程式敘述區塊 函數名稱=傳回值 End Function 《呼叫自定函數的語法》 變數名稱 = 自定函數名稱[(參數1, 參數2,…)}
九、自定函數(2) 範例:計算圓面積 Function Cal_Circle(r As Single) As Single 'r為形式參數 Const pi = 3.14159 Cal_Circle = r ^ 2 * pi End Function Private Sub Form_Activate( ) Dim X As Single Dim area As Single X = InputBox("請輸入圓的半徑:", "計算圓面積") area = Cal_Circle(X) 'X為實際參數 MsgBox "半徑為 " & X & " 的圓面積 = " & area, , "計算圓面積" End Sub
十、參數的傳遞(1) 在呼叫副程式或函數時,VB 會將實際參數傳給副程式或函數並由形式參數承接 VB 提供傳址 (pass by reference) 與傳值 (pass by value) 兩種傳遞參數的方式
十、參數的傳遞(2) 傳址呼叫是一種形式參數與實際參數佔用同一個記憶體位址的參數傳遞方式 若要以傳址的方式來呼叫副程式或函數,可在副程式或函數參數前加上 "ByRef" 由於傳址的方式是 VB 預設參數的傳遞方式,因此 "ByRef" 可省略不寫
十、參數的傳遞(3) 5→25 輸入數值5並按確定鈕,啟動Click事件程序 Private Sub Command1_Click( ) 10 Dim a As Single 20 a = Text1.Text 30 Label1.Caption = a 40 Call cal(a) 50 Label4.Caption = a End Sub Sub cal(ByRef x As Single) 60 Label2.Caption = x 70 x = x ^ 2 80 Label3.Caption = x 輸入數值5並按確定鈕,啟動Click事件程序 副程式由位址0006,取用實際參數a的值(5),經運算後變為25 右側程式行號: 30執行結果 60執行結果 80執行結果 50執行結果 5→25 記憶體內容 記憶體位址 實際參數a 形式參數x 佔用同一個記憶體位址(0006) 呼叫副程式,將實際參數a的位址(0006)傳遞給副程式
十、參數的傳遞(4) 傳值呼叫是一種形式參數與實際參數佔用不同記憶體位址的參數傳遞方式 若要以傳值的方式來呼叫副程式或函數,可使用下列兩種方法來設定: 在形式參數前加上 "ByVal" 在實際參數前後加上小括號
十、參數的傳遞(5) 輸入數值5並按確定鈕,啟動Click事件程序 Private Sub Command1_Click( ) 呼叫副程式,a的值(5)會傳遞給副程式,並複製到形式參數X中 Private Sub Command1_Click( ) 10 Dim a As Single 20 a = Text1.Text 30 Label1.Caption = a 40 Call cal(a) 50 Label4.Caption = a End Sub Sub cal(ByVal x As Single) 60 Label2.Caption = x 70 x = x ^ 2 80 Label3.Caption = x 輸入數值5並按確定鈕,啟動Click事件程序 副程式運算後,形式參數X的值改變為25 右側程式行號: 30執行結果 60執行結果 80執行結果 50執行結果 記憶體內容 記憶體位址 5→25 5 實際參數a 形式參數x
十、參數的傳遞(6) 傳址 傳值 參數傳遞方式的設定 在形式參數前加上ByRef 或不加 在形式參數前加上 ByVal 或在實際參數前後的加上小括號 機制 將實際參數所在的記憶體位址傳至形式參數中,然後副程式或函數使用該位址上的值 將實際參數的值複製至形式參數中,然後副程式或函數使用形式參數的值 副程式和函數對實際參數的影響 實際參數的內容可被副程式及函數改變 實際參數的內容不會被副程式和函數改變 陣列參數的使用 可使用整個陣列或陣列元素 只可使用陣列元素 應用範例 如商品要調整售價時,可使用傳址的方式呼叫調價副程式,在副程式中更新商品售價,使主程式中的商品售價隨之改變 如要將商品售價顯示成他國幣值,可使用傳值的方式,呼叫可根據各國匯率計算不同商品幣值售價的副程式,但主程式的商品售價仍為本國幣值且價格不會更改 參數傳遞方式 比較項目
十一、VB模組的種類 表單模組: 用來設計程式的視窗外觀。其可包含變數的宣告、副程式、函數、控制物件的事件程序及屬性設定等。副檔名為 *.frm 一般模組: 通常用來撰寫會被共同使用的變數宣告、副程式或函數等 (無法撰寫事件程序)。副檔名為*.bas 物件類別模組: 可用來定義新的物件類別,並自定其屬性、方法及事件等。副檔名為 *.cls
十二、模組中的程序活動範圍(1) 程序依其在專案中的活動範圍,可分為私有程序及公有程序兩種 在 VB 中,凡程序前加上保留字 Private的程序,即稱為私有程序。該程序只能被同一模組中的其它程序呼叫 在 VB 中,凡程序前加上保留字 Public (或不加任何保留字) 的程序,即稱為公有程序
十二、模組中的程序活動範圍(2) 呼叫公有程序時,需注意下列幾點: 呼叫同模組間的公有程序時,可直接使用程序名稱;若其他模組中亦有相同名稱的程序,則 VB 會優先呼叫同模組中的程序 跨模組呼叫表單模組中的公有程序時,需在程序名稱前加上表單模組的名稱 跨模組呼叫一般模組中的公有程序時,若在不同模組中有相同名稱的程序時,則需在程序名稱前加上一般模組的名稱
十二、模組中的程序活動範圍(3) 《程式》 ╳ Public Sub Show1( ) Label1(0).Caption = "F" End Sub Private Sub Show2( ) Label1(1).Caption = "F" Private Sub Command1_Click( ) Call Show1 Call Show2 Call Module1.Show1 Call Module1.Show2 Form1.Label1(2).Caption = "M" Private Sub show2( ) Form1.Label1(3).Caption = "M" 表單模組(Form1) 一般模組(Module1) ╳
十二、模組中的程序活動範圍(4) 《執行結果》 按開始鈕,執行Command1_Click事件程序 在一般模組中的Show2( )為私有程序,故無法被表單模組中的Command1_ Click事件程序呼叫
十三、變數的活動範圍(1) 在 VB 中,變數所能被使用的範圍稱為變數的活動範圍 (scope) 依照活動範圍區分,可將變數分為: 全域變數 (global variable) 區域變數 (local variable)
十三、變數的活動範圍(2) 在 VB 的三種模組中都可宣告全域變數 全域變數的活動範圍為整個專案,其可被專案中的任何程式敘述使用 宣告全域變數的語法如下: Public 變數名稱 As 資料型別 例:Public grade As Integer
十三、變數的活動範圍(3) 區域變數可以宣告在模組的一般宣告區或程序中。其中模組區域變數的活動範圍為宣告它的模組;而程序區域變數的活動範圍則為宣告它的程序 宣告區域變數的語法如下: 模組區域變數 (宣告於模組的一般宣告區中) Private (或 Dim) 變數名稱 As 資料型別 程序區域變數 (宣告於程序中) Dim 變數名稱 As 資料型別
十四、變數的生命週期(1) 變數從開始佔用記憶體到釋放記憶體的這段期間,稱之為變數的生命期 凡宣告於模組一般宣告區中的全域變數及區域變數,其生命期從宣告敘述至應用程式執行結束 凡宣告於副程式、函數或事件程序中的區域變數,其生命期從宣告敘述至程序執行結束
十四、變數的生命週期(2) 為了讓程序區域變數在宣告它的程序執行結束後還能保有其值,我們可以將其宣告為靜態變數,使其生命期延長至應用程式執行結束 宣告靜態變數的語法如下: Static 變數名稱 As 資料型別 例:Static i As Integer
十四、變數的生命週期(3) 宣告位置 VB 模組的一般宣告區 VB 模組中的程序 宣告型態 Public Dim Private Static 變數類型 全域變數 模組區域變數 靜態變數 程序區域變數 活動範圍 整個專案 宣告它的模組 宣告它的程序 生命期 生 變數宣告敘述執行時 滅 應用程式執行結束時 程序執行結束