Download presentation
Presentation is loading. Please wait.
1
新觀念的 VB6 教本 第八章 陣列(Array)
2
8-1 陣列的基本觀念與用法
3
陣列的基本觀念與用法(1) 陣列(Array)與我們前面介紹過的變數一樣,其功能都是用來儲存資料,所不同的是每一個變數只能儲存一項資料,而每一個陣列則可用來儲存連續的多項資料。
4
陣列的基本觀念與用法(2)
5
使用陣列(1) 陣列必須先宣告才能使用,其宣告格式 與變數的宣告很像,例如: 最簡單的陣列宣告格式是: Dim 陣列名稱(N)
6
使用陣列(2) Dim 陣列名稱(N) N 代表最後一項資料的順序,例如:
7
使用陣列(3) 一旦宣告了陣列,我們就可以存取陣列中各單項的資料,存取的方法是在陣列名稱之後加上 "(資料順序)",例如:
8
使用陣列(4) 又如: X(1) = ’ 將 350 存到陣列 X 的第 1 項資料中 X(2) = X(0) + X(1) ’ 分別取出陣列 X 的第 0 項及第 1 項 ’ 資料,相加後,存到第 2 項資料中
9
使用陣列(5) 在術語上,陣列中的每一項資料叫做一個元素(element),而用來指定某一個元素的 0、1、2、…順序叫做註標(subscript),如下:
10
陣列的宣告(1) 陣列的宣告除了前面的「Dim 陣列名稱 (N)」格式之外,也可以是以下格式:
額外多出來的「As 資料型別」與「+型 別宣告符號」其作用是指定陣列的資料 型別。 Dim 陣列名稱(N) As 資料型別 或 Dim 陣列名稱+型別宣告符號(N)
11
陣列的宣告(2) 例如: Dim Y(10) As Integer ’ 宣告一個含有11個元素的陣列而每 ’ 一個陣列元素的資料型別都是整數 Dim Z$(9) ’ $ 是字串的型別宣告符號,所以這個 ’敘述宣告了 10 個字串元素的陣列
12
使用陣列的注意事項(1) 陣列宣告敘述只能用於程式視窗,即時運算視窗是不接受的。
13
使用陣列的注意事項(2) 不能夠一次讀取或指定整個陣列的資料,例如:
Dim Y(10) As Integer Y = 100 ' 想把整個陣列的資料指定為 100,不接受 For I = 0 To Y(I) = 100 ' 逐一對每一個陣列元素進行指定動作才是正確的 Next I
14
使用陣列的注意事項(3) 用來指定某一項資料的註標不能超過陣列的註標範圍,例如:
Dim Y(10) As Integer ' 陣列 Y 的註標範圍是 0~10 Y(-1) = 5 ' 錯誤,-1 超過註標範圍 Y(11) = 15 ' 錯誤,11 超過註標範圍
15
陣列的優點(1) 我們利用陣列把資料一一排列在一起,可以使得資料的存取變得比較方便,舉例來說,如果我們把 5 項資料放在 5 個變數裡面,例如: A = "Word" B = "Excel" C = "PowerPoint" D = "Access" E = "Mail"
16
陣列的優點(2) 則把它們逐行印出來,必須使用 5 個敘述: Print A Print B Print C Print D Print E
17
陣列的優點(3) 如果我們把這 5 項資料放在陣列裡面,則只需 三行敘述就可以把它們全部印出來,如下:
而即使資料的項數多達100項,也只要將上述 程式 For 敘述中的4 改成 99,就可以把資料全 部印出來,如果換成列印100個變數可就累了。 For I = 0 To Print X(I) Next I
18
陣列的優點 -- 實例練習一 輸入5份資料,然後將資料顛倒順序列印出來。
Dim X(4) For I = 0 To X(I) = InputBox("請輸入第 " & I & " 份資料") Next For I = 4 To 0 Step Print "請輸入第 " & I & " 份資料 = "; X(I) Next
19
陣列的優點 -- 實例練習二 輸入5份數值資料,輸入完畢之後,將最大值及最小值顯示出來。
Dim X(4) For I = 0 To X(I) = Val(InputBox("請輸入第 " & I & " 份資料")) Next Min = X(0) ' 先假設第0份資料為最小值 Max = X(0) ' 先假設第0份資料為最大值 For I = 1 To 4 ' 然後從第1份資料開始比較 If X(I) < Min Then Min = X(I) If X(I) > Max Then Max = X(I) Next Print "最大值 = ";Max, "最小值 = ";Min
20
8-2 陣列進階
21
註標範圍的設定(1) 以「Dim 陣列名稱(N)」敘述所宣告的陣列, 其註標範圍是0~N,其中起始註標是固定的 (等於0),而終止註標則由宣告時的N值決定。 另外還有一種宣告格式則可設定非0的起始註 標,其格式如下:
22
註標範圍的設定(2) 例如: Dim X(4)' 等於 Dim X(0 To 4) Dim A(-4 To 5)' 註標範圍從 -4 到 5, 共 5-(-4)+1=10 項資料
23
註標範圍的讀取 陣列的註標範圍可以設定,也可以讀取, 其方法是呼叫 Lbound 及 Ubound 函數: 例如:
V1 = LBound(陣列名稱) ' 讀取起始註標 V2 = UBound(陣列名稱) ' 讀取終止註標 Dim A(-4 To 5) Print LBound(A) ' 印出 -4 Print UBound(A) ' 印出 5
24
註標範圍讀取 -- 實際應用 Lbound 與 Ubound 若應用在程式中,可增加程式的彈性, 舉例來說,前面有一段列印陣列所有資料的程式,如下: 這個程式的缺點是:當我們修改陣列 X 的註標範圍時, 必須跟著修改 For 敘述中的 0 及 4。如果把它改成: 則將來即使註標範圍有所改變,我們也不必修改這段程式。 For I = 0 To Print X(I) Next I For I = LBound(X) To UBound(X) Print X(I) Next I
25
可改變大小陣列 -- ReDim敘述(1) 利用 Dim 所宣告的陣列,其大小是固定的,也就是說,陣列元素的個數是不能改變的,如果我們想機動地調整陣列的大小,就不適合使用 Dim 敘述來宣告陣列,為此,VB 提供了另一種宣告陣列的敘述 – ReDim 敘述。
26
可改變大小陣列 -- ReDim敘述(2) ReDim 敘述在陣列宣告的格式上與 Dim 敘述完全相同,例如:
Dim A(5) ' 宣告一個含有 6 個元素的陣列 ReDim B(5) ' 也是宣告一個含有 6 個元素的陣列
27
可改變大小陣列 -- ReDim敘述(3) 所不同的是以 ReDim 所宣告的陣列,將 來可以再利用 ReDim 敘述來調整陣列的 大小,調整敘述的格式如下:
28
可改變大小陣列 -- ReDim敘述(4) 例如:
Dim A(5) ReDim B(5) … ReDim A(10) ' 錯誤!陣列 A 的大小不能改變 ReDim B(20) ' 將陣列 B 的註標範圍由 0~5 調整成 0~20 … ReDim B(-1 To 4) ' 又將陣列 B 的註標範圍調整成 -1~4
29
可改變大小陣列 -- Dim 陣列名( ) 除了 ReDim 敘述之外,如果一開始利用 Dim 敘述宣告 0 個元素的陣列,則這個陣列也是可以改變大小的,例如: Dim X() ' 陣列元素個數等於0,所以將來陣列是可以改變大小的 Dim Y(0) ' 陣列元素個數等於1,所以陣列的大小是固定 ReDim Z(5) ' 使用ReDim宣告陣列,所以將來陣列是可以改變大小的 ReDim X(10) ' 正確 ReDim Y(10) ' 錯誤 ReDim Z(10) ' 正確
30
可改變大小陣列 -- 保留陣列元素的值(1) 請注意利用ReDim調整大小的陣列,原陣列中的所有資料都會被清成0或空值,如果想保留原陣列中的資料,則要在ReDim之後加上Preserve保留字,格式是:
31
可改變大小陣列 -- 保留陣列元素的值(2) 請參考以下例子:
可改變大小陣列 -- 保留陣列元素的值(2) 請參考以下例子: ReDim X(5) ReDim Y(10) As Integer For I = 0 To X(I) = “computer” & I Next I For I = 0 To Y(I) = I*10 Next I ReDim X(10) ‘ 把陣列 X 加大,但未加 Preserve,所以 ’ 原陣列 X(0)~X(5) 的資料都會被清掉 ReDim Preserve Y(7) ‘ 將陣列 Y 縮小,但加了 Preserve,所以 ' 原陣列中Y(0)~Y(7)的數值將得以保留下來
32
可改變大小陣列 --實例練習(1) 寫一程式讀取使用者輸入的資料,並存入陣列中,直到使用者輸入 “quit” 為止。
可改變大小陣列 --實例練習(1) 寫一程式讀取使用者輸入的資料,並存入陣列中,直到使用者輸入 “quit” 為止。 由於不知道使用者會輸入幾筆資料,所 以我們必須使用 ReDim 或 Dim X() 的功 能,機動地調整陣列的大小,所以程式 大致如下:
33
可改變大小陣列 --實例練習(2) Dim X() ’ 先宣告一個陣列元素個數等於0的陣列 N = ’ 用變數 N 來記錄使用者輸入的筆數 data = InputBox(“請輸入資料”) While data <> “quit” ’ 若輸入≠“quit”,持續輸入 ReDim Preserve X(N+1) ’ 將陣列 X 加大 1 筆 X(N) = data ' 將輸入的資料指定到陣列的最後一個元素 N = N ’增加了一筆 data = InputBox("請輸入資料") Wend
34
可改變大小陣列 --實例練習(3) 輸入結束後,如果您想檢查陣列的內容是否正確,可利用以下迴圈將資料輸出到表單上:
可改變大小陣列 --實例練習(3) 輸入結束後,如果您想檢查陣列的內容是否正確,可利用以下迴圈將資料輸出到表單上: For I = 0 To N Print X(I), ' 尾巴加個逗號,表示不要跳行 If (I+1) MOD 4 = 0 Then Print ' 每 4 筆跳一行 Next I
35
二維陣列(1) 除了一一排列的資料之外,我們也可能會處理表格式的資料,例如: 第0行 第1行 第2行 第3行 第0列 打擊者 長打率 上壘率
打擊率 第1列 Bill 0.5 0.42 0.387 第2列 David 0.453 0.39 0.333 第3列 Norman 0.36 0.34 第4列 Walter 0.392 0.32
36
二維陣列(2) 以這個表格為例,計有5列、4行,所以共有 5×4 項資料,如果我們想用陣列來儲存這個表 格,則可以這樣宣告:
像這樣含有兩個註標的陣列,稱為二維陣列, 而存取二維陣列的資料也會使用到兩個註標, 例如: X(1, 2) = 0.42 ' 將第 1 列、第 2 行的資料指定成 0.42 Print X(3, 2) ' 印出第 3 列、第 2 行的資料
37
二維陣列(3) 如果我們將整個陣列的註標標示出來,則是: 第0行 第1行 第2行 第3行 第0列 (0,0) (0,1) (0,2)
(0,3) 第1列 (1,0) (1,1) (1,2) (1,3) 第2列 (2,0) (2,1) (2,2) (2,3) 第3列 (3,0) (3,1) (3,2) (3,3) 第4列 (4,0) (4,1) (4,2) (4,3)
38
二維陣列資料的輸入(1) 如果要對整個二維陣列的資料進行處理,通常要使用 For-Next 巢狀迴圈,例如利用 InputBox 輸入資料到以上 二維陣列的程式,如下圖。 請注意在程式-1之中,我們以「列」為外迴圈,所以外 迴圈每執行一次,便存入一橫列。
39
二維陣列資料的輸入(2) 如果以「行」為外迴圈,則外迴圈每執行一次,便存入一直行,如下右圖。
40
二維陣列的實例研究(1) 歌唱大賽 5 位歌者進入總決賽,有 10 位評審參與評分工作,試寫一程式記錄 10 位評審給 5 位歌者的分數,最後再計算每位歌者的總分及平均分數。
41
二維陣列的實例研究(2) Dim Score(4, 9) For I = 0 To 4 Sum = 0 For J = 0 To S = "輸入第" & I + 1 & "位歌者, 第" & J + 1 & "位評審的分數" Score(I, J) = Val(InputBox(S)) Sum = Sum + Score(I, J) Next J Print "第"; I + 1; "位歌者總分 ="; Sum, "平均分數 ="; Sum / 10 Next I
42
多維陣列(1) 除了一維跟二維陣列之外,我們也可宣告一個任意維數的陣列,如下:
43
多維陣列(2) 例如: Dim Z(3, 4, 5, 6, 9) '宣告一個五維陣列,可儲存的資料數共有: ' (3+1)(4+1)(5+1)(6+1)(9+1)=8400
44
Array:讓「變數」變成「陣列」的函數(1)
VB 提供了一個有趣的函數 Array,可以 讓變數變成陣列,例如: 結果顯示出來的內容分別等於 "春"、"夏 "、"秋"、"冬",證明X是一個陣列。 Dim X ‘ X 是一個不定型變數 X = Array("春", "夏", "秋", "冬") Print X(0), X(1), X(2), X(3) ' 檢驗X的值
45
Array:讓「變數」變成「陣列」的函數(2)
Array 最方便的地方在於可以一次指定多個元 素,以上面的程式為例,如果不使用 Array 函 數,則程式必須寫成: 在書寫上確實比較不方便。 Dim Y(3) Y(0) = "春" Y(1) = "夏" Y(2) = "秋" Y(3) = "冬"
46
使用 Array 的注意事項 請注意Array函數的傳回值只能指定給不定型變數,請參考以下幾個例子:
Dim X1 ' X1 是不定型變數 Dim X2 As Variant ' X2 是不定型變數 Dim X3 As String ' X3 是字串變數 Dim X4(3) ' X4 是不定型變數陣列 X1 = Array("春", "夏", "秋", "冬") ' 正確 X2 = Array("春", "夏", "秋", "冬") ' 正確 X3 = Array("春", "夏", "秋", "冬") ' 錯誤!! X4 = Array("春", "夏", "秋", "冬") ' 錯誤!!
47
Array 的實例練習(1) 讓使用者輸入1~12,然後顯示對應的中文月份,例如輸入8即顯示「八月」。
Private Sub Command1_Click() Dim M M = Array(“一月”, “二月”, “三月”, “四月”, “五月”, “六月”, _ “七月”, “八月”, “九月”, “十月”, “十一月”, “十二月") L10: X = Val(InputBox("請輸入 1~12 的數字")) If X < 1 Or X > 12 Then MsgBox "超出範圍, 請重輸入!": GoTo L10 Print "月份 = " & M(X - 1) End Sub
48
Array 的實例練習(2) 在以上程式中,有兩個地方值得注意:
由於 M 的陣列註標是從 0~11,所以根據輸入的X值來顯示月份時,應使用 M(X -1),而不是 M(X)。 由於 Array 敘述太長了,此時可以在敘述中插入 " _"(一個空白字元及一個底線字元),然後將後面的敘述輸入於下一行。
49
8-3 控制元件陣列及其應用
50
控制元件陣列 除了將多個變數集合起來構成變數陣列之外,控制元件也可以集合起來構成控制元件陣列,唯控制元件陣列的形成與 Dim 敘述無關,而取決於控制元件佈置的技巧與屬性的設定。
51
佈置控制元件陣列 -- Step1 在表單上佈置一影像框(Image)控制元件,並且將其 Picture 屬性設定成本書 ch08 目錄底下的 trffc10a.ico 圖示檔,佈置之後,表單的外觀如下:
52
佈置控制元件陣列 – Step2 在此一影像框上面按下滑鼠右鈕,待出現快顯功能表時,選取其中的「複製」命令。
53
佈置控制元件陣列 – Step3 在表單上按下滑鼠右鈕,待出現快顯功能表時,選取其中的「貼上」命令。
54
佈置控制元件陣列 – Step4-1 步驟 3 的目的是將剪貼簿之中的Image1影像框複製到表單上面,但表單上原本就已經有一個名稱為Image1的影像框了,結果VB會顯示以下交談窗:
55
佈置控制元件陣列 – Step4-2 接下來選取「是」,表示要將 Image1 建立成控制元件陣列,接著原先的 Image1 會成為 Image1(0)、新複製進來的 Image1 控制元件則成為 Image1(1),而兩個控制元件就形成了一組 Image1(0 To 1) 的控制元件陣列。
56
佈置控制元件陣列 – Step5 將新複製進來的 Image1(1) 控制元件移到 Image1(0) 的旁邊,並且將 Image1(1) 的 Picture 屬性設定為本書 ch08 目錄底下的 trffc10b.ico 圖示檔。
57
佈置控制元件陣列 – Step6 仿照步驟 3~5 再複製一個 Image1 控制元件,結果這一個控制元件會成為 Image1(2),接著將新複製進來的 Image1(2) 控制元件移到 Image1(1) 的旁邊,並且將其 Picture 屬性設定為本書 ch08 目錄底下的 trffc10c.ico 圖示檔,完成的表單如下圖:
58
檢驗控制元件陣列是否佈置成功(1) 經過以上動作之後,請檢視屬性視窗的物件盒,如果可以看到 Image1(0)~Image1(2),即表示影像框陣列已經佈置成功了。
59
檢驗控制元件陣列是否佈置成功(2) 接下來請檢視 Image1(0)~Image1(2) 的 Index 屬性值,結果應該等於:
顯然地,每一個影像框的 Index 屬性值就等於 該影像框在影像框陣列中的註標(index)。 物 件 Index 屬性值 Image1(0) Image1(1) 1 Image1(2) 2
60
控制元件陣列 -- 實例練習 實例:燈號變換程式
剛才我們設定給Image1(0)~Image1(2) 的圖片是交通號誌的綠燈、黃燈、及紅燈,接下來我們想在表單上佈置一個命令鈕,而每按命令鈕一次,就讓顯示在表單上的燈號變換一次。
61
控制元件陣列 -- 實例練習 Step1 將Image1(0)~Image1(2) 的Visible(可見的)屬性設定為False。(註:將某一個控制元件的Visible屬性設定為False時,則該控制元件在執行階段將不會被顯示出來)
62
控制元件陣列 -- 實例練習 Step2 在表單上佈置一命令鈕,並且撰寫以下程式:
Dim Index As Integer ' 此一變數的宣告須撰寫在程式區塊之外 Private Sub Command1_Click() Set Form1.Picture = Image1(Index).Picture Index = Index If Index > 2 Then Index = 0 End Sub
63
控制元件陣列 -- 實例練習 Step3 執行程式,結果每按命令鈕一下,表單左上角所顯示的燈號就會變換一次。
64
控制元件陣列 -- 實例練習關鍵1 Index 變數宣告的位置: 千萬不要把 Index 變數的宣告放在 Command1_Click 程式區塊之中,因為放在程式區塊中的變數其值每次都會歸 0,結果將使得「Set Form1.Picture = Image1(Index).Picture」敘述永遠都等於「Set Form1.Picture = Image1(0).Picture」,而無法達到變換燈號的目的。
65
控制元件陣列 -- 實例練習關鍵2 變換燈號的程式:首先第一行程式會指定 Image1(Index) 給表單,由於 Index 是一個變數, 所以只要每一次改變此一 Index 的變數值,就 可以達到變換燈號的目的,而我們改變 Index 變數值的方法是:每次加一,當變數值超過 2 時,即將其歸 0,所以撰寫的程式是: 於是 Index 變數值便會呈現 0、1、2、0、1、 2…的變化方式。 Index = Index + 1 If Index > 2 Then Index = 0
66
Timer 控制元件(1) Timer(工具箱的 )是用來驅動程式執行的控制元件,當它佈置在表單時,其大小是固定的,而將來程式執行時,它會被隱藏起來,與一般用來顯示文字或圖形的元件不同。
67
Timer 控制元件(2) 利用計時器來驅動程式的執行需經過兩道程序: 將希望被驅動的程式填寫在 Timer1_Timer程式區塊裡面。
設定計時器的時間間隔(Interval屬性),則將來程式執行時,計時器便會每隔一段時間驅動 Timer1_Timer 程式區塊一次,而達到執行程式的目的。
68
Timer 控制元件 -- 實例(1) 假設我們希望每隔 1 秒鐘在表單上輸出一個點,以下是利用計時器來設計的過程:
首先在表單上佈置一個 Timer,並且將 Interval(時間間隔)屬性設定成 1000。
69
Timer 控制元件 -- 實例(2) 2. 雙按表單上的 Timer,然後在Timer1_Timer程式區塊中撰寫以下程式:
Private Sub Timer1_Timer() Print "."; End Sub
70
Timer 控制元件 -- 實例(3) 在以上例子中, 我們可以把計時器的工作原理表示成下圖:
71
Timer 控制元件 -- 實例解說 利用 Timer 的特性,我們還可以輕易地製作出小時鐘程式。
72
Timer 控制元件 -- 實例解說 Step1 首先在表單上佈置一個標籤(工具箱的 )及一個 Timer ,並調整表單大小,最後表單如下:
73
Timer 控制元件 -- 實例解說 Step2 接下來是物件屬性的設定: 物 件 屬 性 屬 性 值 Timer1
物 件 屬 性 屬 性 值 Timer1 Interval(時間間隔) 1000 Label1 Alignment(對齊方式) 2-置中對齊 Caption(標題) (清成空白) Font(字型) 字型=Times New Roman 字型樣式=粗體, 大小=24
74
Timer 控制元件 -- 實例解說 Step3 在 Timer1_Timer 程式方塊中輸入以下程式
以上程式中的 Time 是 VB 所提供的函數,會傳 回系統當時的時間,而由於 Timer1_Timer 每 1 秒會執行一次,因此 Label1 所顯示的文字也會 隨著時間的改變而改變其內容,而完成了我們期 望的小時鐘程式。 Private Sub Timer1_Timer() Label1.Caption = Time End Sub
75
簡易動畫程式 -- Step1 簡易動畫程式:控制元件陣列與 Timer 的結合
開啟本書提供的 swicth.vbp 專案(這是 p.252 所完成的燈號變換程式),然後在 表單上佈置一 Timer 控制元件,並且將 其 Interval 屬性設定 100。
76
簡易動畫程式 – Step2 雙按 Timer 控制元件,調出 Timer1_Timer 程式區塊,然後將 Command1_Click 程式區塊中的程式複製到 Timer1_Timer 程式區塊中,如下圖:
77
簡易動畫程式 – Step3 接下來執行程式,就可以看到燈號變換的動畫程式了。
Similar presentations