CHAPTER 計算機概論 15 函數與副程式 Visual Basic 提供了許多內建函數, 可讓使用者直接使用其預設的功能 ( 如傳回絕對值 平方根等 ) 另外, 我們也可依照個人需求設計自定函數或副程式來使用 本章將分別介紹內建函數 自定函數與副程式的語法, 以及參數傳遞的方式 大程式的好幫手 15-1 內建函數 內建函數 ( built-in function) 是 Visual Basic 預先設計好的程式, 使用者可直接使用 ( 圖 15-1) 內建函數依其處理的資料類型, 可分為數值函數 字串函數及時間日期函數等 3 類, 說明如下 -2 If x < 0 Then x = -x End If Math.Abs(x) 傳入參數使用內建函數時, 不需瞭解內部運算的過程函數 ( 求絕對值 ) 回傳值 圖 15-1 內建函數的示意圖 15-1.1 數值函數 數值函數是專門用來處理數值資料的函數 同學可利用 Debug.Print( ) 方法, 來練習使用這些內建函數 ( 圖 15-2) 1 step 在 Form1_Load 事件程序中, 輸入程式碼 2 step 按開始偵錯鈕, 執行程式 運算結果會顯示在即時運算視窗 384 圖 15-2 利用 Debug.Print( ) 方法練習 Math.Abs(X) 的範例
第 15 章 函數與副程式 單元 3 表 15-1 是幾種常用數值函數的說明及範例 表 15-1 常用的數值函數說明及範例 函數功能範例結果 Math.Abs(-2) 2 Math.Abs(X) 傳回 X 的絕對值 Math.Abs(10) 10 Math.Sqrt(X) 傳回 X 的平方根 Math.Sqrt(25) 5 Math.Sign(X) X > 0 1 傳回 X 的正負符號 :X = 0 0 X < 0-1 Math.Sign(8) 1 Math.Sign(0) 0 Math.Sign(-2) -1 >0.5 進位至整數 CInt(7.8) 8 CInt(X) 依 X 的小數部分做判斷 :=0.5 取最接近該數的偶數整數 CInt(6.5) 6 <0.5 捨去小數 CInt(-5.5) -6 Int(X) 傳回小於等於 X 的最大整數 Int(5.6) 5 Int(-5.4) -6 Fix(X) 傳回 X 的整數部分 Fix(-5.4) -5 Fix(5.6) 5 Val("cat") 0 Val(X$) 將字串型別的資料轉換成數值型別的資料 Val("123") 123 Val("12") + Val("34") 46 Rnd( ) 產生大於等於 0 且小於 1 的亂數 Rnd( ) 如 0.7055475 設定亂數序列, 以便在使用 Rnd( ) 函數時, 可產生不同的 Randomize( ) 亂數 ㆒做就通請同學利用 Debug.Print( ) 方法, 將上表中的範例輸入至程式中, 執行後就可在即時運算視窗中馬上檢視運算結果 上表中的 Rnd( ) 函數雖然只能產生介於 0 1 之間的亂數, 但我們可將它乘上一個 倍數, 以產生其它範圍的亂數, 例如乘上 100, 就可以產生 0 100( 不含 ) 之間的亂 數 表 15-2 為利用 Rnd( ) 函數產生任兩個數值間的敘述說明 表 15-2 利用 Rnd( ) 函數產生兩個數值間的敘述說明 Rnd 敘述 產生的亂數範圍 Rnd( ) * 10 0 X < 10 Rnd( ) * 10 + 1 1 X < 11 Rnd( ) * (M - N) + N N X < M Int(Rnd( ) * 10) 介於 0 9 間的整數亂數 Int(Rnd( ) * 10) + 1 介於 1 10 間的整數亂數 Int(Rnd( ) * (M - N + 1)) + N 介於 N M 間的整數亂數 在許多電腦應用程式中, 常會應用到亂數函數, 例如模擬樂透開獎的程式, 可利用亂數函數來產生介於某個範圍內的數值 ; 電腦遊戲程式, 可利用亂數函數來控制怪物出現的位置等 ㆒做就通若要產生介於 10 20 之間的亂數, 應如何利用 Rnd() 函數來產生 385
計算機概論 1 練習使用 Int() Rnd() Randomize() 函數 開啟新檔, 依照下列步驟撰寫一個 擲骰子 的程式, 最後將專案與方案以檔名 "Ans15-p1" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 2 將指標移至工具箱標籤, 顯示工具箱 4 雙按工具箱中的 Button 控制項, 在表單中建立按鈕控制項 5 拖曳各控制項至下圖所示的位置 3 雙按工具箱中的 Label 控制項, 在表單中建立標籤控制項 1 2 4 3 5 6 參照下表, 設定各控制項的屬性 7 雙按擲骰子鈕, 開啟程式碼視窗, 以撰寫當滑鼠按下此鈕時, 要執行 的事件程序 控制項 屬性 設定值 Label1 Font 72pt Label1 Text ( 空白 ) Button1 Text 擲骰子 7 386
第 15 章 函數與副程式 單元 3 8 參照下圖, 輸入程式碼 9 按開始偵錯鈕, 執行程式 10 按擲骰子鈕 Button1 Click Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, Randomize() 8 Label1.Text = Int(Rnd() * 6) + 1 ' 產生 1~6 間的整數亂數 End Class 9 隨機產生一個介於 1 6 之間的整數 10 15-1.2 字串函數 表 15-3 常用的字串函數說明及範例 Asc(X$) 字串函數是專門用來處理字串資料的函數, 表 15-3 是常用字串函數的說明及範例 函數功能範例結果 傳回第 1 個字元的 ASCII 碼 Asc("A") 65 Asc("apple") 97 Chr(n) 傳回 ASCII 碼所對應的字元 Chr(65) A 傳回字串的字元個數 Len("Birthday") 8 Len(X$) ( 空白也算 1 個字元 ) Len("Lucky 7-11") 10 Microsoft.VisualBasic. Left(X$, n) Microsoft.VisualBasic. Right(X$, n) Mid(X$, n, [m]) 傳回字串由左算起的 n 個字元 傳回字串由右算起的 n 個字元 傳回字串由第 n 個字元算起的 m 個字元 Microsoft.VisualBasic. Left("Jolin", 2) Microsoft.VisualBasic. Right("Jolin", 3) Mid("Jolin", 3, 2) Mid("apple", 2) Jo lin li pple Ltrim(X$) 去除字串開頭 ( 左邊 ) 的所有空白字元 Ltrim(" Hello") Hello Rtrim(X$) 去除字串結尾 ( 右邊 ) 的所有空白字元 Rtrim("Hello ") Hello Trim(X$) 去除字串開頭及結尾的所有空白字元 Trim(" Hello ") Hello LCase(X$) 將大寫英文字母轉換為小寫英文字母 LCase("iPad") 代表 ipad UCase(X$) 將小寫英文字母轉換為大寫英文字母 UCase("htc") 空白 HTC Space(n) 空 n 個空白字元 Space(3) Str(X) 將數值型別的資料轉換成字串型別 Str(0.234).234 Str(12) + Str(34) 12 34 ㆒做就通請同學利用 Debug.Print( ) 方法, 將上表中的範例輸入至程式中, 執行後就可在即時運算視窗中馬上檢視運算結果 387
計算機概論 2 練習使用 Len() Mid() 函數 開啟新檔, 依照下列步驟撰寫一個 字串反向 的程式, 最後將專案與方案以檔名 "Ans15-p2" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 2 按檢視程式碼鈕, 開啟程式碼視窗 3 按此下拉式方塊, 選 (Form1 事件 ) 4 按此下拉式方塊, 選 Load, 設定表單被載入時執行此事件程序 1 2 3 4 (Form1 事件 ) Load 5 參照右圖, 輸入程式碼 Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e A Dim i As Integer Dim word, reword As String reword = "" 5 word = InputBox(" 輸入任一字串 :") i = Len(word) ' 利用 Len() 傳回變數 word 的字元個數 Do While i >= 1 reword = reword + Mid(word, i, 1) 將字串反向 i = i - 1 Loop MsgBox(word & " 反向後為 " & reword) End Class 6 按開始偵錯鈕, 執行程式 6 程式顯示字串反向後的結果 7 在此欄輸入任一字 串 ( 如 "dog"), 按確定鈕 7 388
第 15 章 函數與副程式 單元 3 15-1.3 時間日期函數 時間日期函數是專門用來處理時間及日期資料的函數, 表 15-4 是幾種常用時間日期函數的說明及範例 表 15-4 常用的時間日期函數說明及範例函數功能範例結果 Now( ) 傳回系統的日期與時間 Now( ) 2013/5/16 下午 02:42:26 TimeString( ) 以字串資料型別傳回系統的時間 TimeString( ) 14:42:19 Minute(#hh:mm:ss#) 傳回時間資料中的分鐘資料 Minute(#10:39:55 AM#) 39 Second(#hh:mm:ss#) 傳回時間資料中的秒數資料 Second(#10:39:55 AM#) 55 Today( ) 傳回系統的日期 Today( ) 2013/5/16 Year(#mm/dd/yyyy#) 傳回日期資料中的年份資料 Year(#5/11/2013#) 2013 Month(#mm/dd/yyyy#) 傳回日期資料中的月份資料 Month(#5/11/2013#) 5 ㆒做就通請同學利用 Debug.Print( ) 方法, 將上表中的範例輸入至程式中, 執行後就可在即時運算視窗中馬上檢視運算結果 1. 在 Visual Basic 中, 運算式 10.5 \ 3.5 + 2 ^ Fix (2.8) 之結果為何? (A)6 (B)7 (C)10 (D)11 2. 下列哪一個 Visual Basic 的運算式執行後, 可以獲得 "5 月 1 日 " 的結果? (A) Microsoft.VisualBasic.Left("20110501", 6) + " 月 " + Microsoft.VisualBasic. Left("20110501", 8) + " 日 " (B) Mid("20110501", 1, 6) + " 月 " + Mid("20110501", 1, 8) + " 日 " (C) Mid("20110501", 6, 1) + " 月 " + Mid("20110501", 8, 1) + " 日 " (D) Microsoft.VisualBasic.Right("20110501", 3) + " 月 " + Microsoft.VisualBasic. Right("20110501", 1) + " 日 " 3. 請依照以下內建函數功能的敘述, 在空格中填入符合敘述的內建函數代號 a. Math.Abs(X) b. Fix(X) c. Str(X) d. Val(X$) e. Len(X$) f. Chr(n) (1) 傳回 ASCII 碼所對應的字元 (2) 將字串型別的資料轉換成數值型別的資料 (3) 傳回 X 的整數部分 (4) 傳回 X 的絕對值 389
計算機概論 15-2 自定函數與副程式 在程式設計實務上, 自定函數及副程式的應用有 2 個重要的概念, 第 1 個概念是可將大型程式適度分割成許多個小型程式模組, 以自定函數或副程式來開發, 使程式易於撰寫 測試及維護 ; 第 2 個概念是功能單純的程式模組可讓相關的系統重複使用 (reuse), 以省去開發相同程式的時間 例如 iphone 有提供開發者使用震動功能的副程式, 當遊戲中需要執行震動時, 可直接使用 ( 呼叫 ) 不需重複撰寫 15-2.1 自定函數 在 Visual Basic 中, 函數包含內建函數及自定函數兩種 當內建函數的功能無法滿足我們的需求時, 我們可自行撰寫函數來使用 自定函數是由 Function 與 End Function 之間的程式敘述所組成 每個自定函數都有一個專屬的名稱, 當程式需要使用這個函數功能時, 便可使用呼叫的方式來執行函數 ; 函數在執行結束後, 會回傳一個值給呼叫它的程式敘述 ( 圖 15-3) X = 自定函數 A( ) 1 step 呼叫 Function 自定函數 A( ) As Integer 2 step 執行 3 step 返回, 並回傳結果 自定函數 A = 100 End Function ' 假設 100 為運算結果 主程式 圖 15-3 主程式呼叫自定函數的示意圖 自定函數 一 自定函數語法 : 語法 & 舉例 計算圓面積 Function 自定函數名稱 [( 形式參數 1 [As 資料型別 ], )] As 資料型別程式區塊 [Exit Function] 自定函數名稱 = 傳回值 End Function 390 Function area(byval r) As Double Const pi As Single = 3.14159 area = pi * r ^ 2 End Function ' 計算圓面積的自定函數 ( 內文範例 "ch15-1.sln")
第 15 章 函數與副程式 單元 3 說明 1 自定函數的命名規則與變數的命名規則相同, 但須注意撰寫在同一個表單 ( 如 Form1) 下的自定函數, 名稱不可相同 2 Function 敘述中的參數, 稱為形式參數 (formal parameter), 用來承接由主程式傳入的參數 3 在 Function 敘述的最後, 可宣告傳回值的資料型別 4 Exit Function 敘述可強制跳離自定函數 5 自定函數需撰寫在表單的宣告區內 ( 圖 15-4) (Form1 事件 ) Load 表單宣告區 ( 撰寫在此區的副程式 自定函數等, 稱為一般程序 ) Public Class Form1 Function area(byval r) As Double ' 計算圓面積的自定函數 area Const pi As Single = 3.14159 area = pi * r ^ 2 End Function Private Sub Form1_Load(ByVal sender As System.Object, ByVal Dim a As Double a = area(10) MsgBox(a) End Class 自定函數 副程式可撰寫在表單宣告區內的任一處, 但不能穿插在其他的事件程序中事件程序 (Form1_Load) 圖 15-4 表單的宣告區 二 呼叫語法 : 語法 & 舉例 呼叫自定函數 area 變數 = 自定函數名稱 [( 實際參數 1, 實際參數 2, )] a = area(10) ( 內文範例 "ch15-1.sln") 說明 1 在呼叫敘述中的參數, 稱為實際參數 (actual parameter), 用來傳遞參數給自定函數 2 變數用來承接回傳值 391
計算機概論 三 範例 : 1. 呼叫自定函數來計算 1 累加到 5 的總和 程式碼 內文範例 "ch15-2.sln" Function sum(byval x) ' 計算 1 累加到 x 的總和 Dim i, tmp As Integer For i = 1 To x tmp = tmp + i Next i sum = tmp End Function 執行結果 Private Sub Form1_Load( ) Handles Me.Load Dim ans As Integer ans = sum(5) ' 呼叫自定函數 sum MsgBox(ans) 2. 呼叫自定函數來計算 2 的 N 次方 程式碼 內文範例 "ch15-3.sln" Function power2(byval N) ' 計算 2 的 N 次方 Dim i, tmp As Integer i = 1 : tmp = 1 Do While i <= N tmp = tmp * 2 i = i + 1 Loop power2 = tmp End Function 執行結果 Private Sub Form1_Load( ) Handles Me.Load Dim num, ans As Integer num = InputBox(" 請輸入任一整數 ") ans = power2(num) ' 呼叫自定函數 power2 MsgBox(ans) 392
第 15 章 函數與副程式 單元 3 3 練習使用自定函數 開啟新檔, 依照下列步驟撰寫一個計算 N!(N 階層 ) 的程式, 最後將專案與方案以檔名 "Ans15-p3" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 2 按檢視程式碼鈕, 開啟程式碼視窗 3 按此下拉式方塊, 選 (Form1 事件 ) 4 按此下拉式方塊, 選 Load, 設定表單被載入時執行此事件程序 1 2 3 4 (Form1 事件 ) Load 6 Public Class Form1 Function factorial(byval n As Integer) As Integer If n <= 1 Then factorial = 1 Else factorial = factorial(n - 1) * n End If End Function 計算 N!(N 階層 ) 的自定函數 5 參照右圖, 輸入主 程式的程式碼 6 參照右圖, 輸入自 定函數的程式碼 7 按開始偵錯鈕, 執行程式 5 7 Private Sub Form1_Load(ByVal sender As Object, ByVal e A Dim N, fac As Integer N = InputBox(" 計算 N! 階層, 請輸入整數 (N):") fac = factorial(n) ' 呼叫自定函數 factorial MsgBox(N & "! 階層的值為 " & fac) End Class 運算結果 8 在此欄輸入整數 ( 如 5 ), 按確定鈕 8 393
計算機概論 15-2.2 副程式 副程式的設計主要有兩個重要的考量, 第一個考量是可將大型的程式分割成數個功能獨立的小型程式 ( 圖 15-5), 以便於程式的開發與維護 另一個考量, 則是可將這些小型程式交由多位程式設計師分工合作, 以加快程式開發的速度 主程式 副程式 a 主程式呼叫副程式 a 呼叫副程式 b 呼叫副程式 c 副程式 b 副程式 c 圖 15-5 大型程式分割成數個副程式的示意圖 在 Visual Basic 中, 副程式是由 Sub 與 之間的程式敘述所組成 副程式的語法與自定函數相當類似, 差別在於自定函數在執行後, 會傳回一個值給呼叫它的程式, 而副程式不會 每個副程式都有一個專屬的名稱, 當主程式需要使用副程式的功能時, 可使用呼叫 (Call) 的方式來執行這一段副程式 ( 圖 15-6) Call 副程式 A 1 step 呼叫 3 step 返回 2 step 執行 Sub 副程式 A 主程式 副程式 圖 15-6 主程式呼叫副程式的示意圖 394
第 15 章 函數與副程式 單元 3 一 副程式語法 : 語法 & 舉例 計算 1 累加到 x 總和 Sub 副程式名稱 [( 形式參數 1 [As 資料型別 ], 形式參數 2 [As 資料型別 ], )] 程式敘述區塊 [Exit Sub] Sub sum(byval x) Dim i, tmp As Integer For i = 1 To x tmp = tmp + i Next i MsgBox(tmp) ' 計算 1 累加到 x 總和的副程式 ( 內文範例 "ch15-4.sln") 說明 1 副程式的命名規則與變數的命名規則相同, 但須注意撰寫在同一個表單 ( 如 Form1) 下的副程式, 名稱不可相同 2 在 Sub 敘述中的參數, 稱為形式參數 ; 用來承接主程式傳入的參數 3 Exit Sub 敘述可強制跳離副程式 4 副程式也需撰寫在表單的宣告區內 二 呼叫語法 : 語法 & 舉例 呼叫副程式 sum Call 副程式名稱 ([ 實際參數 1, 實際參數 2, ]) Call sum(5) ( 內文範例 "ch15-4.sln") 說明 1 呼叫副程式時可視程式設計的需要, 決定是否使用參數 2 在 Call 敘述中的實際參數, 會在執行 Call 敘述時傳入副程式中 395
計算機概論 三 範例 : 1. 呼叫副程式來計算 2 的 5 次方 程式碼 內文範例 "ch15-5.sln" Sub power2(byval N) Dim tmp As Integer = 1 For i = 1 To N tmp = tmp * 2 Next i MsgBox(tmp) ' 計算 2 的 N 次方 執行結果 Private Sub Form1_Load( ) Handles Me.Load Call power2(5) ' 呼叫副程式 power2 2. 以下為仿統測考題所設計的題目, 請問執行程式後, 顯示的結果為何? 程式碼 內文範例 "ch15-6.sln" Sub p(byval c As Integer) c = 20 Call q(c) MsgBox(c) ' 呼叫副程式 q 執行結果 Sub q(byval c As Integer) MsgBox(c + 16) Private Sub Form1_Load( ) Handles Me.Load Dim c As Integer=60 Call p(c) ' 呼叫副程式 p 396
第 15 章 函數與副程式 單元 3 結構化程式設計的概念 要建造一棟大樓, 首先必須由建築師進行整體的規劃設計, 並繪製出建築藍圖, 再由建設公司依據藍圖, 將土木 水電 裝潢等工程發包給專業人員來施工 結構化程式設計的技術與前述建築大樓先規劃再施工的概念很接近, 也是要整體規劃程式的功能後, 再細分成子功能並分別撰寫成小型的程式 圖 15-7 為結構化程式設計概念的示意圖 以下是結構化程式設計的基本原則 : 將一個大型程式由上到下劃分成多個功能獨立的程式 ( 稱為模組 ) 每一個模組只有一個入口與一個出口 儘量減少模組之間相互影響的程度, 例如儘量不要使用可任意改變程式執行流程的 GoTo 敘述 1 個入口 大型程式模組 1 模組 2 1 個出口 前面所介紹的自定函數及副程式, 就是用來開發功能獨立的模組 使用模組的好處是可重複使用 易於測試與偵 模組 3 錯, 並可簡化程式維護的工作 模組 N 圖 15-7 結構化程式設計概念的示意圖 4 練習使用副程式 開啟新檔, 依照下列步驟撰寫一個 單位換算 的程式 (MOCC 類題 ), 最後將專案與方案以檔名 "Ans15-p4" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 2 1 2 將指標移至工具箱標籤, 顯示工具箱 3 3 雙按工具箱中的 Label 控制項, 在表單中建立標籤 (Label1) 控制項 397
計算機概論 4 參照步驟 3, 在表單中佈建 3 個標籤 (Label) 1 個文字方塊 (TextBox) 3 個按鈕 (Button) 控制項 6 選取 TextBox1 控制項, 拖曳右方控點, 調整文字方塊的大小 5 拖曳各控制項至下圖所示的位置 7 選取 Button1 控制項, 按住鍵不放, 再選取 Button2 Button3 控制項, 拖曳任一控制項左方的控點, 以同時 TextBox1 調整 3 個按鈕控制項的大小 6 4 7 8 參照下表, 設定各控制項的屬性 控制項 屬性 設定值 控制項 屬性 設定值 Form1 Size 300, 200 Label4 Text ( 空白 ) Label1 Text 輸入數值 : Button1 Text 公尺 Label2 Text 公分 Button2 Text 公里 Label3 Text 換算結果 : Button3 Text 英吋 9 雙按公尺鈕, 開啟程式碼視窗, 以撰寫當使用者按下此鈕後, 要執行的事件程序 9 398
第 15 章 函數與副程式 單元 3 10 參照下表中的列號 18, 輸入在 Button1 的 Click 事件程序中的程式碼 11 參照下表中的列號 2 16, 撰寫 單位換算 副程式的程式碼 12 參照步驟 9 及下表中的列號 21, 在 Button2 的 Click 事件程序中輸入程式碼 13 參照步驟 9 及下表中的列號 24, 在 Button3 的 Click 事件程序中輸入程式碼 列號 程式碼 1 Public Class Form1 2 Sub change(byval x As String) 3 Dim cm, T As Single 4 cm = TextBox1.Text 5 6 Select Case x Case "a" 11 7 T = cm / 100 '1 公尺 = 100 公分 8 Label4.Text = T & " 公尺 " 9 10 11 Case "b" T = cm / 100000 Label4.Text = T & " 公里 " '1 公里 = 100000 公分 單位換算 的副程式 12 Case "c" 13 T = cm / 2.54 '1 英吋 = 2.54 公分 14 Label4.Text = T & " 英吋 " 15 End Select 16 17 18 Private Sub Button1_Click( ) Handles Button1.Click Call change("a") ' 呼叫副程式 change 10 19 20 21 Private Sub Button2_Click( ) Handles Button2.Click Call change("b") ' 呼叫副程式 change 12 22 23 24 Private Sub Button3_Click( ) Handles Button3.Click Call change("c") ' 呼叫副程式 change 13 25 26 End Class 399
計算機概論 14 按開始偵錯鈕, 執行程式 14 15 15 在此欄輸入數值 ( 如 100), 再按要轉換的單位鈕 ( 如公尺 公里 英吋 ) 程式顯示運算結果 1. 有關副程式 (subprogram) 的敘述, 下列何者不正確? (A) 可使主程式易於維護 (B) 副程式之中可再去執行另一個副程式 (C) 每一個主程式都必須要有副程式 (D) 若程式中有某部分需經常用到者可將其寫成副程式 2. 若給定如下之 Visual Basic 副程式, 並呼叫 Invest(3, 15), 訊息交談窗顯示的結果為何? (A)3 (B)4 (C)12 (D)15 Sub Invest(ByVal X As Integer, ByVal Y As Integer) Ans = (X ^ 2 + Y Mod 4) / 3 MsgBox(Ans) 3. 建立新專案, 利用副程式撰寫一個 判斷是否為質數 的程式 ( 電腦軟體設計丙檢類題 ), 最後將專案儲存為 "Ans15-a.sln" 提示 :(1) 利用 InputBox() 函數, 讓使用者輸入任一整數 (2) 在副程式中, 利用 For Next If Then 敘述判斷使用者輸入的整數是否為質數 ( 質數是指除了 1 和自己外, 不能被其他數整除的整數, 如 1 7 等 ) (3) 利用訊息交談窗顯示判斷結果 400
第 15 章 函數與副程式 單元 3 15-3 參數傳遞方式 在呼叫副程式 ( 或函數 ) 時, 主程式中的實際參數會傳給副程式 ( 或函數 ) 的形式參數承接 在 Visual Basic 中, 提供有傳值與傳址兩種參數傳遞的方式 ( 圖 15-8), 分別說明如下 傳值 叫 傳址 叫 呼叫程式的環境副程式的環境呼叫程式的環境副程式的環境 1 step 主程式呼叫副程式 S( ) 複製 5 傳遞實際參數的位址給副程式 a 5 a x^2 x 5 a x^2 2 step 執行副程式 S( ) 取 a 位址中的值做運算 5 a x^2 25 x 5 5 25 a 運算結果改寫 a 中原值 5^2 25 3 step 返回主程式 5 a x^2 25 x 25 a x^2 變數 a 為實際參數, 變數 x 為形式參數, 紫色 綠色箱子代表副程式 S( ) 圖 15-8 傳值呼叫與傳址呼叫的差異 ( 副程式具有計算數值平方的功能 ) 401
計算機概論 15-3.1 傳值的呼叫 傳值呼叫 (call by value) 是一種形式參數與實際參數佔用不同記憶體位址的參數傳遞方式 主程式呼叫副程式 ( 或函數 ) 時, 會將實際參數的值複製到形式參數中 當副程式執行時便會使用該複製的值來運算 在 Visual Basic 中, 預設的參數傳遞方式即為 傳值 以傳值的方式來呼叫副程式 ( 或函數 ), 副程式 ( 或函數 ) 的形式參數前加上保留字 "ByVal" 圖 15-9 為傳值呼叫的範例, 以傳值方式呼叫副程式之後, 實際參數 a 的值仍維持為 5, 故視窗中顯示副程式返回主程式後的 a 值為 5 行號 60 的執行結果行號 10 的執行結果行號 30 的執行結果行號 80 的執行結果 1 step 輸入數值 5 並按確定鈕, 啟動 Button1 的 Click 事件程序 ; 數值 5 存入變數 a 中 Sub S(ByVal x As Short) 10: Label3.Text &= x 20: x = x ^ 2 30: Label4.Text &= x 值的變化 傳值呼叫, 形式參數與實際參數不共用記憶體 變數 內容 實際參數 a 5 形式參數 x 5 25 2 step 呼叫副程式,a 的值 (5) 會複製到形式參數 x 中 step 3 副程式運算後, 形式參數 x 的值變為 25 Private Sub Button1_Click( ) 40: Dim a As Short 50: a = TextBox1.Text 60: Label2.Text &= a 70: Call S(a) 80: Label5.Text &= a 圖 15-9 傳值呼叫副程式的範例 ( 內文範例 "ch15-7.sln") 402
第 15 章 函數與副程式 單元 3 5 使用傳值呼叫 開啟新檔, 依照下列步驟撰寫一個 公斤換算台斤 的程式, 最後將專案與方案以檔名 "Ans15-p5" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 1 2 將指標移至工具箱標籤, 顯示工具箱 2 3 4 3 雙按工具箱中的 Label 控制項, 在表單中建立第 1 個標籤控制項 4 雙按工具箱中的 Label 控制項, 在表單中建立第 2 個標籤控制項 5 5 拖曳各控制項至下圖所示的位置 6 參照右表, 設定各控制項的屬性 控制項屬性設定值 Label1 Text 公斤換算台斤 : Label2 Text ( 空白 ) 403
計算機概論 7 按檢視程式碼鈕, 以開啟程式碼視窗 9 按此下拉式方塊, 選 Load, 設定表單 被載入時執行此事件程序 8 按此下拉式方塊, 選 (Form1 事件 ) 7 8 9 公斤換算台斤的副程式 (Form1 事件 ) Load 10 參照右圖, 輸入主程式的程式碼 11 參照右圖, 輸入副程式的程式碼 11 10 Public Class Form1 Sub conversion(byval s_kg As Integer) ' 傳值呼叫 s_kg = s_kg * 10 / 6 Label2.Text &= s_kg & " 台斤 " Private Sub Form1_Load(ByVal sender As Object, ByVal e A Dim kg As Single kg = InputBox(" 請輸入公斤數 :") Label2.Text = kg & " 公斤 = " End Class Call conversion(kg) ' 呼叫副程式 conversion 12 按開始偵錯鈕, 執行程式 13 在此欄輸入數值 ( 如 100), 按確定鈕 12 程式顯示換算結果 13 404
第 15 章 函數與副程式 單元 3 15-3.2 傳址的呼叫 傳址呼叫 (call by reference) 是一種形式參數與實際參數共用同一個記憶體位址的參數傳遞方式 主程式呼叫副程式 ( 或函數 ) 時, 會將實際參數在記憶體中的位址傳遞給形式參數 當副程式 ( 或函數 ) 使用到形式參數時, 便會由該位址取用實際參數的值來運算 在 Visual Basic 中, 若要以傳址的方式來呼叫副程式 ( 或函數 ), 可在副程式 ( 或函數 ) 中的形式參數前加上保留字 "ByRef" 圖 15-10 為傳址呼叫的範例, 在以傳址方式呼叫副程式之後, 實際參數 a 的值由 5 改變為 25, 故視窗中顯示副程式返回主程式後的 a 值為 25 行號 60 的執行結果行號 10 的執行結果行號 30 的執行結果行號 80 的執行結果 1 step 輸入數值 5 並按確定鈕, 啟動 Button1 的 Click 事件程序 ; 數值 5 存入變數 a 中 Sub S(ByRef x As Short) 10: Label3.Text &= x 20: x = x ^ 2 30: Label4.Text &= x 值的變化 傳址呼叫, 形式參數與實際參數共用同一個記憶體 2 step 呼叫副程式, 並將實際參數 a 的位址傳給副程式 Private Sub Button1_Click( ) 40: Dim a As Short 50: a = TextBox1.Text 60: Label2.Text &= a 70: Call S(a) 80: Label5.Text &= a step 3 副程式從 a 的位址取出值 (5) 做運算, 最後將運算結果 (25) 存回 a 的位址 變數 實際參數 a 形式參數 x 內容 5 25 圖 15-10 傳址呼叫副程式的範例 ( 內文範例 "ch15-8.sln") 405
計算機概論 由以上呼叫方式之說明可知, 若要讓實際參數的值隨著形式參數的運算而改變, 須使用傳址的方式來傳遞參數 ; 反之, 則須使用傳值的方式來傳遞參數 表 15-5 為傳值與傳址呼叫副程式 ( 函數 ) 的比較 表 15-5 傳值與傳址呼叫的比較表 比較項目傳值傳址 參數傳遞的機制 參數傳遞方式的設定 實際參數與形式參數是否使用同一記憶體位址 形式參數的值改變, 實際參數的值是否跟著改變 先將實際參數的值複製到形式參數中, 接著副程式使用形式參數的值來作運算 在形式參數前加上關鍵字 "ByVal"( 預設 ) 否 否 先將實際參數的位址傳遞給形式參數, 接著副程式使用該位址的值來作運算 在形式參數前加上關鍵字 "ByRef" 是 是 6 練習使用傳址呼叫 開啟新檔, 依照下列步驟撰寫一個 猜數字遊戲 的程式, 最後將專案與方案以檔名 "Ans15-p6" 儲存 1 按新增專案鈕, 建立一個 Windows Form 應用程式類型的專案 2 按檢視程式碼鈕, 開啟程式碼視窗 3 按此下拉式方塊, 選 (Form1 事件 ) 4 按此下拉式方塊, 選 Load, 設定表單被載入時執行此事件程序 1 3 4 2 406
第 15 章 函數與副程式 單元 3 5 參照下圖, 輸入主程式的程式碼 6 參照下圖, 輸入副程式的程式碼 (Form1 事件 ) Load 6 Public Class Form1 Sub S(ByRef s1 As Integer, ByRef n1 As Integer) Dim x As Integer Randomize() x = Int(Rnd() * 10) + 1 If n1 = x Then s1 = s1 + 25 MsgBox(" 答案為 " & x & ", 猜對了! 積分為 " & s1) Else MsgBox(" 答案為 " & x & ", 猜錯了! 積分為 " & s1) End If 判斷是否猜中的副程式 5 Private Sub Form1_Load(ByVal sender As Object, ByVal e A Dim i, n, score As Integer For i = 1 To 4 n = InputBox(" 輸入任一整數 (1~10), 目前積分為 " & score & vbcrlf & "( 可猜 4 次, 猜對 1 次得 25 分 )") Call S(score, n) Next i End ' 結束程式 End Class 7 按開始偵錯鈕, 執行程式 8 在此欄輸入 1 10 間的任一整數 ( 如 8), 按確定鈕 7 程式顯示電腦產生的 亂數, 若猜對了, 積 分會累加 25 分 8 407
計算機概論 1. 執行副程式呼叫時, 若傳入的參數不希望被更改, 可採用何種呼叫方式? (A) 傳址呼叫 (B) 傳值呼叫 (C) 傳名呼叫 (D) 遞迴呼叫 2. 執行下列 Visual Basic 程式片段後,a 的值為何? (A)-1 (B)0 (C)1 (D)2 Private Sub Good(ByRef s As Integer) s = s + 1 Private Sub Bad(ByVal t As Integer) t = t - 2 Private Sub Form1_Activated( ) Handles Me.Activated Dim a As Integer = 0 Call Good(a) Call Bad(a) 3. 在 Visual Basic 中, 使用的參數傳遞方式, 可讓實際參數的值隨著形式參數的運算而改變 本範例將以設計一個 猜數字遊戲 為例, 讓同學練習自定函數的使用 此遊戲的規則是由使用者輸入 3 個介於 0~9 之間的整數 ( 數字可重複 ), 再與電腦隨機產生的 3 個整數做比對, 並顯示猜對幾個數字 1. 建立專案與表單 2. 佈建控制項與設定屬性 3. 撰寫程式碼與測試程式 4. 儲存專案 7 猜數字遊戲 408
第 15 章 函數與副程式 單元 3 1.1 1.2 1. 建立專案與表單 1.3 詳細步驟參考 1.1 啟動 Visual Basic 2010 1.2 按新增專案鈕, 開啟新增專案交談窗 1.3 選 Windows Form 應用程式, 按確定鈕, 建立新專案 2. 佈建控制項與設定屬性 詳細步驟參考 2.1 點選表單, 在屬性視窗中的 Size 欄, 將第 1 個數值 "300" 更改為 "400", 以調整表單的寬度 2.1 2.2 將指標移至工具箱標籤, 顯示工具箱 2.2 2.3 雙按 Label 控制項, 在表單中建立一個標籤 (Label1) 控制項 2.3 409
計算機概論 2.4 參照步驟 2.2 2.3, 在表單中佈建 2 個標籤 (Label) 3 個文字方塊 (TextBox) 1 個按鈕 (Button) 控制項 2.4 2.6 TextBox1 TextBox3 2.5 拖曳各控制項至右圖所示的位置 2.6 選取 TextBox1 控制項, 按住鍵不放, 再選取 TextBox2 TextBox3 控制項, 接著拖曳任一控制項左邊的控點, 以同時調整所有文字方塊的大小 控制項屬性設定值 Label1 Text 請輸入 3 個 0~9 間的整數 : 2.7 參照右表, 設定各控制項的屬性 Label2 Text 電腦開出的號碼為 : Label3 Text ( 空白 ) Button1 Text 看結果 3. 撰寫程式碼與測試程式 詳細步驟參考 3.1 3.1 雙按看結果鈕, 開啟程式碼視窗, 以撰寫當使用者按下此鈕後, 要執行的事件程序 410
第 15 章 函數與副程式 單元 3 3.2 參照下表中的列號 7 25, 輸入主程式的程式碼 3.3 參照下表中的列號 2 5, 撰寫一個可隨機產生一個介於 0 9 間整數的自定函數 列號 1 2 3 4 5 Public Class Form1 Function r() Randomize() r = Int(Rnd() * 10) End Function 程式碼 可隨機產生一個介於 0 9 間整數的自定函數 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Private Sub Button1_Click( ) Handles Button1.Click Dim user(2), a, j, i, k As Short Label3.Text = "" user(0) = TextBox1.Text user(1) = TextBox2.Text user(2) = TextBox3.Text For i = 1 To 3 a = r() ' 呼叫自定函數 r Label3.Text &= a & " " j = 0 Do While j <= 2 判斷隨機產生的數值與輸 If a = user(j) Then k = k + 1 入的數值是否相同? 相同 j = j + 1 Loop 就加 1 Next i If k > 0 Then MsgBox(" 猜對了 " & k & " 個數字 ") Else MsgBox(" 真可惜, 都沒有猜對!") End If End Class 411
計算機概論 3.4 3.8 3.4 按開始偵錯鈕, 執行程式 3.5 3.5 在 3 個文字方塊控制項中, 分別輸入 3 個不同的整數 3.6 3.6 按看結果鈕, 電腦會產生 3 個 0 9 間的整數亂數, 並判斷是否有猜中 3.7 按確定鈕, 關閉交談窗 3.7 3.8 按關閉鈕, 結束程式的執行 4.1 4. 儲存專案 詳細步驟參考 4.1 按全部儲存鈕, 開啟儲存專案交談窗 4.2 勾選為方案建立目錄核取方塊, 設定要建立一個資料夾, 用來存放與方案相關的檔案 4.3 按瀏覽鈕, 選取要存放專案的位置 4.4 在名稱欄, 輸入 "Ans15-1", 按儲存鈕, 為方案及專案命名 4.4 4.2 4.3 412
MENU 選擇題 作答處藍色底線表示該題為歷屆考題 1. 阿密特參加 百萬大歌星 的歌唱挑戰賽, 當她選擇了某一類別的歌曲後, 電腦系統便會自動隨機挑選出該類型下的任 3 首歌, 供她選唱 請問上述隨機挑選 3 首歌的方式, 若以 Visual Basic 語言來撰寫, 一定會使用到下列哪一個函數? (A)Rnd( ) (B)Abs( ) (C)Len( ) (D)Val( ) 2. 下列函數的值, 何者與其他三個不同? (A)Fix(6.3) (B)Int(6.3) (C)CInt(6.3) (D)Math.Abs(6.3) 3. 在 Visual Basic 中, 下列字串運算的結果為何? Microsoft.VisualBasic.Left("access", 1) + Microsoft.VisualBasic.Right("grill", 2) + Mid("next", 2, 1) (A)alle (B)accgn (C)sgnxt (D)silne 4. 下列 Visual Basic 運算式何者的執行結果為 1? (A)2 * 2 - CInt(2.52) (B)Math.Sqrt(Int(8.5) - 8) (C)Fix(1 * Rnd()) (D)Math.Abs(25) - 8 + 1 * 2 5. 執行下列 Visual Basic 程式片段後,S 的值為何? (A)7 (B)8 (C)9 (D)10 A = 2 B = 3 S = A ^ B + Math.Abs(A - B) 6. 執行下列 Visual Basic 程式片段後, 訊息交談窗顯示的結果為何? (A)3 (B)4 (C)-3 (D)-4 MsgBox(Int(-3.6)) 7. 執行下列 Visual Basic 程式片段後, 訊息交談窗顯示的結果為何? (A)2 (B)4 (C)6 (D)8 MsgBox(Len(" 中華民國 ")) 8. 假設樂透彩券的中獎號碼是 10 42, 在 Visual Basic 語言中, 下列何者可以產生一個從 10 到 42 的整數亂數? (A)Int(Rnd() * 10) + 33 (B)Int(Rnd() * 32) + 10 (C)Int(Rnd() * 33) + 10 (D)Int(Rnd() * 41) + 2 9. 執行下列 Visual Basic 程式片段後,T 的值為何? (A)-18 (B)-19 (C)-21.2 (D)-22 T = 0 For P = -9.8 To 7.7 Step 3 If P < 0 Then T = T + Int(P) End If Next P 413
MENU 10. 執行下列 Visual Basic 程式片段後,a 的值為何? (A)-23 (B)-24 (C)-25 (D)-26 a = 0 For i = -7.6 To 9.5 Step 4 If i < 0 Then a = a + Int(i) Else a = a + Fix(-i) End If Next i 11. 班上的幹部 ( 如班長 風紀 學藝等 ) 各自負責不同的工作, 老師會按照這些幹部的任務來要求他們做事, 例如要求風紀股長管秩序 要求學藝股長填寫教室日誌等 請問這樣的作法與 Visual Basic 中的哪一個概念類似? (A) 主程式與副程式的關係 (B) 迴圈控制 (C) 堆疊的後進先出結構 (D) 佇列的先進先出結構 12. 副程式與自定函數的差異, 下列何者正確? (A) 自定函數有回傳值, 副程式沒有 (B) 副程式不能傳入參數, 自定函數可以 (C) 副程式可節省撰寫程式的時間, 自定函數不可 (D) 自定函數可縮短程式的行數, 副程式不能 13. 執行下列 Visual Basic 程式片段後, 訊息交談窗顯示的結果為何? (A)65 (B)105 (C)125 (D)305 Private Sub Form1_Activated( ) Handles Me.Activated Dim X, A As Integer X = 5 A = FS(X) MsgBox(A + X) Function FS(ByVal X) FS = X For J = X To 3 Step -1 FS = FS * J Next J End Function 414 14. 執行下列 Visual Basic 程式片段後,T 的值為何? (A)40 (B)30 (C)20 (D)10 Function FNP(X) FNP = X * X + X End Function Private Sub Form1_Activated( ) Handles Me.Activated Dim K, T As Integer For K = 1 To 4 T = T + FNP(K) Next K
15. 執行下列 Visual Basic 程式片段後,K 的值為何? (A)1 (B)5 (C)15 (D)120 Private Sub Form1_Activated( ) Handles Me.Activated Dim K As Integer K = GAME(5) Function GAME(ByVal X) If (X > 1) Then GAME = X * GAME(X - 1) Else GAME = 1 End If End Function 16. 執行下列 Visual Basic 程式片段後, 輸出的結果為何? (A)40 (B)19 (C)67 (D)1000 Function F(ByVal A As Integer, ByVal B As Integer) As Integer F = A + 2 * B ^ 3 End Function Private Sub Form1_Activated( ) Handles Me.Activated MsgBox(F(3, 2)) 17. 執行下列 Visual Basic 程式片段後,s 的值為何? (A)0 (B)12 (C)60 (D)120 Function f(byval x, ByVal y, ByVal z) As Integer f = x * y * z End Function Private Sub Form1_Activated( ) Handles Me.Activated Dim x, w, L, s As Integer x = 3 : w = 4 : L = 5 s = f(x, w, L) 18. 執行下列 Visual Basic 程式片段後, 訊息交談窗顯示的結果為何? (A)12 32 (B)2 32 (C)2 3 (D)12 3 Private Sub Form1_Activated( ) Handles Me.Activated Dim x As Integer, y As Integer x = 12 : y = 32 Call Proc(x, y) MsgBox(x & " " & y) Sub Proc(ByRef n As Integer, ByVal m As Integer) n = n Mod 10 m = m Mod 10 415
MENU 19. 執行下列 Visual Basic 程式片段後,f n 的值為何? (A)5 5 (B)75 75 (C)75 5 (D)25 25 Function f1(byref x) x = x * x f1 = x + x End Function Function f2(byval x) x = x * x f2 = x + x + x End Function Private Sub Form1_Activated( ) Handles Me.Activated Dim n, f As Integer n = 5 If n \ 2 = n / 3 Then f = f1(n) Else f = f2(n) End If 20. 執行下列 Visual Basic 程式片段後,a b x y 的值為何? (A)a = 1, b = 3, x = 2, y = 3 (B)a = 2, b = 3, x = 2, y = 3 (C)a = 1, b = 2, x = 1, y = 3 (D)a = 2, b = 2, x = 3, y = 3 Private Sub Form1_Activated( ) Handles Me.Activated Dim a, b As Integer a = 1 : b = 2 Call S1(a, b) Sub S1(ByVal x, ByRef y) x = x * 2 : y = y + 1 416
多元練習題 1. 依據輸入的身分證字號來判斷性別 ( 身分證字號中的第 2 個字元為 1, 代表男性 ; 為 2, 代表女性 ) Sub Check_id(ByVal S_id As String) Dim gender As Integer gender = ' 使用 Mid() 從身分證字號 (S_id) 中取第 2 個字元 If Then ' 判斷性別 MsgBox(" 男性 ",, " 判斷性別 ") ElseIf Then MsgBox(" 女性 ",, " 判斷性別 ") End If Private Sub Form1_Activated( ) Handles Me.Activated Dim id As String id = InputBox(" 請輸入身分證字號 :", " 判斷性別 ") Call ' 呼叫副程式 2. 在 Visual Basic 中, 提供有傳值與傳址兩種參數傳遞的方式, 請依下列敘述在空格中填入正確的答案 比較項目傳值傳址 參數傳遞方式的關鍵字 實際參數與形式參數是否使用同一記憶體位址 否是 形式參數的值改變, 實際參數的值是否跟著改變 417
2 第 1 招 不用學語法, 就能寫程式 -Scratch ( 可配合 10-1 節介紹 ) 寫程式前, 必須記憶許多程式語法, 常令人望而卻步 為了鼓勵學生學習程式設計, 美國麻省理工學院 (MIT) 開發了易學易用的 Scratch 程式語言軟體註, 此軟體將程式語法設計成許多 程式方塊, 所以使用者不必背語法, 只要會拼接程式方塊, 即可寫出程式 將程式方塊拼接在一起, 即完成計算 BMI 值程式 程式方塊集合區 程式區 計算 BMI 值的 Scratch 程式範例 註連上 Scratch 網站 (http://scratch.mit.edu), 可下載並安裝 Scratch 軟體 ( 自由軟體 )
第 2 招 製作執行檔,VB 軟體免安裝 ( 可配合第 11 章介紹 ) 在完成程式開發後, 如果我們希望在未安裝 Visual Basic 軟體的電腦中也能執行專案, 可以將專案編譯成執行檔 (.exe) 但須注意要執行專案的電腦, 須安裝有.NET Framework 註程式 1 選 建置 / 建置 " 檔名 " ( 如檔名為 "Ans11-1"), 建立執行檔 2 在我的電腦中, 切換到執行檔存放的位置 ( 即該專案檔所在資料夾下的 bin Debug 資料夾 ) 3 雙按執行檔 ( 如 "Ans11-1.exe"), 即可執行程式 製作程式執行檔 註.NET Framework 是用來支援以.NET 建置的程式, 可讓使用者免安裝軟體 ( 如 Visual Basic 2010) 也可執行專案 透過 微軟公司 網站 (http://www.microsoft.com/downloads/en/search.aspx?q=framework) 可免費下載與安裝.NET Framework 軟體
專題製作演練 - 為推甄預做準備 活動目標 1. 提升同學程式設計的能力 2. 讓同學在練習的過程中, 完成程式作品, 作為未來推甄使用 3. 讓同學以分組的方式參與程式設計, 培養團隊精神 活動進行 1. 將同學分成數組, 各組任選一個主題, 並依要求撰寫程式 ( 若同學在程式撰寫上有困難, 教師可斟酌使用本書教資光碟所附之成果檔講授教學 ) 2. 確認程式正確無誤後, 將程式製作成執行檔 ( 方法可參考單元 3 電腦達人第 2 招 ), 並燒錄於光碟中, 作為日後推甄可使用的資料 程式主題 1. 小算盤 (TQC 類題 ) 試題要求 : (1) 使用者可輸入 2 個數值 ( 變數 a 與變數 b) (2) 按 + - * / 鈕後, 可顯示出變數 a 與變數 b 的算術運算結果 420 2. 統一發票自動對獎程式試題要求 : (1) 使用者可輸入 特別獎 特獎 頭獎 號碼 (2) 使用者輸入發票號碼後, 按 對獎 鈕, 可判斷號碼有無中獎 (3) 中獎規則 : 特別獎 :8 碼與 特別獎 號碼相同得 1,000 萬 特獎 :8 碼與 特獎 號碼相同得 200 萬 頭獎 :8 碼與頭獎號碼相同得 20 萬 二獎 : 末 7 碼與頭獎號碼相同得 4 萬 三獎 : 末 6 碼與頭獎號碼相同得 1 萬 四獎 : 末 5 碼與頭獎號碼相同得 4 千 五獎 : 末 4 碼與頭獎號碼相同得 1 千 六獎 : 末 3 碼與頭獎號碼相同得 200
3. 簡易點餐系統 (TQC 類題 ) 試題要求 : (1) 依左圖設計點餐畫面 (2) 按 結帳 鈕後, 會顯示總金額 4. 身分證號碼檢查 ( 電腦軟體設計丙檢類題 ) 正確 格式錯誤 檢查錯誤 試題要求 : (1) 輸入身分證號碼, 按 檢查 鈕後, 可判斷身分證號碼是否正確 (2) 身分證號碼格式 : 共有 10 碼, 第 1 碼為大寫英文字母, 後 9 碼為數字, 表示如下 : L1 D1 D2 D3 D4 D5 D6 D7 D8 D9 範例 A 1 2 3 4 5 6 7 8 9 說明 英文字母, 代表出地 1 或 2,1 代表男性,2 代表女性 流水號 檢查碼 (3) 身分證號碼檢查方法 : 查出英文字母的代號 : 英文字母 A~Z 各對應一個不同的代號 ( 如下表 ), 先查出對應的代號, 再令 X1 = 代號的十位數,X2 = 代號的個位數, 例如 H 的代號為 17, 所以 X1 = 1, X2 = 7 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 10 11 12 13 14 15 16 17 34 18 19 20 21 22 35 23 24 25 26 27 28 29 32 30 31 33 計算及檢測 : 依下列公式計算 Y 值, 若 Y 能被 10 整除, 則身分證號碼正確, 否則有誤 Y = X1 + 9 X2 + 8 D1 + 7 D2 + 6 D3 + 5 D4 + 4 D5 + 3 D6 + 2 D7 + D8 + D9 421
須經直譯或編譯程式翻譯, 電腦才能執行程式語言計算機概論 第 10 章 認識程式語言 程式語言的種類 : 程序導向語言 高階語言 低階語言 物件導向語言應用軟體語言組合語言機器語言 須經組譯程式翻譯, 電腦才能執行 由 0 與 1 組成, 電腦可直接執行 低階語言與高階語言的比較 : 比較項目 機器語言 組合語言 高階語言 程式的撰寫 難 易 維護與除錯 難 易 可讀性 低 高 可攜性 低 高 執行速度 快 慢 佔用記憶體的空間 小 大 物件導向語言具有封裝 (encapsulation) 繼承(inheritance) 多型(polymorphism) 等 3 種特性 組譯 編譯 直譯的比較 : 翻譯程式適用的程式語言翻譯次數執行速度執行檔 組譯 編譯 直譯 組合語言 高階語言, 如 FORTRAN COBOL Pascal C C++ Visual Basic Java 高階語言, 如 BASIC 只需 1 次快有 每次執行程式皆需重新翻譯 慢 無 演算法 (algorithm): 用來解決特定問題的有限指令或步驟, 我們可依循這些步驟來逐步解決問題 422
資料型別型別符號可表示的數值範圍記憶體佔用空間數值單元 3 第 11 章 Visual Basic 入門 常用的資料型別 : 短整數 Short -32,768~32,767 2 bytes 整數 Integer % -2,147,483,648 2,147,483,647 4 bytes -9,223,372,036,854,775,808 長整數 Long & 類9,223,372,036,854,775,807 8 bytes 正數 :1.4E - 45 3.4E + 38 單精度 Single! 4 bytes 負數 :-3.4E + 38-1.4E - 45 倍精度 Double # 字類字串 String $ 正數 :4.94E - 324 1.79E + 308 8 bytes 負數 :-1.79E + 308-4.94E - 324 文視字串長度而定, 每 1 個字元 ( 英文字母 中文字 符號 ) 佔用 2 bytes 類布林 Boolean 2 bytes 日期時間 Date 8 bytes 物件 Object 字元 Char 2 bytes 其它4 bytes + 變數所儲存資料型別佔用空間 常數 : 用來存放不會隨程式執行而改變內容的資料 ; 變數 : 用來存放會隨程式執行而改變內容的資料 VB 的算術運算子 ( 依運算優先順序, 由高至低 ), 如右表 : 優先順序 1 2 3 4 5 6 7 算術運算子 VB 的基本輸入與輸出函數包含以下 2 種 : ( ) ^ ( 負數 ) * / \ Mod + InputBox 函數 : 用來顯示一個可供使用者輸入資料的輸入交談窗 MsgBox 函數 : 用來產生一個訊息交談窗 第 12 章 條件判斷敘述 比較運算子 : 用來比較 2 個資料項目的大小, 比較結果只有 True 或 False 兩種 邏輯運算子的優先順序 :Not > And > Or > Xor VB 的條件判斷敘述 : If Then: 適用於單一選擇的條件判斷 If Then Else: 適用於雙重選擇的條件判斷 If Then ElseIf: 適用於多重選擇的巢狀條件判斷 Select Case: 適用於多重選擇的條件判斷 Case 敘述中的條件式, 有右表 3 種表示方式 (n m 各代表一個數值 ): 語法數值或字串 Case 數值 ( 或字串 ) 指定範圍 Case n To m 關係運算子 Case Is 關係運算子 n 範例 Case 1 Case 2, 3, 4 Case "A", "B" Case 0 To 5 Case 10 To 20 Case Is > 2 Case Is <= 10 423
計算機概論 第 13 章 迴圈敘述 VB 的迴圈敘述 : For Next: 適用於已確定須執行次數的迴圈 While End While: 適用於無法事先確定需執行多少次的迴圈 Do Loop 敘述 : 適用於無法事先確定需執行多少次的迴圈, 分為前測式及後測式 2 種 前測式 ( 先判斷條件式是否為真才執行 ) Do While 條件式程式區塊 Loop Do Until 條件式程式區塊 Loop 後測式 ( 先執行一次才判斷條件式是否為真 ) Do 程式區塊 Loop While 條件式 Do 程式區塊 Loop Until 條件式 第 14 章 陣列 陣列 (array): 由一群資料型別相同的陣列元素 (elements) 所組成 在存取陣列中的資料項目時, 須使用陣列的註標 (index) 來標示所要存取的資料項目, 註標值預設從 0 開始 陣列的維數是依據註標的個數來區分, 例如含有 1 個註標之陣列稱為一維陣列 含有 2 個註標稱為二維陣列, 依此類推 堆疊 (stack) 與佇列 (queue): 堆疊是後進先出 (LIFO) 的資料結構 ; 佇列則是先進先出 (FIFO) 的資料結構 第 15 章 函數與副程式 使用自定函數及副程式的好處是可重覆使用 易於測試與偵錯, 並可簡化程式維護的工作 函數包含內建函數及自定函數 2 種 內建函數是 VB 預先設計好的程式 ; 自定函數則是使用者依特定的需求, 所自行開發的程式 副程式與自定函數都可被主程式呼叫, 差別在於自定函數執行後, 會傳回一個值給呼叫它的程式, 而副程式不會 在呼叫副程式 ( 或自定函數 ) 時, 有 2 種參數傳遞的方式, 比較如下 : 參數傳遞的機制 比較項目傳值傳址 參數傳遞方式的設定 實際參數與形式參數是否使用同一記憶體位址形式參數的值改變, 實際參數的值是否跟著改變 先將實際參數的值複製到形式參數中, 接著副程式使用形式參數的值來作運算 在形式參數前加上關鍵字 "ByVal" ( 預設 ) 否 否 先將實際參數的位址傳遞給形式參數, 接著副程式使用該位址的值來作運算 在形式參數前加上關鍵字 "ByRef" 是 是 424