Download presentation
Presentation is loading. Please wait.
Published byCornelia Jaeger Modified 5年之前
1
第7章 程序與函數 7-1 模組化程式設計 7-2 程序與函數 7-3 程序與函數的變數範圍 7-4 常用的內建函數 7-5 遞迴函數
2
7-1 模組化程式設計 7-1-1 模組的基礎 7-1-2 程序與函數是一個黑盒子
3
7-1-1 模組的基礎 模組化是把大型功能切割成無數子功能,至於如何切割成一個個子功能的模組(即Visual Basic的模組),屬於結構化分析的範疇,我們最常使用的是由上而下設計方法。 模組化程式設計是將大程式切割成一個個小程式。以Visual Basic來說,模組化的基本單位是程序與函數,因為模組可大可小,可能只擁有單一程序或函數,也可能是整個子功能的函式庫。 不過,每一個程序和函數都可以解決一個小問題,等到所以小問題都解決了,使用程序與函數堆積成的軟體系統或應用程式也就開發完成。
4
7-1-2 程序與函數是一個黑盒子-說明 程序與函數是一個程式區塊,執行程序與函數稱為函數呼叫(Functions Call),擁有傳回值的程序稱為「函數」(Functions)。 在呼叫時,我們並不需要了解程序與函數內部實際的程式碼,事實上,也不需要知道其細節。程序與函數如同一個「黑盒子」(Black Box),只要告訴我們如何使用黑盒子的「使用介面」(Interface)即可。
5
7-1-2 程序與函數是一個黑盒子-圖例 程式碼只知道呼叫程序時,需要傳入的參數和取得傳回值。它是程序函數和外部溝通的使用介面,一個對外的邊界,實際程式碼內容是隱藏在使用介面後,我們將程序與函數實際內容的程式碼撰寫稱為「實作」(Implementation)。
6
7-1-2 程序與函數是一個黑盒子-撰寫規則 程序與函數的使用介面需要直接、良好定義和容易了解。
在呼叫程序與函數時,並不需要知道任何有關內部實作的問題,唯一需要知道的是如何使用它的使用介面。 在實作程序與函數時,並不用考量或知道到底是誰需要使用它,只需滿足使用介面定義的輸入參數和傳回值即可。
7
7-1-2 程序與函數是一個黑盒子-語法與語意 程序與函數的「語法」(Syntax)是說明程序與函數需要傳入何種資料型別的「參數」(Parameters)和傳回值。 「語意」(Semantic)是指出程序與函數可以作什麼事?換句話說,在撰寫程序與函數時,需要了解其語法規則,而在使用程序與函數時需要了解其語意規則,如此才能正確呼叫程序與函數。
8
7-2 程序與函數 7-2-1 建立Sub程序 7-2-2 建立Function函數 7-2-3 擁有參數的程序與函數
ViLLE – 4.1 建立Sub程序 7-2-2 建立Function函數 ViLLE – 4.2 建立Function函數 7-2-3 擁有參數的程序與函數 ViLLE – 4.3 擁有參數的程序與函數 7-2-4 傳值或傳址呼叫程序與函數 7-2-5 強迫跳出程序與函數
9
7-2 程序與函數 程序與函數可以將程式中,一些常用的共同程式碼獨立成區塊,也就是建立結構化程式設計的模組。
Visual Basic程序可以分為兩種,如下: 事件處理程序:事件處理程序是處理指定事件的程序(一定是Sub,因為不會有傳回值)。 一般程序:將程式區塊使用一個程序或函數名稱來代替,以便呼叫程序與函數來執行特定功能。Visual Basic程序分為Sub程序和Function函數兩種。
10
7-2-1 建立Sub程序-建立程序(說明) Visual Basic語言的程序是使用Sub和End Sub包圍的程式區塊,在Sub關鍵字後是程序名稱,程序並沒有傳回值。 在Visual Basic程式建立程序的語法,如下所示: [Public | Private] Sub 名稱 程式區塊 End Sub 上述Sub指令前的Public或Private是存取修飾子。
11
7-2-1 建立Sub程序-建立程序(範例) 程序名稱的命名和變數名稱相同,在同一模組不能使用相同的程序名稱。例如:顯示圖書書名的程序,如下所示: Sub PrintBookTitle() Dim title As String title = "Visual Basic程式設計" lblOutput.Text = title & vbNewLine End Sub
12
7-2-1 建立Sub程序-呼叫程序 在程式碼呼叫程序是使用Call關鍵字,我們只需在其後加上程序名稱即可,如下所示:
Call PrintBookTitle() 上述程序呼叫因為程序沒有參數,可以省略括號,或不使用Call關鍵字也可以,如下所示: PrintBookTitle 上述程式碼也是呼叫程序PrintBookTitle()。
13
7-2-1 建立Sub程序- Visual Basic專案
Visual Basic專案:Ch7-2-1 在Windows應用程式建立PrintAuthor()和PrintBookTitle()程序後,在事件處理程序呼叫這2個程序 ,如下圖所示:
14
7-2-1 建立Sub程序-程序的執行過程 Visual Basic程式碼是如何執行程序與函數?以本節程式範例Button1_Click()事件處理程序的執行順序為例,程式是在第2列呼叫PrintBookTitle()程序,其執行順序就是跳到此程序的第1列,在執行完第5列後返回呼叫點,如下圖所示:
15
ViLLE – 4.1 建立Sub程序 請啟動ViLLE,在【四. 程序與函數】目錄下,選【1. 建立Sub程序】,按【Run】鈕模擬執行此範例程式,如下圖所示:
16
7-2-2 建立Function函數- 建立函數(說明)
Function函數類似Sub程序只是改為使用Function和End Function包圍,其主要差異是函數有傳回值。 在Visual Basic程式的函數語法,如下所示: [Public | Private] Function 名稱 [As 資料型別] 程式區塊 Return 值 | 名稱 = 值 End Function As之後是傳回值的資料型別。函數傳回值是使用Return關鍵字來傳回值,或將函數名稱指定成需要傳回的值。
17
7-2-2 建立Function函數- 建立函數(範例)
例如:計算體脂肪BMI值的BMI()函數,如下所示: Function BMI() Dim result, h, w As Double h = CDbl(txtHeight.Text) w = CDbl(txtWeight.Text) result = w / ( h * h ) Return result End Function 上述函數使用Return傳回最後結果。
18
函數因為擁有傳回值,通常都是在指定敘述來執行函數呼叫,並且位在指定敘述的右邊,如下所示:
7-2-2 建立Function函數-呼叫函數 函數因為擁有傳回值,通常都是在指定敘述來執行函數呼叫,並且位在指定敘述的右邊,如下所示: lblOutput.Text = BMI() 將上述lblOutput標籤控制項的Text屬性指定成函數的傳回值。
19
7-2-2 建立Function函數-Visual Basic專案
Visual Basic專案:Ch7-2-2 在Windows應用程式輸入身高和體重後,可以計算體脂肪的BMI值,如下圖所示:
20
ViLLE – 4.2 建立Function函數 請啟動ViLLE,在【四. 程序與函數】目錄下,選【2. 建立Function函數】,按【Run】鈕模擬執行此範例程式,如下圖所示:
21
7-2-3 擁有參數的程序與函數-說明 程序與函數不只是將重複程式區塊抽出成獨立區塊,還可以新增程序與函數的參數。
在呼叫時傳入參數值後,相同的程序與函數就可以得到不同的執行結果。
22
在Visual Basic程式建立擁有參數的程序與函數,其語法如下所示:
7-2-3 擁有參數的程序與函數- 建立(說明) 在Visual Basic程式建立擁有參數的程序與函數,其語法如下所示: [Public | Private] [Sub | Function] 名稱(參數1 ,參數2, …) 程式區塊 [Return 值 | 名稱 = 值] End [Sub | Function] 上述括號的參數稱為「正式參數」(Formal Parameters)或「假的參數」(Dummy Parameters)。
23
7-2-3 擁有參數的程序與函數- 建立(程序範例)
例如:顯示提示文字和訊息的程序,如下所示: Sub PrintMessage(msg As String, prompt As String) lblOutput.Text &= prompt & ":" & msg & vbNewLine End Sub 上述程序擁有2個參數,因為參數不只一個,所以使用","逗號分隔。
24
7-2-3 擁有參數的程序與函數- 建立(函數範例)
例如:溫度轉換函數,如下所示: Function ConvertTemperature( _ C As Integer) Dim F As Single F = ( 9.0 * C ) / Return F End Function
25
程序與函數如果有參數,在呼叫時可以指定不同的參數值,擁有參數的程序呼叫,如下所示:
7-2-3 擁有參數的程序與函數-呼叫 程序與函數如果有參數,在呼叫時可以指定不同的參數值,擁有參數的程序呼叫,如下所示: PrintMessage(txtMsg.Text, txtPrompt.Text) 每一個正式參數都需對應同型別的實際參數。同樣的,擁有參數的函數呼叫,如下所示: output = "華氏溫度:" & ConvertTemperature(C) 上述程式碼呼叫函數來轉換攝氏成為華氏溫度。
26
7-2-3 擁有參數的程序與函數-Visual Basic專案
Visual Basic專案:Ch7-2-3 在Windows應用程式輸入字串和攝氏溫度後,可以顯示擁有提示文字的訊息文字和轉換的華氏溫度,如下圖所示:
27
ViLLE – 4.3 擁有參數的程序與函數 請啟動ViLLE,在【四. 程序與函數】目錄下,選【3. 擁有參數的程序與函數】,按【Run】鈕模擬執行此範例程式,如下圖所示:
28
7-2-4 傳值或傳址呼叫程序與函數-說明 程序與函數不只能夠傳遞參數,不同的參數傳遞方式將影響傳入參數的變數值。Visual Basic語言提供兩種參數傳遞方式,如下表所示:
29
7-2-4 傳值或傳址呼叫程序與函數-範例 Visual Basic程序與函數預設使用傳值呼叫,如果沒有指明,預設是ByVal(舊版Visual Studio會自動加上ByVal,新版並不會),如下所示: Sub SubByVal(C As Integer) ….. End Sub 事實上,只有傳址的程序或函數才需要特別指名ByRef,如下所示: Sub SubByRef(ByRef C As Integer) ….
30
7-2-4 傳值或傳址呼叫程序與函數- Visual Basic專案
Visual Basic專案:Ch7-2-4 在Windows應用程式建立SubByVal()傳值程序和SubByRef()傳址程序,然後分別將參數值加1,可以測試呼叫SubByVal()和SubByRef()後參數值的變化,如下圖所示:
31
在執行程序時如果需要中斷程序的執行,可以使用Exit Sub跳出程序,如下所示:
7-2-5 強迫跳出程序與函數-跳出程序 在執行程序時如果需要中斷程序的執行,可以使用Exit Sub跳出程序,如下所示: Sub Counter(times As Integer) …… Exit Sub End Sub
32
如果執行函數時需要中斷函數的執行,請使用Exit Function跳出函數,如下所示:
7-2-5 強迫跳出程序與函數-跳出函數 如果執行函數時需要中斷函數的執行,請使用Exit Function跳出函數,如下所示: Function SumOne2N(n As Integer) …… Exit Function End Function
33
7-2-5 強迫跳出程序與函數- Visual Basic專案
Visual Basic專案:Ch7-2-5 在Windows應用程式可以顯示計數字串和計算1加到N的總和,程序與函數是使用Exit Sub和Exit Function結束程序與函數的執行,如下圖所示:
34
7-3 程序與函數的變數範圍 7-3-1 變數範圍 7-3-2 全域變數的應用
35
7-3-1 變數範圍-說明 「變數範圍」(Scope)是當程式執行時,變數可以讓程序或函數內或其他程式區塊存取的範圍。
變數依宣告位置擁有三種範圍,如下所示: 區塊範圍(Block Scope):在程式區塊內使用Dim宣告的變數,變數只能在區塊內使用,在區塊外的程式碼並無法存取這些變數。 區域範圍(Local Scope):在程序和函數內使用Dim宣告的變數,變數只能在程序或函數內使用,程序或函數外程式碼並無法存取此變數。 全域範圍(Global Scope):變數如果是在模組/類別中,以Dim或Private宣告在程序和函數外,則該模組/類別檔案的程序和函數都可以存取此變數。
36
7-3-1 變數範圍-Visual Basic專案
Visual Basic專案:Ch7-3-1 在Windows應用程式宣告全域和區域變數A、B,SubA()和SubB()程序都將變數A設為3,變數B設為4,可以測試程序與函數的變數範圍,如下圖所示:
37
7-3-2 全域變數的應用-說明 Visual Basic全域變數的主要目的是儲存跨不同程序與函數間的共享資料,或是在重複執行程序時需要保留的一些資料。
38
7-3-2 全域變數的應用- Visual Basic專案
Visual Basic專案:Ch7-3-2 在Windows應用程式建立熱門手機品牌的票選系統,只需選取選項按鈕後,按下按鈕即可參與票選,程式會記錄總投票人數和各手機廠牌的票數,如右圖所示:
39
7-4 常用的內建函數 7-4-1 日期/時間函數 7-4-2 資料型別檢查函數 7-4-3 資料轉換函數 7-4-4 數學函數
40
7-4-1 日期/時間函數-常用 日期/時間函數可以處理日期/時間格式資料和進行分析。常用日期/時間函數,如下表所示:
41
7-4-1 日期/時間函數-DateDiff()函數
DateDiff(單位字串, DateTime1, DateTime2) 上述DateDiff()函數能夠計算後2個參數的時間差,第1個參數字串設定後2個日期/時間差是使用秒、分或小時等來比較。
42
7-4-1 日期/時間函數-DateAdd()函數
DateAdd(單位字串, Number, DateTime) 上述DateAdd()函數使用與DateDiff()函數相同的單位字串,能夠將第3個參數的日期/時間加減參數Number的值。
43
7-4-2 資料型別檢查函數 資料型別檢查函數能夠檢查Visual Basic變數的資料型別,如下表所示: 函數名稱 函數說明
IsDate(stmt) 如果運算式是Date型別或能夠轉換成Date型別的字串傳回True;否則傳回False IsNumeric(stmt) 如果整個stmt都是數字傳回True;否則傳回False IsArray(var) 如果參數的變數是指向陣列的話傳回True;否則傳回 False IsNothing(stmt) 如果運算式的Object變數沒有指派物件傳回 True;否則傳回False
44
7-4-3 資料轉換函數 函數名稱 傳回型別 範例 結果 CBool(stmt) Boolean CBool(5 = 5) True
CByte(stmt) Byte CByte(125.89) 126 CChar(stmt) Char CChar("BCED") B ChrW(exp) ChrW(65) A CDate(stmt) Date CDate("2015/12/31") CDate("4:35:47 PM") 2015/12/31 下午 04:35:47 CDbl(stmt) Double CDbl( D) CDec(stmt) Decimal CDec( ) CInt(stmt) Integer CInt( ) 2346 CLng(stmt) Long Clng( ) Clng( ) 15427 15428 CShort(stmt) Short CShort(100) 100 CSng(stmt) Single CSng( ) CSng( ) CStr(stmt) String CStr( ) CStr(#2015/12/31#) CStr(#12/31/ :00:01 AM#) 2015/12/31 上午 12:00:01
45
7-4-4 數學函數-亂數與四捨五入函數 Visual Basic亂數與四捨五入函數,其參數stmt為數值或運算式,如下表所示:
46
7-4-4 數學函數-Math類別的數學常數 System.Math類別提供數學常數和函數的類別方法,因為是類別方法,所以程式是直接使用類別名稱Math來呼叫方法,如下所示: Math.Sqrt(x) 上述Sqrt()方法可以計算平方根。在System.Math類別擁有2個數學常數,其說明如下表所示:
47
7-4-4 數學函數-Math類別的數學函數
48
7-5 遞迴函數 7-5-1 遞迴函數的基礎 7-5-2 遞迴的階層函數
49
7-5-1 遞迴函數的基礎 遞迴是由上而下分析方法的一種特殊的情況,使用遞迴觀念建立的函數稱為遞迴函數,其基本定義如下所示:
一個問題的內涵是由本身所定義的話,稱之為遞迴。 因為遞迴問題在分析時,其子問題本身和原來問題擁有相同特性,只是範圍改變,範圍逐漸縮小到終止條件,所以我們可以歸納出遞迴函數的兩個特性,如下所示: 遞迴函數在每次呼叫時,都可以使問題範圍逐漸縮小。 函數需要擁有終止條件,以便結束遞迴函數的執行。
50
7-5-2 遞迴的階層函數-1 在第6章筆者是使用迴圈來計算階層函數的值,現在我們可以改用遞迴方式來處理同一個問題。例如:計算4!階層函數的值,如下所示: 4!=4*3*2*1=24 因為階層函數本身擁有遞迴特性。我們可以將4!的計算分解成子問題,如下所示: 4!=4*(4-1)!=4*3! 現在3!的計算成為一個新的子問題,必須先計算出3!值後,才能處理上述的乘法。
51
7-5-2 遞迴的階層函數-2 同理將子問題3!繼續分解,如下所示: 最後我們知道1!的值為1,接著向上可以計算出2!~4!,如下所示:
3! = 3*(3-1)! = 3*2! 2! = 2*(2-1)! = 2*1! 1! = 1*(1-1)! = 1*0! = 1*1 = 1 最後我們知道1!的值為1,接著向上可以計算出2!~4!,如下所示: 2! = 2*(2-1)! = 2*1! = 2 3! = 3*(3-1)! = 3*2! = 3*2 = 6 4! = 4*(4-1)! = 4*3! = 24 上述階層函數中一層層的子問題都是一個階層函數,只是範圍改變逐漸縮小到終止條件。以階層函數為例是N=0。等到到達終止條件,階層函數值也就計算出來。
52
7-5-2 遞迴的階層函數-階層的遞迴函數 Function Factorial(N As Integer) If (N = 1) Then
Return 1 Else Return N * Factorial(N - 1) End If End Function
53
7-5-2 遞迴的階層函數-Visual Basic專案
Visual Basic專案:Ch7-5-2 在Windows應用程式建立遞迴階層函數,只需輸入階層數,就可以計算指定階層數的階層函數值,如下圖所示:
54
End
Similar presentations