Transcript 副程式

程式語言 (Ⅱ) -Visual Basic 6.0
第 9 章 結構化程式設計
一、結構化程式設計的概念 (1)
:
a
:
goto
:
c
:
goto
:
b
:
goto
:
d
:
goto
:
e
goto
:
b
d
e
a
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為實際參數
End Sub
七、副程式(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)
語法:
《定義自定函數的語法》
Function 函數名稱 [(參數1 As 資料型別,
參數2 As 資料型別,..)] As資料型別
程式敘述區塊
函數名稱=傳回值
End Function
《呼叫自定函數的語法》
變數名稱 = 自定函數名稱[(參數1, 參數2,…)}
九、自定函數(2)
 範例:計算圓面積
Function Cal_Circle(r As Single) As Single
Const pi = 3.14159
Cal_Circle = r ^ 2 * pi
End Function
'r為形式參數
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並按確定鈕,
啟動Click事件程序
右側程式行號:
30執行結果
60執行結果
80執行結果
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

呼叫副程式,將實際參數a的位址
(0006)傳遞給副程式
50執行結果

Sub
60
70
80
End
副程式由位址0006,取用實際參
數a的值(5),經運算後變為25
記憶體內容
記憶體位址
cal(ByRef x As Single)
Label2.Caption = x
x=x^2
Label3.Caption = x
Sub
5→25
實際參數a
形式參數x
佔用同一個記憶體位址(0006)
十、參數的傳遞(4)
傳值呼叫是一種形式參數與實際參數佔用
不同記憶體位址的參數傳遞方式
若要以傳值的方式來呼叫副程式或函數,
可使用下列兩種方法來設定:
 在形式參數前加上 "ByVal"
 在實際參數前後加上小括號
十、參數的傳遞(5)

輸入數值5並按確定鈕,
啟動Click事件程序
右側程式行號:
30執行結果
60執行結果
80執行結果
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

呼叫副程式,a的值(5)會傳遞給
副程式,並複製到形式參數X中
50執行結果

記憶體內容
5
副程式運算後,形式
參數X的值改變為25
Sub
60
70
80
End
cal(ByVal x As Single)
Label2.Caption = x
x=x^2
Label3.Caption = x
Sub
5→25
記憶體位址
實際參數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"
End Sub
Private Sub Command1_Click( )
Call Show1
Call Show2
Call Module1.Show1
Call Module1.Show2
End Sub
╳
表單模組(Form1)


Public Sub Show1( )
Form1.Label1(2).Caption = "M"
End Sub
Private Sub show2( )
Form1.Label1(3).Caption = "M"
End Sub
一般模組(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 模組的一般宣告區
宣告型態
Public
Dim
Private
VB 模組中的程序
Static
Dim
變數類型 全域變數
模組區域變數 靜態變數 程序區域變數
活動範圍 整個專案
宣告它的模組
生
命
期
生
滅
宣告它的程序
變數宣告敘述執行時
應用程式執行結束時
程序執行結束