Download presentation
Presentation is loading. Please wait.
1
程式語言(I)- Visual Basic 6.0 陣列&副程式
2
一、陣列簡介(1/2) 陣列是由一群資料型別相同的陣列元素所組成
每一個陣列元素可存入一個資料項目,這些資料項目通常會儲存在電腦相鄰的記憶體中 存取陣列元素時,必須使用陣列的註標 陣列名稱:A 陣列元素 陣列註標 1 2 3 4 … 第3個元素(陣列註標為2)中存放的資料為30
3
一、陣列簡介(2/2) 使用陣列的好處: 方便管理程式中需使用多個相同資料型別的資料項目
Dim pro_grade(0 To 39) As Integer Dim pro_grade1 As Integer Dim pro_grade2 As Integer Dim pro_grade3 As Integer … Dim pro_grade40 As Integer 使用陣列 使用變數
4
二、一維陣列(1/3) 最基本的陣列形式,其註標只有1個 適用時機:當在程式中,需要使用多個相同類型之資料項目時
例如:宣告一個陣列A來存放12個月份的天數 31 28 30 陣列:A 陣列註標 1 2 3 4 A(1)=28 5 6 7 8 9 10 11
5
二、一維陣列(2/3) 語法1: 語法2: 例:Dim A(3) as Short Dim A As Short( ) = New Short( ) {1, 2, 3, 4} Dim 陣列名稱 (註標上限) [As 資料型別] Dim 陣列名稱 As 資料型別( ) = New 資料型別( ) {陣列元素初始值}
6
二、一維陣列(3/3) 應用範例:儲存自己喜愛歌手的排名
Private Sub Form1_Load(ByVal sender…) Handles MyBase.Load Dim i As Short Dim singer(9), rank As String rank = "" For i = 0 To 9 singer(i) = InputBox("請依序輸入自己喜歡的歌手;第" & i + 1_ & " 名:", "人氣歌手普查") rank &= "第" & i + 1 & " 名:" + singer(i) + vbCrLf Next MsgBox(rank, , "我最喜歡的歌手排行榜") End End Sub
7
偶像明星大考驗 實作 P P.274
8
三、多維陣列(1/9) 當陣列的註標個數超過 1 個時,即稱之為多維陣列
只有 1 個註標的陣列,稱為一維陣列;2 個註標的陣列,稱為二維陣列,依此類推
9
三、多維陣列(2/9) 適用時機:當程式中的資料需要使用2個以上的註標值來識別時 例如:儲存全班同學的國、英、數三科成績
陣列名稱:score score(0, 2)=75 表示座號為1之同 學的數學成績 80 82 75 90 85 1 2 88 70 65 71 78 76 3 … 第1維註標值代表座號 第2維註標值代表科目別(國、英、數)
10
設定陣列初值 方法一:Dim x(2,3) As Integer x(0,0)=1 : x(0,1)=2 : x(0,2)=3 :
x(1,0)=5 : x(1,1)=6 : x(1,2)=7 : x(1,3)=8 x(2,0)=9 : x(2,1)=10 : x(2,2)=11 : x(2,3)=12 方法二:Dim x(,)={{1,2,3,4},{5,6,7,8},{9, 10,11,12}} 第一欄 第二欄 第三欄 第四欄 第一列 a(0,0) a(0,1) a(0,2) a(0,3) 第二列 a(1,0) a(1,1) a(1,2) a(1,3) 第三列 a(2,0) a(2,1) a(2,2) a(2,3)
11
三、多維陣列(3/9) 例:Dim B(2, 1) As Integer Dim B As Integer( , ) = New Integer( , ) {{1, 3}, {2, 4}, {7, 9}} 設定B(0, 0)及B(0, 1)等2個陣列元素初始值 設定B(1, 0)及B(1, 1)等2個陣列元素初始值 設定B(2, 0)及B(2, 1)等2個陣列元素初始值
12
三、多維陣列(4/9) 語法1: 語法2: Dim 陣列名稱 (N, M, L, …) [As 資料型別]
Dim 陣列名稱 As 資料型別(, [,]) = New 資料型別(, [,]) {陣列元素初始值}
13
三、多維陣列(5/9) 二維陣列示意圖(存放男女星座速配指數): 可將第一維及第二維假想成表格中的橫列與直行 90 68 79 52 97
61 85 60 43 72 71 75 88 76 82 56 91 74 80 41 78 89 98 70 46 … 1 2 3 4 5 6 7 8 9 10 11 陣列名稱:match → 第二維註標代表女性12星座(白羊座~雙魚座) ↓ 第一維註標代表男性 星座(白羊座~雙魚座)
14
三、多維陣列(6/9) 應用範例:輸入並儲存各個星座速配指數 Dim match(11, 11), i, j As Short
Dim sign As String() = New String() {"白羊", "金牛", "雙子", "巨蟹", "獅子", "處女", _ "天秤", "天蠍", "射手", "魔羯", "水瓶", "雙魚"} Label1.Text = "男/女" + " " '設定星座速配指數表的標題列 For i = 0 To 11 Label1.Text &= sign(i) + " " Next For i = 0 To '利用巢狀For-Next迴圈讀取星座速配指數並設定速配指數表的內容 TextBox1.Text &= sign(i) '設定速配指數表的第1欄 For j = 0 To 11 match(i, j) = InputBox("男性為" & sign(i) & "及女性為" & sign(j) & _ "的星座速配指數:", "建立星座速配指數表") TextBox1.Text &= StrDup(2, " ") & Format(match(i, j), "##") TextBox1.Text &= vbCrLf
15
三、多維陣列(7/9) 三維陣列示意圖(存放英文不規則動詞三態變化): 陣列名稱:verb
第三維註標代表動詞三態 (原形、過去式、過去分詞) 1 … 級 buy bought think thought 2 sing sang sung become became go went gone take took taken 第 標 代 一 表 註 維 至 三 年 第二維註標代表編號
16
三、多維陣列(8/9) LBound( )函數:傳回陣列註標的下限 UBound( )函數:傳回陣列註標的上限 語法:
例:傳回陣列A之第2維的下限值 MsgBox(LBound(A, 2)) UBound( )函數:傳回陣列註標的上限 例:傳回陣列B之第1維的上限值 MsgBox(UBound(B)) LBound(陣列名稱[, 欲查詢的維數]) UBound(陣列名稱[, 欲查詢的維數])
17
三、多維陣列(9/9) 重新配置陣列元素的個數 可改變陣列的維度或陣列元素的個數,以機動地調整陣列的大小,靈活運用記憶體空間 語法:
例1:將陣列A調整為含有6個陣列元素的陣列 ReDim A(5) 例2:保留原陣列B中的陣列元素值,並調整為3 × 的二維陣列 ReDim Preserve B(2, 3) ReDim [Preserve] 陣列名稱(註標上限)
18
二維陣列實作 查詢星座速配指數 P.271 +P274. 練習:P281 (四星彩預估出號系統)
19
RoCar Do Re Mi Fa So La Si 低音 10 20 30 40 50 60 70 中音 110 120 130 140
RC.MusicOut(110,2) ‘中音Do, 0.2秒 RC.MusicOut(270,5) RC.MusicOut(115,2) RC.MusicOut(0,2) Do Re Mi Fa So La Si 低音 10 20 30 40 50 60 70 中音 110 120 130 140 150 160 170 高音 210 220 230 240 250 260 270
20
副程式 副程式: 一段獨立的程式區塊,由Sub與End Sub之間的程式敘述所組成 使用呼叫(call)的方式來執行副程式 .
Call 副程式A Sub 副程式A End Sub 呼叫 返回 執行 主程式 副程式
21
副程式 語法: 《定義副程式的語法》 Sub 副程式名稱 ([形式參數1 [As 資料型別], 形式參數2 [As 資料型別], …]) 程式敘述區塊 End Sub 《呼叫副程式的語法》 Call 副程式名稱 ([實際參數1, 實際參數2, …])
22
副程式範例(1) 副程式: 副程式的範例: Sub Change_temp(F As Integer) 'F為形式參數
Dim C As Integer C = (F - 32) * 5 / 9 MsgBox"華氏" & F & " 度 = 攝氏 " & C & " 度", , "溫度換算" N = InputBox("輸入N值:計算2的N次方") End Sub Private Sub Form_Activate( ) Dim F_temp As Integer F_temp = InputBox("請輸入華氏溫度:", "溫度換算") Call Change_temp(F_temp) 'F_temp為實際參數
23
副程式範例(2) 範例:計算家庭用電費與營業用電費 … … … Private Sub Form1_Activated…… '計算家庭用電費
讀取用電類型 讀取用電量 If 用電類型為家庭用電 Then 呼叫副程式F_Expense( ) ElseIf 用電類型為營業用電 Then 呼叫副程式C_Expense( ) End If End Sub '計算家庭用電費 Sub F_Expense…… End Sub '計算營業用電費 Sub C_Expense…… … … … 主程式 副程式
24
副程式範例(2) 主程式 Private Sub Form1_Activated(ByVal sender ……) Handles Me.Activated 10: Dim ecase As Short 20: Dim usage As Single 30: ecase = InputBox("請輸入用電類型:1)家庭用電 2)營業用電", _ "電費試算") 40: usage = InputBox("請輸入用電量,單位:度", "電費試算") 50: If ecase = 1 Then 60: Call F_Expense(usage) '呼叫副程式計算家庭用電費 70: Else 80: Call C_Expense(usage) '呼叫副程式計算營業用電費 90: End If 100: End End Sub
25
副程式範例(2) 副程式F_Expense( ) Sub F_Expense(ByVal volume As Single) '計算家庭用電
110: Dim fee As Integer 120: If volume > 500 Then '用電量超過500度 130: fee = 110 * * (volume - 500) * 3.6 140: ElseIf volume > 110 Then '用電量超過110度 150: fee = 110 * (volume - 110) * 2.875 160: Else '用電量在110度以內 170: fee = volume * 2.1 180: End If 190: MsgBox("電費為" & fee & " 元", , "電費試算") End Sub
26
副程式範例(2) 副程式C_Expense( )
Sub C_Expense(ByVal volume As Single) '計算營業用電費 200: Dim fee As Integer 210: Const rate As Single = 3.1 220: fee = rate * volume '計算電費 230: MsgBox("電費為" & fee & " 元", , "電費試算") End Sub
27
自定函數 自定函數的功能與副程式類似;差別在於自定函數在執行結束後會產生一個傳回值給呼叫它的程式 1.呼叫 2.執行
主程式 Public Class Form1 X = 自定函數A( ) End Class 自定函數 Function 自定函數A( ) As Short 自定函數A = 100 End Function 3.返回並將值100傳回給變數X 2.執行 4.執行下一行程式敘述 … …
28
自定函數語法 語法: 《定義自定函數的語法》 Function 自定函數名稱([形式參數1[As 資料型別], 形式參數2_ [As 資料型別], …]) As 資料型別 程式敘述區塊 自定函數名稱 = 傳回值 End Function 《呼叫自定函數的語法》 變數名稱 = 自定函數名稱([實際參數1, 實際參數2, …])
29
自定函數範例(1) 自定函數: 自定函數的範例:
Function Cal_Circle(r As Single) As Single 'F為形式參數 Const pi = Cal_Circle = r ^ 2 * pi End Function Private Sub Form_Activate( ) Dim X As Single, area As Single X = InputBox("請輸入圓的半徑:", "計算圓面積") Area = Cal_Circle(X) 'X為實際參數 MsgBox "半徑為 " & X & " 的圓面積 = " & area, , "計算圓面積" End Sub
30
自定函數範例(2) 範例:華氏溫度換算為攝氏溫度
Function Convert_temp(ByVal F As Short) As Short 'F為形式參數 60: Convert_temp = (F - 32) * 5 / 9 '攝氏溫度= (華氏溫度- 32 ) * 5 / 9 End Function Private Sub Form1_Activated(ByVal sender …) Handles Me.Activated 10: Dim F_temp, C_temp As Short 20: F_temp = InputBox("請輸入華氏溫度:", "溫度換算") 30: C_temp = Convert_temp(F_temp) 'F_temp為實際參數 40: MsgBox("華氏" & F_temp & " 度= 攝氏" & C_temp & " 度", , _ "溫度換算") 50: End End Sub
31
副程式vs自定函數 Function Convert_temp(ByVal F As Short) As Short 'F為形式參數
Sub Change_temp(F As Integer) 'F為形式參數 Dim C As Integer C = (F - 32) * 5 / 9 MsgBox"華氏" & F & " 度 = 攝氏 " & C & " 度", , "溫度換算" N = InputBox("輸入N值:計算2的N次方") End Sub Private Sub Form_Activate( ) Dim F_temp As Integer F_temp = InputBox("請輸入華氏溫度:", "溫度換算") Call Change_temp(F_temp) 'F_temp為實際參數 Function Convert_temp(ByVal F As Short) As Short 'F為形式參數 60: Convert_temp = (F - 32) * 5 / 9 '攝氏溫度= (華氏溫度- 32 ) * 5 / 9 End Function Private Sub Form1_Activated(ByVal sender …) Handles Me.Activated 10: Dim F_temp, C_temp As Short 20: F_temp = InputBox("請輸入華氏溫度:", "溫度換算") 30: C_temp = Convert_temp(F_temp) 'F_temp為實際參數 40: MsgBox("華氏" & F_temp & " 度= 攝氏" & C_temp & " 度", , _ "溫度換算") 50: End End Sub
32
一、模組化設計的概念 模組通常是指一段具有某種 特定功能、大小適中、容易 閱讀及維護的程式
將程式切割成許多個子功能 後,便可分別撰寫成模組程 式 模組1 模組2 模組3 模組n 大型程式 …
33
二、模組設計的原則 設計功能單純的模組程式,以便提供給更多程式使用 儘量減少模組之間相互影響的程度,以使模組成為獨立的程式基本單元
將模組控制在適當的大小(例如不超過50行敘述),以方便閱讀與維護
34
三、使用模組的優點 模組可重覆使用 程式開發易於分工 程式易於測試與偵錯 可簡化維護的工作 模組A 模組B 模組F … 模組A'
呼叫 模組A 模組B 模組F … 模組A' 模組A具有檢查產品編號功能 產品編號的檢查規則改變時 只要修改模組A即可
35
四、模組設計的方法 在專案中加入空白模組檔,撰寫副程式或自定函數,以設計模組程式(如左下圖) 在專案中匯入某個專案中的模組檔(如右下圖)
表單檔 模組檔 程式專案P1 程式專案P2 匯入現有模組檔 撰寫模組程式
36
一維陣列 110 2 120 130 …… Dim a() as short()=new short() {110, 2, 120, 2, ……}
37
參考 source code(一維陣列) Public Class Form1
Dim WithEvents RC As New vRobots.RoCar01 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim music2Tiger As Integer() = New Integer() _ {110, 2, 120, 2, 130, 2, 110, 2, 110, 2, 120, 2, 130, 2, 110, 2, _ 130, 2, 140, 2, 150, 4, 130, 2, 140, 2, 150, 4, _ 150, 1, 160, 1, 150, 1, 140, 1, 130, 2, 110, 2, _ 110, 2, 50, 2, 110, 4, 110, 2, 50, 2, 110, 4} Dim i As Integer For i = 0 To UBound(music2Tiger) step RC.musicout(music2Tiger(___), music2Tiger( )) Next End Sub End Class
38
二維陣列 110 2 120 130 140 ……. ….. Dim a(,) as short(,)=new short(,) {{110, 2},{ 120, 2}, ……}
39
參考 source code(二維陣列) Public Class Form1
Dim WithEvents RC As New vRobots.RoCar01 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim music2Tiger As Integer(,) = New Integer(,) _ {{110, 2}, {120, 2}, {130, 2}, {110, 2}, {110, 2}, {120, 2}, {130, 2}, {110, 2}, _ {130, 2}, {140, 2}, {150, 4}, {130, 2}, {140, 2}, {150, 4}, _ {150, 1}, {160, 1}, {150, 1}, {140, 1}, {130, 2}, {110, 2}, _ {110, 2}, {50, 2}, {110, 4}, {110, 2}, {50, 2}, {110, 4}} Dim i As Integer For i = 0 To UBound(music2Tiger, 1) RC.musicout(music2Tiger(i, 0), music2Tiger(i, 1)) Next End Sub End Class
40
作業 利用二維陣列 & 副程式 Let RoCar sing 2 songs at least.
41
月考大洩題 DIM A(2,3) As Integer 問題一:A(1,3)=? 問題二:A(A(1,0)+1, A(3,2))=? 註標
1 2 3 DIM A(2,3) As Integer 問題一:A(1,3)=? 問題二:A(A(1,0)+1, A(3,2))=?
42
月考大洩題(續) Private Sub Form_Activate() DIM A(5) FOR I=1 TO 5
A(I)=A(I-1)+2*I NEXT End Sub
43
月考大洩題(續) Private Sub Form_Activate() DIM A(3, 2),B(2, 3) FOR I=1 TO 3
FOR J=1 TO 2 A(I,J)=I+J B(J,I)= A(I,J) NEXT End Sub
Similar presentations