第7章 陣列 7-1 認識陣列 7-2 陣列的應用
一、陣列簡介-1 陣列:由一群資料型別相同的陣列元素所組成 每一個陣列元素可存入一個資料項目,這些資料項目通常會儲存在電腦相鄰的記憶體中 存取陣列元素時,必須使用陣列的註標 1 2 3 4 … 第3個元素(陣列註標為2)中存放的資料為30,可用A(2) = 30表示 名稱 陣列元素 陣列註標 陣列A
一、陣列簡介-2 使用陣列的好處 方便管理程式中需使用多個相同資料型別的資料項目 Dim score(49) As Integer : Dim score50 As Integer 使用變數
二、一維陣列-1 最基本的陣列形式,其註標只有1個 適用時機:當在程式中,需要使用多個相同類型之資料項目時 例:宣告一個陣列A來存放12個月份的天數 A(1) = 28 陣列名稱:A 31 28 30 陣列註標 1 2 3 4 5 6 7 8 9 10 11
二、一維陣列-2 宣告陣列: 宣告陣列並設定初始值: 例:Dim A(3) As Integer Dim A%(3) Dim A() As Integer = {24, 5, 13, 47} Dim 陣列名稱 (註標上限) [As 資料型別] Dim 陣列名稱型別字元(註標上限) Dim 陣列名稱[() As 資料型別]= [New資料型別(註標上限)] {陣列元素初始值}
二、一維陣列-3 例:儲存自己喜愛歌手的排名 Dim A() As String = {"周杰倫", "陳漢典", "阮經天", "柯震東"} MsgBox("我的偶像:" & A(3))
作業 猜猜我最喜歡的偶像 P.269 猜猜原唱者是誰 成績計算(輸入五科成績,並計算總分)
三、多維陣列-1 當陣列的註標個數超過 1 個時,即稱之為多維陣列 只有 1 個註標的陣列,稱為一維陣列; 2 個註標的陣列,稱為二維陣列,依此類推
三、多維陣列-2 適用時機:當程式中的資料需要使用2個以上的註標值來識別時 例:儲存全班同學的國、英、數三科成績 陣列名稱:score 第1維註標值代表座號 score(0, 2) = 75 表示座號為1之同學的數學成績 第2維註標值 代表科目別(國、英、數) 1 2 80 82 75 90 85 88 70 65 3 71 78 76 …
三、多維陣列-3 宣告陣列: 宣告陣列並設定初始值: Dim 陣列名稱 (n1, n2, …) [As 資料型別] Dim 陣列名稱[( , …) As 資料型別] = [New 資料型別(n1, n2 …)] {{陣列元素初始值}, {陣列元素初始值},…}
三、多維陣列-4 例: Dim A(,) As Integer = {{10, 20, 30}, {40, 50, 60}} 設定第0列A(0, 0)、A(0, 1)、A(0, 2) 等3個陣列元素的初始值 設定第1列A(1, 0)、A(1, 1)、A(1, 2)等3個陣列元素的初始值 陣列A 10 20 30 1 40 50 60 2
三、多維陣列-5 二維陣列示意圖 第 一 維 ︵ 列 ︶ 第二維(欄) 二維陣列A(6, 3) A(1, 3) A(3, 1) 1 20 2 3 25 4 5 15 6
三、多維陣列-6 三維陣列示意圖 26 83 17 1 2 3 第三維 第 二 維 第一維 B(1, 0, 1) B(0, 1, 2) 2 3 第三維 第 二 維 第一維 B(1, 0, 1) B(0, 1, 2) B(0, 3, 0) 三維陣列B(1, 3, 2) 陣列B
三、多維陣列-7 例:計算B(2, 1)與B(3, 2)相乘的結果 Dim B(3, 2), K, I, J As Integer For I = 0 To 3 For J = 0 To 2 B(I, J) = K * (I - 1) + J Next J Next I 陣列B -3 -2 -1 1 2 3 4 5 6 7 8
三、多維陣列-8 資料結構:可將資料建立成為一個便於取用與處理的結構 陣列、堆疊與佇列是3種基本的資料結構 堆疊:具有後進先出(LIFO)特性 應用:網頁瀏覽器中用來切換上、下一頁的功能 佇列:具有先進先出(FIFO)特性 應用:印表機列印文件的順序
三、多維陣列-9 UBound()方法:傳回陣列註標的上限値 語法: 例:傳回陣列B的上限值(即7) Dim A(7) As Integer Debug.Print(UBound(A)) UBound(陣列名稱[, 欲查詢的維數])
三、多維陣列-10 Length()方法:傳回陣列的元素個數 語法: 例:傳回陣列A的元素個數(即4) Dim A(3) As Integer Debug.Print(A.Length) 陣列名稱.Length
三、多維陣列-11 ReDim()方法:重新調整陣列大小 語法: 例:將陣列B調整為3 × 4的二維陣列,並保留原陣列內容 Dim B = New Integer(2, 1) {{10, 20}, {30, 40}, {50, 60}} ReDim Preserve B(2, 3) ReDim [Preserve] 陣列名稱(陣列上限)
四、資料排序-1 排序:利用「比較」與「交換」的方法,將資料排列成某種特定的順序 例:KTV每週依點播數的多寡,製作點播排行榜 點播排行榜 詩人漫步 愛久見人心 狂風裡擁抱 想幸福的人 24 個比利
四、資料排序-2 氣泡排序法 原理:逐次比較相鄰的兩個資料,並依照由大到小或由小到大的排序條件,交換資料的位置,直到所有的資料排序完成 資料位置的變動情形,就像氣泡上升的現象,因此被命名為氣泡排序法
四、資料排序-3 氣泡排序法實例 排序前: 接下頁… 25 12 47 18 9 25 12 47 18 9 1 第一次循環:兩兩比較第1 ~ 5個相鄰的資料,並依照比較結果調整數字的位置,使最大的數字(47)排在第5個位置 12 25 47 18 9 12 25 47 18 9 說明: 為比較後交換位置; 為比較後不交換位置 25 12 18 47 9
四、資料排序-4 2 第二次循環:兩兩比較第1 ~ 4個相鄰的資料,並依照比較結果調整數字的位置,使第2大的數字(25)排在第4個位置 2 第二次循環:兩兩比較第1 ~ 4個相鄰的資料,並依照比較結果調整數字的位置,使第2大的數字(25)排在第4個位置 12 25 18 9 47 接下頁… 12 25 18 9 47 12 18 25 9 47 3 第三次循環:兩兩比較第1 ~ 3個相鄰的資料,並依照比較結果調整數字的位置,使第3大的數字(18)排在第3個位置 12 18 9 25 47 12 18 9 25 47
四、資料排序-5 4 第四次循環:兩兩比較第1 ~ 2個相鄰的資料,並依照比較結果調整數字的位置,使第4大的數字(12)排在第2個位置 12 4 第四次循環:兩兩比較第1 ~ 2個相鄰的資料,並依照比較結果調整數字的位置,使第4大的數字(12)排在第2個位置 12 9 18 25 47 排序後: 9 12 18 25 47
四、資料排序-6 氣泡排序法之流程圖 A(j) > A(j + 1) j <= (4 - i) i = i + 1 結束 開始 宣告變數、陣列, 並設定初始值 i = 1 i <= (5 - 1) j = 0 A 是(T) 否(F)
四、資料排序-7 選擇排序法 原理:從第1個數值開始找尋,直到最後一個數值,以選出最小值,再將最小值與第1個數值交換;接著從第2個數值之後的資料列中找出最小值,與第2個數值交換,…依此類推,不斷重複上述步驟,直到所有的資料排序完成
四、資料排序-8 選擇排序法實例 1 第一次循環:在5個數字中比較資料的大小,挑選出最小的數字(12),並與第1個位置的數字(53)交換位置 排序前: 接下頁… S 說明: 為比較;S為最小值 53 46 12 38 76 1 第一次循環:在5個數字中比較資料的大小,挑選出最小的數字(12),並與第1個位置的數字(53)交換位置 53 46 12 38 76 2 第二次循環:在其餘4個數字中比較資料的大小,挑選出最小的數字(38),並與第2個位置的數字(46)交換位置 12 46 53 38
四、資料排序-9 3 第三次循環:在其餘3個數字中比較資料的大小,挑選出最小的數字(46),並與第3個位置的數字(53)交換位置 3 第三次循環:在其餘3個數字中比較資料的大小,挑選出最小的數字(46),並與第3個位置的數字(53)交換位置 12 38 53 46 76 排序後: S 4 第四次循環:在其餘2個數字中比較資料的大小,挑選出最小的數字(53),正好位於第4個位置,不需交換位置,排序完成 12 38 46 53 76 12 38 46 53 76
四、資料排序-10 選擇排序法之流程圖 j <= (5 - 1) 開始 宣告變數、陣列, A(S) > A(j) 並設定初始值 i = 0 i <= (4 - 1) S = i A 是(T) 否(F) j = (S + 1) j <= (5 - 1) A(S) > A(j) A(i)與A(S)交換 j = j + 1 S = j 結束 i = i + 1
四、資料排序-11 Array.Sort()方法:將一維陣列中的資料遞增排序 語法: 例:將陣列中的資料由小到大(遞增)排序 Dim A = {56, 84, 12, 68, 99, 6} Array.Sort(A) Array.Sort(陣列名稱)
四、資料排序-12 Array.Reverse()方法:反轉一維陣列中的資料 語法: 例:反轉陣列中的資料 Dim A = {6, 12, 56, 68, 84, 99} Array.Reverse(A) Array.Reverse(陣列名稱)
五、資料搜尋-1 搜尋:依照特定的條件及方法,在一群資料中尋找符合條件的資料 例:護士依病患姓氏 (或身分證字號),找出複診者的病歷資料
五、資料搜尋-2 循序搜尋法(又稱為線性搜尋法) 原理:搜尋時由第一筆資料開始,逐一檢查資料列中的所有資料項,直到找到要搜尋的資料為止 當資料筆數不大或資料列未經排序時,適合使用循序搜尋法來搜尋資料
五、資料搜尋-3 循序搜尋法實例 1 由第一個位置開始搜尋,未 找到數字15,繼續往下搜尋 1 由第一個位置開始搜尋,未 找到數字15,繼續往下搜尋 2 由第二個位置開始搜尋,未 找到數字15,繼續往下搜尋 3 找到數字15,搜尋結束 28 3 15 55 48 9 14 1 38 20 28 3 15 55 48 9 14 1 38 20 28 3 15 55 48 9 14 1 38 20
五、資料搜尋-4 循序搜尋法之流程圖 開始 否(F) i <= 9 宣告變數、陣列, 並設定初始值 是(T) 顯示 Target = 15 i = 0 i = i + 1 顯示 "找不到" i <= 9 A(i) = Target? 結束 顯示目前資料 所在的位置 否(F) 是(T)
五、資料搜尋-5 二元搜尋法(又稱為二分搜尋法) 規則:先找出資料列的中央位置,判定所要搜尋的資料是位於資料列的前半段或後半段,然後捨去另一半的資料,將搜尋範圍逐漸縮小;如此重複上述步驟,直到找到或確定資料不存在為止 資料列必須事先排序 中間值(M):M = (L + R) / 2(取整數)
五、資料搜尋-6 二元搜尋法實例 陣列A 2 16 34 47 53 67 81 1 3 4 5 6 3 找出中間值M(= (6 + 6) / 2 = 12 / 2 = 6),因搜尋目標(81)= M代表的數值(81),找到目標,搜尋結束 2 找出中間值M(= (4 + 6) / 2 = 10 / 2 = 5),因搜尋目標(81)> M代表的數值(67),捨棄前半段 1 找出中間值M(= (0 + 6) / 2 = 6 / 2 = 3),因搜尋目標(81)> M代表的數值(47),捨棄前半段 L M R 陣列A 2 16 34 47 53 67 81 1 3 4 5 6 陣列A 2 16 34 47 53 67 81 1 3 4 5 6
五、資料搜尋-7 二元搜尋法之流程圖 L = 0 R = UBound(A) Target = 81 開始 宣告變數、陣列, 並設定初始值 M = (L + R) \ 2 L <= R 結束 Target? R = M - 1 L = M + 1 顯示找到 的位置 顯示 "找不到" 否(F) 是(T) = A(M) > A(M) < A(M)
Array.IndexOf(陣列名稱, 目標資料[, 搜尋起點註標值]) 五、資料搜尋-8 Array.IndexOf()方法:可在一維陣列(不需事先排序)中搜尋特定的資料 語法: 例:找出陣列A中目標資料12的註標值 Dim A = {56, 84, 12, 68, 99, 6} Array.IndexOf(A, 12, 0) '執行結果為2,表示12在A(2) Array.IndexOf(陣列名稱, 目標資料[, 搜尋起點註標值])