Transcript 第八章

第八章
程序(副程式)
課程名稱:程式設計
授課老師:李春雄 博士
本章學習目標
1.讓讀者瞭解主程式與副程式的呼叫方式及如何
傳遞參數。
2.讓讀者瞭解傳值呼叫與傳址呼叫的呼叫方式。
3.讓讀者瞭解副程式與函數的差異及如何建立模組。
本章內容
8-1 副程式
8-2 副程式的參數宣告及傳遞
8-3傳值呼叫(Call By Value)
8-4 傳址呼叫(Call By Address)
8-5 函數(Function)
8-6 模組(Modules)
8-1 副程式
【引言】
當我們在撰寫程式時,都不希望重複撰寫類似的程式。因此,最簡單的
作法,就是把某些會「重複的程式」獨立出來,這個獨立出來的程式就
稱做副程式(Subroutine)或函數(Function)。
【定義】是指具有獨立功能的程式區塊。
【作法】把一些常用且重複撰寫的程式碼,集中在一個獨立程式中。
【示意圖】
【分類】
【副程式的運作原理】
一般而言,「原呼叫的程式」稱之為「主程式」,而「被呼叫的程式」
稱之為「副程式」。當主程式在呼叫副程式的時候,會把「實際參數」
傳遞給副程式的「形式參數」,而當副程式執行完成之後,又會回到主
程式呼叫副程式的「下一行程式」開始執行下去。
【圖解說明】
副程式的【優缺點】
【優點】
1. 可以使程式更簡化,因為把重覆的程式模組化。
2. 增加程式可讀性。
3. 提高程式維護性。
4. 節省程式所佔用的記憶體空間。
5. 節省重覆撰寫程式的時間。
【缺點】
降低執行效率,因為程式會Call來Call去。
【實作】
請設計一個主程式呼叫一支副程式,如果成功的話,顯示「副程式測試
ok!」
【參考解答】
程式檔案名稱
01
ch8-1.b4a
Sub btnRun_Click
02
'主程式
03
CallMySub
04
End Sub
05
Sub CallMySub()
'呼叫副程式
'被呼叫的副程式
06
'副程式
07
Msgbox("副程式測試ok!","測試結果")
08
End Sub
【注意】
主程式呼叫副程式時,不一定要傳遞參數,如上面的例子中,主程式中
的Call MySub中並沒有參數的傳遞。
8-2 副程式的參數宣告及傳遞
【目的】提高副程式的實用性與彈性。
【作法】 在呼叫「副程式」的同時,「主程式」會傳遞參數給「副程式」。
【語法】 Sub 副程式名稱(參數1 As 資料型態, 參數2 As 資料型態,…)
程式區塊
End Sub
【範例1】含有「一個字串參數」的副程式
Sub MySub1(Str As String)
-------------End Sub
【範例2】含有「兩個整數參數」的副程式
Sub MySub2(X As Int,Y As Int)
-------------End Sub
【註】即使X與Y參數的資料型態相同,也不可以合併宣告。否則會產生錯誤。
【實作】
請寫一個主程式將「姓名」傳遞給第一支副程式,及「二科成績」傳遞
給第二支副程式計算平均成績。
【參考解答】
8-3 傳值呼叫(Call By Value)
【定義】
是指「主程式」呼叫「副程式」時,「主程式」會將實際參數的「值」
傳給「副程式」的形式參數,而不是傳送位址。
【運作原理】
【說明】
在副程式中改變了形式參數的值(內容)時,也不會影響到主程式的實際
參數值(內容)。
【語法】
Sub 副程式名稱(參數1 As 資料型態, 參數2 As 資料型態,…)
程式區塊
End Sub
【實作1】
請撰寫一支主程式傳遞兩個整數給副程式,並列印主程式的這兩個整數值。
【執行結果】5 10
【實作2】
請設計一個「傳值呼叫」的介面,可以讓使用者輸入兩個參數值。
【執行結果與分析】5 10 0
【參考解答】
程式檔案名稱
01
ch8-3A.b4a
Sub btnRun_Click
02
Dim X,Y, Result As Int
03
Dim Temp As String
04
X = edtNum1.Text
05
Y = edtNum2.Text
06
Temp = "「傳值呼叫」呼叫前" & CRLF
07
Temp = Temp & "----------------------------" & CRLF
08
Temp = Temp & "X=" & X & "
09
CallByValue(X,Y,Result) '呼叫副程式
10
lblResult.Text = "X=" & X & " Y=" & Y
11
Temp = Temp & "「傳值呼叫」呼叫後" & CRLF
12
Temp = Temp & "----------------------------" & CRLF
13
Temp = Temp & "X=" & X & "
14
lblResult.Text = Temp
" & "Y=" & Y & "
" & "Y=" & Y & "
15
End Sub
16
Sub CallByValue(A As Int, B As Int,Add) '副程式
17
A = 15
18
B = 30
19
Add = A + B
20
End Sub
" & "Add=" & Result & CRLF
" & "Add=" & Result
8-4 傳址呼叫(Call By Address)
【定義】
是指主程式呼叫副程式時,主程式會將實際參數的「位址」傳給副程式的形式
參數,使得主程式與副程式共用相同的記憶體位址。
【運作原理】
【說明】
一旦副程式中改變了形式參數的值(內容)時,也將隨之影響到主程式的實際參數
值(內容)。因此,在使用傳址呼叫時不能使用常數做為參數。
【語法】 Sub 副程式名稱(陣列參數1 As 資料型態, 陣列參數2 As 資料型態,…)
程式區塊
End Sub
【實作1】
請撰寫一支主程式傳遞兩個整數給副程式,並列印主程式的這兩個整數值。
【執行結果】15 30
【實作】
請設計一個「傳址呼叫」的介面,可以讓使用者輸入兩個參數值。
【參考解答】
程式檔案名稱
01
ch8-4A.b4a
Sub btnRun_Click
02
Dim X(1), Y(1), Result(1) As Int
03
Dim Temp As String
04
X(0) = edtNum1.Text
05
Y(0) = edtNum2.Text
06
Result(0)=X(0)+Y(0)
07
Temp = "「傳址呼叫」呼叫前" & CRLF
08
Temp = Temp & "-------------------------------------" & CRLF
09
Temp = Temp & "X=" & X(0) & "
10
CallByAddress(X,Y,Result) '呼叫副程式
11
lblResult.Text = "X=" & X(0) & " Y=" & Y(0)
12
Temp = Temp & "「傳址呼叫」呼叫後" & CRLF
13
Temp = Temp & "-------------------------------------" & CRLF
14
Temp = Temp & "X=" & X(0) & "
15
lblResult.Text = Temp
16
" & "Y=" & Y(0) & "
" & "Y=" & Y(0) & "
" & "Add=" & Result(0) & CRLF
" & "Add=" & Result(0)
End Sub
17
18
Sub CallByAddress(A() As Int, B() As Int,Add() As Int) '副程式
19
A(0) = 15
20
B(0) = 30
21
Add(0) = A(0) + B(0)
22
End Sub
8-5 函數(Function)
【定義】
函數是另一種特殊形式的副程式,這種副程式有些存在於B4A語言系統
裡,稱為「內建函數」。其完整的內建函數介紹,請參考第九章。
【例如】Abs(取絕對值), Rnd(取亂數值)等等,就是B4A的內建函數。
【副程式(Sub)與函數(Function)之差異】
1. 副程式不會傳回值。
2. 函數可以指定傳回值的資料型態給主程式。
【示意圖】
【注意】B4A語言並不支援VB語言中的Function/End Function。
【範例】
請撰寫一個「取絕對值」的程式來比較「副程式」「函數」的差異
【參考解答】
8-6 模組(Modules)
【引言】
我們都知道,開發一套功能完整的大型資訊系統,其最大困難處在於系統錯綜
複雜,開發者往往不知該如何下手。
【定義】是指由一連串程式指令的集合。
【最常採用的方法】利用「模組化」的方法來解決問題。
【定義】是指將一個「大系統」分解成許多個具有「獨立功能」的「小模組」。
【示意圖】
模組的【優、缺點】
【優點】
1.程式容易閱讀與了解。
2.減少程式維護成本。
3.減少程式邏輯錯誤。
4.提高程式設計的生產力。
5.降低程式的複雜性及測試時間。
【缺點】
1.程式比較多,故比較佔用記憶體空間。
2.程式比較多,故執行速度比較慢。
【B4A環境中的四種模組】
1. 活動模組(Activity Module)
2. 程式碼模組(Code Module)
3. 類別模組(Class Module)
4. 服務模組(Service Module)
以上四種模組中,第1種與第2種最常被使用。
8-6.1 活動模組(Activity Module)
【定義】是指B4A預設的模組,也就是Main活動模組。
【注意】
Main活動模組是無法讓使用者修改及刪除。但是,如果你新增的其他
名稱的活動模組(Main1),則可以讓使用者修改及刪除。
【主要功能】
負責處理Android APP活動中的生命週期及介面的呈現方式等等。
【新增「活動模組」作法】
【實作】
請在活動模組中撰寫一個程式來計算「二科成績」之平均成績。
8-6.2 程式碼模組(Code Module)
【定義】是指用來建立「函式庫」的程式碼。
【注意】新增的程式碼模組,允許讓使用者修改名稱及刪除。
【主要功能】
提供Android APP專案中所有模組來呼叫使用此模組的功能。
【新增「程式碼模組」作法】
此時,B4A整合開發環境的右邊的「模組清單」會自動建立一個「MyFunction」
程式碼模組名稱,以便提供給專案中的其他模組呼叫使用。
再按「儲存」之後,你的專案資料夾中就會自動產生一個MyFunction.bas的檔
案。如下圖所示:
【「程式碼模組」的實際應用】
請寫一個主程式將「二科成績」傳遞給「程式碼模組」來計算平均成績。
【參考解答】
【說明】
行號05:主程式要呼叫MyScore副程式時,由MyScore是屬於「程式碼模組」中的功能。所以,必
須要在副程式(MyScore)的前面上加「MyFunction.」。並且會將兩個參數傳遞給副程式。
行號10~18:程式碼模組中的「MyScore」副程式,執行後的結果會在回傳給原呼叫它的主程式。
行號06~07:顯示列印出同學的平均成績。
8-6.3 類別模組(Class Module)
【定義】是指用來建立「類別模組」的程式碼。
【新增「類別模組」作法】
此時,B4A整合開發環境的右邊的「模組清單」會自動建立一個
「MyClassFunction」類別模組名稱,以便提供給專案中的其他模組呼叫使用。
再按「儲存」之後,你的專案資料夾中就會自動產生一個
MyClassFunction.bas的檔案。如下圖所示:
【「程式碼模組」的實際應用】
請寫一個主程式將「二科成績」傳遞給「類別模組」來計算平均成績。
程式檔案名稱
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ch8-6.3.b4a
Sub btnRun_Click
'主程式(Main)
Dim MyScore As MyClassFunction
MyScore.Initialize("李安", 90,100)
Msgbox2(MyScore.GetName & "同學的平均成績: " &
MyScore.GetMyScore ,"公佈成績","","","",Null)
End Sub
'============================================
' MyClassFunction類別模組
Sub Class_Globals
Private Name As String
Private Eng_Score As Int
Private Math_Score As Int
Public GetMyScore As Int
End Sub
Public Sub Initialize(MyName As String,MyEng_Score As Int,MyMath_Score As Int)
Name=MyName
Eng_Score=MyEng_Score
Math_Score=MyMath_Score
GetMyScore=(Eng_Score+Math_Score)/2
Return GetMyScore
End Sub
Public Sub GetName As String
Return Name
End Sub