380 likes | 512 Vues
Windows programming 視窗程式設計. Yuan-Yu Tsai 蔡淵裕 yytsai@asia.edu.tw 辦公室: HB61. CHAPTER 4 副程式與模組. 副程式. 藉由 『 副程式 』 或 『 函式 』 的建立, 同樣一段程式碼 ,透過 輸入不同 『 參數 』 ,就能夠 重複的 被 使用 在各種專案和程式碼中 成績處理程式 傳入不同科目的分數,即可計算出平均值 .NET Framework 本身內建了相當多豐富的系統函式 ( 或是副程式 ) 提供程式設計師使用 開發人員 不需親自撰寫所有的程式碼 ,透過簡單的指令即可達成需要的功能.
E N D
Windows programming視窗程式設計 Yuan-Yu Tsai 蔡淵裕 yytsai@asia.edu.tw 辦公室:HB61
CHAPTER 4 副程式與模組
副程式 • 藉由『副程式』或『函式』的建立,同樣一段程式碼,透過輸入不同『參數』,就能夠重複的被使用在各種專案和程式碼中 • 成績處理程式 • 傳入不同科目的分數,即可計算出平均值 • .NET Framework本身內建了相當多豐富的系統函式(或是副程式)提供程式設計師使用 • 開發人員不需親自撰寫所有的程式碼,透過簡單的指令即可達成需要的功能
範例-刪除檔案 • 透過『System.IO.File.Delete』刪除硬碟中某個指定的檔案 • 括號內之『C:\abc.txt』稱之為參數
範例-計算次方 • 透過『System.Math.Pow』計算次方 • 括號內之『a』及『b』稱之為參數
模組 • 成績處理程式 • 計算平均值 • 找最高分及最低分 • 計算標準差及變異數 • 模組 • 將相同類型的副程式或函式放在一起分類使用 • 意味著程式可以分派給多人共同合作
副程式結構 Subroutine 這樣的一個程式區塊(從Sub…到End Sub),就被稱為『副程式』,且可在其他的程式碼當中被呼叫
副程式 副程式需要有一個名字, 命名規則與變數相同 呼叫.NET本身提供的系統函式,來取得時間 主程式 顯示目前的時間 利用Call指令呼叫副程式
Sub Main( ) Dim i As Integer For i = 1 To 12 Console.WriteLine(i) Next Pause( ) End Sub Sub Pause( ) Console.WriteLine( ) Console.Write("...程式暫停中,請按任意鍵繼續…") Console.ReadKey( ) End Sub
函式(Function)建立 函式名稱 函式所須參數由逗號隔開,且每個參數都要有型別 函式回傳之資料型態 Return指令用來結束Function並把值傳回函式名稱 • 函式與副程式之差異在於函式是可以具有傳回值的,因此需要指定『回傳值的型別』 • 參數是指當要呼叫這個函式時,需要傳入的運算用資料(副程式與函式皆可有參數)
呼叫函式 呼叫時需要傳入兩個參數,傳入的參數可以是變數或是常數的形式 由於Max函式會有回傳值,因此建立一個變數來『接收回傳值』 Max函式回傳之結果會被忽略
Example • 建立一個函式,讓使用者輸入圓的的半徑,該函式就傳回圓的面積
函式 副程式
Exercise • 參考CH02-12的範例,建立一個BMI函式,當傳入身高,體重,則傳回該人的BMI值 • 如果函式的回傳值型別設為Single,但主程式接收參數的變數型別為Integer,則會發生什麼狀況? • 如果函式中參數的型別為String,但主程式傳遞給該函式的相對應變數為Integer型別,則會發生什麼狀況? • 如果函式中參數的型別為Integer,但主程式傳遞給該函式的相對應變數為String型別,則會發生什麼狀況?
Example • 請撰寫一個函式,名稱為GetNumber,接收的參數為msg(String型別),並且回傳Integer型別的回傳值,必須具備顯示Msg並且要求使用者輸入數字的功能 n1=GetNumber("請輸入數字1:") n2=GetNumber("請輸入數字2:")
傳值呼叫(ByVal ) 執行結果 變數a:10 變數b:20 當主程式呼叫副程式的時候,把自己變數內的值給副程式用,但原本主程式中的變數則不受副程式的影響
傳址呼叫(ByRef ) 執行結果 變數a:20 變數b:10 當主程式呼叫副程式的時候,把自己的變數本身一起傳過去給副程式使用
Optional關鍵字 • 以此關鍵字修飾的參數被定義後,主程式在呼叫該函數時,可以省略此參數 因為「Optional」修飾字的關係,就算在呼叫add函式沒有填入參數b值也不會有錯誤訊息 需指定預設值
Exercise • 請建立一個函式,可以傳入兩個或三個整數型態的參數,並針對傳入的參數做相乘的動作,當參數只傳入兩個時,則將兩個參數相乘,並將結果回傳,若傳入三個參數,則將這三個參數相乘,並把結果回傳
變數的存留期與存取範圍 • 變數的『存留期』,是指變數在記憶體當中佔有的時間,從什麼時候開始到什麼時候結束 • 變數的『存取範圍』,則是指程式碼中可以存取特定變數的範圍 • 全域變數指的是在程式的任何範圍都可存取到的變數 Do…Loop、For Each…Next、If…End If、Select…End Select、SyncLock…End SyncLock、Try…End Try、While…End While、Sub…End Sub、Function…End Function
請注意這個變數宣告在主程式Sub Main( )的外面,稱之為全域變數 這個變數宣告在GetUserName()函式中,稱之為區域變數 這邊用到了第2行所定義的全域變數
靜態變數 • 以Static關鍵字所宣告的變數 • 靜態變數其數值會被保留,不會隨著所在的副程式的結束而消失
靜態變數 • 靜態變數的生命週期與『全域變數』是一樣的 • 在函式的最外層宣告全域變數之效果與靜態變數相同 • 全域變數之缺點 • 每個副程式或任何區域都可以存取該變數 • 其他的副程式不小心用到這個全域變數,或是誤設該變數的值,導致難以察覺的錯誤,破壞函式間的獨立性 • 全域變數中已用過的變數名稱,同樣的名稱不能再出現 • 靜態變數之優點 • 跟全域變數一樣的生命週期 • 存取範圍被刻意侷限在某個副程式或是區域當中 • 可以避免被程式設計師誤用,有些常用的變數名稱,也可以重複的使用在不同的副程式或函式當中
.NET函式庫的呼叫與使用 • .NET Framework中有內建豐富的函式庫,並且依照不同的功能區分
.NET My Class Library • 透過簡單的『My』關鍵字,讓程式設計師可以輕鬆的引用.NET Framework的功能 • 只需要在程式碼撰寫時,鍵入『My.』系統就會跳出可供使用的功能
Exercise • 請試著透過My Class,找到下載網際網路上檔案的方法 • 請試著透過My Class,找到刪除一個本機電腦檔案(例如自己的C:\)的方法 • 請試著透過My Class,找到讓電腦『叮』一聲的方法 • 請試著透過My Class,偵測使用者是否按下鍵盤上的Number Lock,並顯示出來
模組 Module • 一群副程式的集合 • 將主程式碼切割成副程式,並將功能相似的副程式歸類為一個模組 • 使得開發人員方便管理,後續的維護也會更加便利,特別是在多人同時開發一個專案的時候,好處會更加明顯
建立模組之方式選單中的「專案」→「加入模組」建立模組之方式選單中的「專案」→「加入模組」
建立模組之方式在「方案總管」中,按下滑鼠右鍵→「加入」→「模組」建立模組之方式在「方案總管」中,按下滑鼠右鍵→「加入」→「模組」
模組的使用 只需要打入模組名稱『newmodule.』,就會帶出該模組中可用的函式(剛才我們建了一個Pause)出來給我們選擇 名為NewModule的模組,內含一個Pause的副程式
函式自動註解功能 在函式或副程式上頭,連續打三個『'』,就會自動出現這串文字,請在<summary>和</summary>中,手動入輸入註解
模組中函式的可用範圍 • 『保護措施』的機制:避免呼叫到不該呼叫的函式而發生意料之外的錯誤,可讓模組的架構更佳的完善 • 當函式未用Private關鍵字修飾時,預設可跨到模組之外 • 當變數未用Public關鍵字修飾時,預設存取範圍為模組之內
Exercise • 某班同學考試成績如右 • 若要把分數分成三個級距 • 100-80為優秀 • 79-60為通過 • 0-59為不通過 • 請利用副程式撰寫程式,列出優秀、通過以及不通過的學生