第 8 章 字串與陣列

35
8 8 第第第第第 第第第第第 8-1 8-1 第第第第第第 第第第第第第 8-2 8-2 第第第第 第第第第 8-3 8-3 第第第第第第第 第第第第第第第 8-4 8-4 第第第第第第第第第 第第第第第第第第第 8-5 8-5 第第第第第第第 第第第第第第第

Upload: didina

Post on 06-Jan-2016

46 views

Category:

Documents


0 download

DESCRIPTION

第 8 章 字串與陣列. 8-1 一維陣列的處理 8-2 字串處理 8-3 多維陣列的處理 8-4 動態陣列與參數傳遞 8-5 陣列排序與搜尋. 8-1 一維陣列的處理. 8-1-1 陣列的基礎 8-1-2 宣告一維陣列 8-1-3 For Each 迴圈走訪陣列元素與邊界函數. 8-1-1 陣列的基礎 - 說明. 「陣列」( Arrays )是一種程式語言的基本資料結構,屬於一種循序性的資料結構。日常生活最常見的範例是一排信箱,如下圖所示:. 8-1-1 陣列的基礎 -VB 陣列. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 8 章  字串與陣列

第第 88 章 章 字串與陣列字串與陣列 8-18-1 一維陣列的處理一維陣列的處理 8-2 8-2 字串處理字串處理 8-3 8-3 多維陣列的處理多維陣列的處理 8-4 8-4 動態陣列與參數傳遞動態陣列與參數傳遞 8-5 8-5 陣列排序與搜尋陣列排序與搜尋

Page 2: 第 8 章  字串與陣列

8-1 8-1 一維陣列的處理一維陣列的處理 8-1-1 8-1-1 陣列的基礎陣列的基礎 8-1-2 8-1-2 宣告一維陣列宣告一維陣列 8-1-3 For Each8-1-3 For Each 迴圈走訪陣列元素與邊界迴圈走訪陣列元素與邊界

函數函數

Page 3: 第 8 章  字串與陣列

8-1-1 8-1-1 陣列的基礎陣列的基礎 -- 說明說明 「陣列」(「陣列」( ArraysArrays )是一種程式語言的基)是一種程式語言的基

本資料結構,屬於一種循序性的資料結構。本資料結構,屬於一種循序性的資料結構。日常生活最常見的範例是一排信箱,如下日常生活最常見的範例是一排信箱,如下圖所示:圖所示:

Page 4: 第 8 章  字串與陣列

8-1-1 8-1-1 陣列的基礎陣列的基礎 -VB-VB 陣列陣列 Visual BasicVisual Basic 語言的陣列屬於參考資料型態,它語言的陣列屬於參考資料型態,它

可以將相同資料型態的變數集合起來,使用一個可以將相同資料型態的變數集合起來,使用一個名稱代表,以索引值存取元素,每一個元素相當名稱代表,以索引值存取元素,每一個元素相當於是一個變數,如下圖所示:於是一個變數,如下圖所示:

Page 5: 第 8 章  字串與陣列

8-1-2 8-1-2 宣告一維陣列宣告一維陣列 -- 語法語法 Visual BasicVisual Basic 陣列同樣使用陣列同樣使用【【 DimDim 】】關鍵關鍵

字來宣告,我們可以在宣告同時指定陣列字來宣告,我們可以在宣告同時指定陣列尺寸。一維陣列的宣告語法,如下所示:尺寸。一維陣列的宣告語法,如下所示:Dim Dim 陣列名稱陣列名稱 (( 最大索引最大索引 ) As ) As 資料型態資料型態或或Dim Dim 陣列名稱陣列名稱 (0 To (0 To 最大索引最大索引 ) As ) As 資料型態資料型態

陣列元素個數為括號的最大索引數加一,陣列元素個數為括號的最大索引數加一,也可以使用也可以使用 ToTo 關鍵字指出範圍。關鍵字指出範圍。

Page 6: 第 8 章  字串與陣列

8-1-2 8-1-2 宣告一維陣列宣告一維陣列 -- 範例範例 例如:宣告一維陣列來儲存學生姓名和成例如:宣告一維陣列來儲存學生姓名和成

績,如下所示:績,如下所示:Dim arrScore(4) As IntegerDim arrScore(4) As Integer

Dim arrName(4) As StringDim arrName(4) As String 上述程式碼宣告上述程式碼宣告 22 個一維陣列,一為整數個一維陣列,一為整數

陣列;一是字串陣列,括號值是陣列最大陣列;一是字串陣列,括號值是陣列最大的索引值。索引值是從的索引值。索引值是從 00 開始,以整數陣開始,以整數陣列來說是列來說是 0~40~4 共有共有 55 個元素。個元素。

Page 7: 第 8 章  字串與陣列

8-1-2 8-1-2 宣告一維陣列宣告一維陣列 -- 陣列值陣列值 我們也可以在宣告陣列時,不指定陣列最大索引我們也可以在宣告陣列時,不指定陣列最大索引

值,而直接指定陣列元素的初值,如下所示:值,而直接指定陣列元素的初值,如下所示:Dim arrScore() As Integer = {60, 89, 75, 68, 90}Dim arrScore() As Integer = {60, 89, 75, 68, 90} 另一種方法是使用指定敘述來指定陣列值,如下另一種方法是使用指定敘述來指定陣列值,如下

所示:所示:arrScore(0) = 60arrScore(0) = 60

arrScore(1) = 89arrScore(1) = 89

arrScore(2) = 75arrScore(2) = 75

arrScore(3) = 68arrScore(3) = 68

arrScore(4) = 90arrScore(4) = 90

Page 8: 第 8 章  字串與陣列

8-1-2 8-1-2 宣告一維陣列宣告一維陣列 -- 取出陣列取出陣列值值

同樣方式,我們可以使用索引值來取出陣同樣方式,我們可以使用索引值來取出陣列元素值,如下所示:列元素值,如下所示:Dim score As IntegerDim score As Integer

score = arrScore(3)score = arrScore(3) 上述程式碼取得陣列索引上述程式碼取得陣列索引 33 的值,因為索的值,因為索

引值從引值從 00 開始,也就是陣列的第開始,也就是陣列的第 44 個元素個元素值值 6868 。。

Page 9: 第 8 章  字串與陣列

8-1-3 For Each8-1-3 For Each 迴圈走訪陣列元素迴圈走訪陣列元素與邊界函數與邊界函數 -- 走訪陣列走訪陣列 (( 語法語法 ))

For EachFor Each 迴圈可以輕鬆走訪整個一維陣列,迴圈可以輕鬆走訪整個一維陣列,其語法如下所示:其語法如下所示:For Each For Each 變數 變數 In In 陣列陣列 程式區塊程式區塊NextNext

上述「變數」可以取得陣列的一個元素,上述「變數」可以取得陣列的一個元素,變數需要和陣列屬於相同資料型態,迴圈變數需要和陣列屬於相同資料型態,迴圈自動從索引自動從索引 00 開始,每執行一次迴圈取得開始,每執行一次迴圈取得一個元素值並且自動移至下一個元素,直一個元素值並且自動移至下一個元素,直到沒有元素為止。到沒有元素為止。

Page 10: 第 8 章  字串與陣列

8-1-3 For Each8-1-3 For Each 迴圈走訪陣列元素迴圈走訪陣列元素與邊界函數與邊界函數 -- 走訪陣列走訪陣列 (( 範例範例 ))

例如:計算上一節例如:計算上一節 arrScorearrScore 陣列元素的總陣列元素的總和,如下所示:和,如下所示:For Each element In arrScoreFor Each element In arrScore

total += elementtotal += element

NextNext 上述程式碼的變數上述程式碼的變數 elementelement 是陣列元素,是陣列元素,

每執行一次,就將陣列元素值加到每執行一次,就將陣列元素值加到 totaltotal ,,最後變數最後變數 totaltotal 是陣列元素的總和。是陣列元素的總和。

Page 11: 第 8 章  字串與陣列

8-1-3 For Each8-1-3 For Each 迴圈走訪陣列元素迴圈走訪陣列元素與邊界函數與邊界函數 -- 陣列邊界函數陣列邊界函數

如果使用如果使用 For/NextFor/Next 迴圈(迴圈( Do/LoopDo/Loop 迴圈迴圈也可以)來存取陣列元素,我們可以搭配也可以)來存取陣列元素,我們可以搭配Visual BasicVisual Basic 函數來取得陣列邊界,傳入函數來取得陣列邊界,傳入參數是陣列變數,如下表所示:參數是陣列變數,如下表所示:函數 說明

LBound(Array) 傳回整數值的陣列最小索引值,因為 Visual Basic預設索引是從 0開始,所以其預設的傳回值是 0

UBound(Array) 傳回整數值的陣列最大索引值

Page 12: 第 8 章  字串與陣列

8-2 8-2 字串處理字串處理 8-2-1 8-2-1 字串的基礎字串的基礎 8-2-2 8-2-2 字串長度與大小寫轉換字串長度與大小寫轉換 8-2-3 8-2-3 取出子字串與字串反轉取出子字串與字串反轉 8-2-4 8-2-4 子字串的搜尋與取代子字串的搜尋與取代

Page 13: 第 8 章  字串與陣列

8-2-1 8-2-1 字串的基礎字串的基礎 -- 說明說明 Visual BasicVisual Basic 字串是字串是 StringString 資料型態的變資料型態的變

數或字串值,字串是數或字串值,字串是 00 或多個依序的或多個依序的 CharChar資料型態的字元,以雙引號括起的文字內資料型態的字元,以雙引號括起的文字內容,如下所示:容,如下所示:

Dim str As String = _Dim str As String = _

"Visual Basic 2005"Visual Basic 2005 程式設計範例教本程式設計範例教本 ""

Dim str1 As StringDim str1 As String

str1 = "ASP.NET 2.0str1 = "ASP.NET 2.0 網頁製作徹底研究網頁製作徹底研究 ""

Page 14: 第 8 章  字串與陣列

8-2-1 8-2-1 字串的基礎字串的基礎 -- 新字串值新字串值 不過不過 Visual BasicVisual Basic 字串內容並不能更改,字串內容並不能更改,

也就是說,一旦建立字串後,就無法改變也就是說,一旦建立字串後,就無法改變其值,只能重新指定成新的字串值或另一其值,只能重新指定成新的字串值或另一個字串變數,如下圖所示:個字串變數,如下圖所示:

Page 15: 第 8 章  字串與陣列

8-2-2 8-2-2 字串長度與大小寫轉換字串長度與大小寫轉換 Visual BasicVisual Basic 函數可以取得字串長度、進函數可以取得字串長度、進

行英文字母大小寫轉換和刪除頭尾的空白行英文字母大小寫轉換和刪除頭尾的空白字元,如下表所示:字元,如下表所示:函數 說明

Len(Stmt) 傳回整數的字串長度,擁有多少個字元或中文字UCase(Stmt) 將參數字串或字元的英文字母轉換成大寫LCase(Stmt) 將參數字串或字元的英文字母轉換成小寫LTrim(Stmt) 刪除字串開頭的空白字元RTrim(Stmt) 刪除字串結尾的空白字元Trim(Stmt) 刪除頭尾兩端的空白字元Space(num) 傳回參數 num個空白字元的字串Asc(Stmt) 傳回參數 Stmt字串第 1個字元的 ASCII碼,例如:Asc("A")

為 65

Page 16: 第 8 章  字串與陣列

8-2-3 8-2-3 取出子字串與字串反轉取出子字串與字串反轉 Visual BasicVisual Basic 提供提供 Mid()Mid()、、 Left()Left()和和 Right()Right() 等等

函數,可以從字串中取出所需的子字串,或是反函數,可以從字串中取出所需的子字串,或是反轉字串,如下所示:轉字串,如下所示:

函數 說明Mid(Stmt, start[ , length]) 從參數 Stmt字串的 start位置(從 1開始)取出長度

length的子字串,如果沒有 length參數,就是從 start

位置到字串結尾的所有字元Left(Stmt, length) 從參數 Stmt字串從開頭起算共 length長度的字元,

如果為 0傳回空字串,如果大於字串長度,傳回整個字串

Right(Stmt, length) 從參數 Stmt字串從右邊回頭起算共 length長度的字元,如果為 0傳回空字串,如果大於字串長度,傳回

整個字串StrReverse(Stmt) 將參數的 Stmt字串反轉,例如:Visual Basic成為 cisaB

lausiV

Page 17: 第 8 章  字串與陣列

8-2-4 8-2-4 子字串的搜尋與取代子字串的搜尋與取代 -- 搜搜尋尋

在多行文字方塊如果輸入一整篇文章,我在多行文字方塊如果輸入一整篇文章,我們可以使用們可以使用 Visual BasicVisual Basic 函數來搜尋字串,函數來搜尋字串,和自行建立函數來取代子字串。和自行建立函數來取代子字串。 Visual Visual BasicBasic 字串搜尋函數,如下表所示:字串搜尋函數,如下表所示:

函數 說明InStr(start, Stmt1, Stmt2[,

Type])在參數 Stmt1字串的 start位置(從 1開始)開始找尋 Stmt2字串,如果找到,傳回找到的位置,沒有找到傳回 0,Type是 Option Compare的 Text

或 Binary字串比較方式,沒有指定,預設使用專案的 Option Compare設定

Page 18: 第 8 章  字串與陣列

8-2-4 8-2-4 子字串的搜尋與取代子字串的搜尋與取代 -- 取取代代

Visual BasicVisual Basic 並沒有字串取代函數,我們可以自並沒有字串取代函數,我們可以自行使用行使用 Mid()Mid()、、 Left()Left()和和 Right()Right() 函數來建立字函數來建立字串取代功能,如下所示:串取代功能,如下所示:

out = txtInput.Textout = txtInput.Text

strLeft = Mid(out, 1, pos)strLeft = Mid(out, 1, pos)

strRight = Mid(out, pos + length + 1)strRight = Mid(out, pos + length + 1)

txtInput.Text = strLeft & txtReplace.Text & strRighttxtInput.Text = strLeft & txtReplace.Text & strRight 上述程式碼從字串上述程式碼從字串 outout 使用使用 Mid()Mid() 函數取出位在函數取出位在

子字串左邊的子字串左邊的 strLeftstrLeft 字串和右邊的字串和右邊的 strRightstrRight 字字串,然後在中間加上取代字串,就完成字串取代串,然後在中間加上取代字串,就完成字串取代功能。功能。

Page 19: 第 8 章  字串與陣列

8-3 8-3 多維陣列的處理多維陣列的處理 -- 說明說明 「二維陣列」(「二維陣列」( Two-dimensional ArrayTwo-dimensional Array )或)或

多維陣列都是一維陣列的擴充。如果將一維陣列多維陣列都是一維陣列的擴充。如果將一維陣列想像成一度空間的線,二維陣列就是二度空間的想像成一度空間的線,二維陣列就是二度空間的平面,三維陣列即空間。平面,三維陣列即空間。

在日常生活中的二維陣列應用非常廣泛,只要是在日常生活中的二維陣列應用非常廣泛,只要是平面的表格,都可以轉換成二維陣列來表示。例平面的表格,都可以轉換成二維陣列來表示。例如:月曆、功課表和成績單等。例如:在如:月曆、功課表和成績單等。例如:在 Visual Visual BasicBasic 宣告學生成績的二維陣列,如下所示:宣告學生成績的二維陣列,如下所示:

Dim Scores(,) As Integer = _Dim Scores(,) As Integer = _

{ { 54, 68, 93 }, { 67, 78 , 89} }{ { 54, 68, 93 }, { 67, 78 , 89} }

Page 20: 第 8 章  字串與陣列

8-3 8-3 多維陣列的處理多維陣列的處理 -- 圖例圖例 二維陣列擁有二維陣列擁有 22 個索引,左索引(個索引,左索引( Left Left

IndexIndex )指出元素位在哪一列,右索引)指出元素位在哪一列,右索引(( Right IndexRight Index )指出位在哪一欄,使用)指出位在哪一欄,使用22 個索引值就可以存取指定的二維陣列元素。個索引值就可以存取指定的二維陣列元素。

Page 21: 第 8 章  字串與陣列

8-3 8-3 多維陣列的處理多維陣列的處理 -- 指定元素指定元素值值

二維陣列如果沒有指定陣列初值,我們需二維陣列如果沒有指定陣列初值,我們需要在宣告時指定陣列尺寸,如下所示:要在宣告時指定陣列尺寸,如下所示:Dim Scores(1, 2) As IntegerDim Scores(1, 2) As IntegerScores(0,0)=54Scores(0,0)=54Scores(0,1)=68Scores(0,1)=68Scores(0,2)=93Scores(0,2)=93Scores(1,0)=67Scores(1,0)=67Scores(1,1)=78Scores(1,1)=78Scores(1,2)=89Scores(1,2)=89

上述程式碼設定二維陣列的元素值。上述程式碼設定二維陣列的元素值。

Page 22: 第 8 章  字串與陣列

8-3 8-3 多維陣列的處理多維陣列的處理 -- 走訪元素走訪元素 在設定陣列值後,存取二維陣列需要使用在設定陣列值後,存取二維陣列需要使用

二層巢狀迴圈,如下所示:二層巢狀迴圈,如下所示:For i = 0 To 1For i = 0 To 1

For j = 0 To 2For j = 0 To 2

Sums(i) += Scores(i, j)Sums(i) += Scores(i, j)

Next jNext j

Next iNext i

Page 23: 第 8 章  字串與陣列

8-4 8-4 動態陣列與參數傳遞動態陣列與參數傳遞 8-4-1 8-4-1 動態陣列動態陣列 8-4-2 8-4-2 傳遞字串與陣列參數傳遞字串與陣列參數

Page 24: 第 8 章  字串與陣列

8-4-1 8-4-1 動態陣列動態陣列 -- 宣告宣告 Visual BasicVisual Basic 陣列可以使用陣列可以使用【【 ReDimReDim 】】

關鍵字在程式執行時,重新調整其尺寸。關鍵字在程式執行時,重新調整其尺寸。不過不過 ReDimReDim 不能宣告陣列,只能更改已經不能宣告陣列,只能更改已經宣告的陣列尺寸,如下所示:宣告的陣列尺寸,如下所示:Dim arrScore(4) As IntegerDim arrScore(4) As Integer ……… ………ReDim arrScore(6)ReDim arrScore(6)

上述程式碼將原來上述程式碼將原來 arrScorearrScore 陣列大小從陣列大小從 55改為改為 77 個元素。因為個元素。因為 Visual BasicVisual Basic 陣列在陣列在變更陣列尺寸後可能遺失陣列資料。變更陣列尺寸後可能遺失陣列資料。

Page 25: 第 8 章  字串與陣列

8-4-1 8-4-1 動態陣列動態陣列 --保留陣列內容保留陣列內容 如果陣列已經擁有內容,請使用如果陣列已經擁有內容,請使用 PreservePreserve

關鍵字來保留原陣列的內容,如下所示:關鍵字來保留原陣列的內容,如下所示:ReDim Preserve arrScore(6)ReDim Preserve arrScore(6)

上述程式碼可以放大陣列尺寸,當然放大上述程式碼可以放大陣列尺寸,當然放大陣列尺寸並不會有問題,如果縮小陣列的陣列尺寸並不會有問題,如果縮小陣列的話,陣列裁剪部分的資料還是會遺失。話,陣列裁剪部分的資料還是會遺失。

Page 26: 第 8 章  字串與陣列

8-4-1 8-4-1 動態陣列動態陣列 -- 二維動態陣列二維動態陣列 對於是二維以上的多維陣列,我們可以變對於是二維以上的多維陣列,我們可以變

更指定維度的尺寸,如果使用更指定維度的尺寸,如果使用 PreservePreserve 關關鍵字,就只能變更最後鍵字,就只能變更最後 11 個維度的尺寸,個維度的尺寸,如下所示:如下所示:Dim arrTable(10, 20)Dim arrTable(10, 20)

……… ………..

ReDim Preserve arrTable(10, 30)ReDim Preserve arrTable(10, 30)

Page 27: 第 8 章  字串與陣列

8-4-2 8-4-2 傳遞字串與陣列參數傳遞字串與陣列參數 -- 說說明明

程序與函數的參數如果是字串或陣列,因程序與函數的參數如果是字串或陣列,因為字串與陣列都是參考資料型態,此時為字串與陣列都是參考資料型態,此時ByValByVal和和 ByRefByRef 參數傳遞的差異,如下表參數傳遞的差異,如下表所示:所示:

資料型態 ByVal方式 ByRef方式數值型態 無法變更變數和成員 可以變更變數和成員參考型態 程序無法變更變數,但可以變更成員 可以變更變數和成員

Page 28: 第 8 章  字串與陣列

8-4-2 8-4-2 傳遞字串與陣列參數傳遞字串與陣列參數 -- 範範例例

例如:在程序與函數中,使用指定敘述將例如:在程序與函數中,使用指定敘述將參數指定成其他陣列,如下所示:參數指定成其他陣列,如下所示:Sub Replace(ByVal A() As Integer)Sub Replace(ByVal A() As Integer) Dim B() As Integer = {10, 20, 30}Dim B() As Integer = {10, 20, 30} A = BA = B ………… …………..End SubEnd Sub

上述程序將參數的陣列上述程序將參數的陣列 AA 指定成新陣列指定成新陣列 BB ,,事實上,並不會影響原參數陣列事實上,並不會影響原參數陣列 AA ,因為,因為傳值方式不能指定成新陣列。傳值方式不能指定成新陣列。

Page 29: 第 8 章  字串與陣列

8-5 8-5 陣列排序與搜尋陣列排序與搜尋 8-5-1 8-5-1 陣列的排序陣列的排序 8-5-2 8-5-2 陣列的搜尋陣列的搜尋

Page 30: 第 8 章  字串與陣列

8-5-1 8-5-1 陣列的排序陣列的排序 -- 基礎基礎 排序工作是將一些資料依照特定原則排列成遞增排序工作是將一些資料依照特定原則排列成遞增

或遞減的順序。例如:整數陣列或遞減的順序。例如:整數陣列 DataData 的內容,的內容,如下所示:如下所示:

Data(0)=89 Date(1)=34 Date(2)=78 Date(3)=45Data(0)=89 Date(1)=34 Date(2)=78 Date(3)=45 上述陣列以整數值的大小,將陣列內容依遞增的上述陣列以整數值的大小,將陣列內容依遞增的順序來排序。其排序結果如下所示:順序來排序。其排序結果如下所示:

Data(0)=34 Date(1)=45 Date(2)=78 Date(3)=89Data(0)=34 Date(1)=45 Date(2)=78 Date(3)=89 上述陣列上述陣列 DataData已經完成排序,其大小順序如下已經完成排序,其大小順序如下

所示:所示:Data(0) < Data(1) < Data(2) < Data(3)Data(0) < Data(1) < Data(2) < Data(3)

Page 31: 第 8 章  字串與陣列

8-5-1 8-5-1 陣列的排序陣列的排序 --泡沫排序法泡沫排序法 (( 說說明明 ))

泡沫排序法(泡沫排序法( Bubble SortBubble Sort )是使用交換)是使用交換方式來進行排序,可以將較小元素逐漸移方式來進行排序,可以將較小元素逐漸移動至陣列開始,較大元素慢慢浮向陣列的動至陣列開始,較大元素慢慢浮向陣列的最後,如同水缸中的泡沫,慢慢往上浮,最後,如同水缸中的泡沫,慢慢往上浮,故稱為泡沫排序法。故稱為泡沫排序法。

Page 32: 第 8 章  字串與陣列

8-5-1 8-5-1 陣列的排序陣列的排序 --泡沫排序法泡沫排序法 (( 過過程程 ))

泡沫排序法的過程是使用交換方法,在陣列中找泡沫排序法的過程是使用交換方法,在陣列中找尋最大值,例如:原始陣列內容,如下所示:尋最大值,例如:原始陣列內容,如下所示:

Data(0)=89 Date(1)=34 Date(2)=78 Date(3)=45Data(0)=89 Date(1)=34 Date(2)=78 Date(3)=45 陣列依序比較陣列元素陣列依序比較陣列元素 00 和和 11 ,元素,元素 11 和和 22 ,元,元素素 22 和和 33 來交換陣列元素,如下所示:來交換陣列元素,如下所示:

Data(0)=89 > Date(1)=34 => Data(0)=34 Date(1)=89 Data(0)=89 > Date(1)=34 => Data(0)=34 Date(1)=89 交換交換Data(1)=89 > Date(2)=78 => Data(1)=78 Date(2)=89 Data(1)=89 > Date(2)=78 => Data(1)=78 Date(2)=89 交換交換Data(2)=89 > Date(3)=45 => Data(2)=45 Date(3)=89 Data(2)=89 > Date(3)=45 => Data(2)=45 Date(3)=89 交換交換 陣列最大值陣列最大值 8989 一步步往陣列尾端移動。接著重一步步往陣列尾端移動。接著重複上述步驟,每次縮小複上述步驟,每次縮小 11 個元素後,再重新比較個元素後,再重新比較陣列元素,就可以完成陣列元素的排序。陣列元素,就可以完成陣列元素的排序。

Page 33: 第 8 章  字串與陣列

8-5-2 8-5-2 陣列的搜尋陣列的搜尋 -- 基礎基礎 搜尋是在資料中找出是否存在與鍵值相同的資料,搜尋是在資料中找出是否存在與鍵值相同的資料,

如果資料存在,就進行後續的資料處理。例如:如果資料存在,就進行後續的資料處理。例如:查尋電話簿是為了找朋友的電話號碼,然後與他查尋電話簿是為了找朋友的電話號碼,然後與他連絡。在書局找書也是為了找到後買回家閱讀。連絡。在書局找書也是為了找到後買回家閱讀。

搜尋方法依照搜尋的資料分為兩種,如下所示:搜尋方法依照搜尋的資料分為兩種,如下所示:• 沒有排序的資料:針對沒有排序的資料執行搜尋,我沒有排序的資料:針對沒有排序的資料執行搜尋,我

們需要從資料的第們需要從資料的第 11 個元素開始比較,從頭到尾以確個元素開始比較,從頭到尾以確認資料是否存在。認資料是否存在。

• 已經排序的資料:因為資料已經排序,所以搜尋就不已經排序的資料:因為資料已經排序,所以搜尋就不需從頭開始一一比較。例如:在電話簿找電話,相信需從頭開始一一比較。例如:在電話簿找電話,相信沒有人是從電話簿的第沒有人是從電話簿的第 11 頁開始找,而是直接從姓名頁開始找,而是直接從姓名出現的頁數開始找,因為電話簿已經依照姓名進行排出現的頁數開始找,因為電話簿已經依照姓名進行排序。序。

Page 34: 第 8 章  字串與陣列

8-5-2 8-5-2 陣列的搜尋陣列的搜尋 -- 線性搜尋法線性搜尋法 線性搜尋法(線性搜尋法( Sequential SearchSequential Search )是從)是從

陣列的第陣列的第 11 個元素開始走訪整個陣列,然個元素開始走訪整個陣列,然後一個一個比較是否擁有搜尋的鍵值,因後一個一個比較是否擁有搜尋的鍵值,因為需要走訪整個陣列,所以陣列資料是否為需要走訪整個陣列,所以陣列資料是否排序都無所謂。排序都無所謂。

換句話說,在換句話說,在 Visual BasicVisual Basic 程式可以使用程式可以使用迴圈來走訪陣列,以便比較陣列是否有指迴圈來走訪陣列,以便比較陣列是否有指定的鍵值。定的鍵值。

Page 35: 第 8 章  字串與陣列

8-5-2 8-5-2 陣列的搜尋陣列的搜尋 -- 二元搜尋法二元搜尋法 二元搜尋法(二元搜尋法( Binary SearchBinary Search )是一種分割資料的搜尋)是一種分割資料的搜尋

方法,搜尋資料是已經排序的資料。二元搜尋法先檢查排方法,搜尋資料是已經排序的資料。二元搜尋法先檢查排序資料的中間元素,如果等於鍵值就是找到;如果小於鍵序資料的中間元素,如果等於鍵值就是找到;如果小於鍵值,表示資料在前半段;否則在後半段。然後繼續分割半值,表示資料在前半段;否則在後半段。然後繼續分割半段資料來重覆上述操作,直到找到或已經沒有資料可以分段資料來重覆上述操作,直到找到或已經沒有資料可以分割為止。割為止。

例如:例如: DataData 陣列索引的上下範圍分別是陣列索引的上下範圍分別是 lowlow和和 highhigh ,,中間元素中間元素 midmid是是 (low + high)\2(low + high)\2 。在執行二元搜尋時分。在執行二元搜尋時分成三種情況,如下所示:成三種情況,如下所示:• 搜尋鍵值小於陣列的中間元素:鍵值在資料陣列的前搜尋鍵值小於陣列的中間元素:鍵值在資料陣列的前半部。半部。

• 搜尋鍵值大於陣列的中間元素:鍵值在資料陣列的後搜尋鍵值大於陣列的中間元素:鍵值在資料陣列的後半部。半部。

• 搜尋鍵值等於陣列的中間元素:找到搜尋的鍵值。搜尋鍵值等於陣列的中間元素:找到搜尋的鍵值。