46
7 陣列 去游泳時通常都會將換下的衣物放到池畔邊的儲物櫃中每個 儲物櫃都有一個用來識別的編號我們必須記住自己的儲物櫃編號才能在更衣時正確地取回自己的衣物在程式語言中也提供了一種類似儲物櫃的資料結構可用來組 織及管理相同類型的資料這種結構稱為陣列陣列不僅可以將程式 所使用到資料項目做組織歸納還可以減少在程式中使用過多的變 使程式較為簡潔在程式設計實務中當需要將龐大筆數的資料排序或從大筆資 料中找尋某些特定資料時通常會先將資料存放在陣列中以利資料 排序與資料搜尋的處理趕快進入本章學會使用陣列這個程式 撰寫的利器吧7-1 認識陣列 7-1.1 一維陣列 7-1.2 多維陣列 7-2 陣列的應用 7-2.1 資料排序 7-2.2 資料搜尋

認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

7 陣列

去游泳時,通常都會將換下的衣物放到池畔邊的儲物櫃中。每個

儲物櫃都有一個用來識別的編號,我們必須記住自己的儲物櫃編號,

才能在更衣時正確地取回自己的衣物。

在程式語言中,也提供了一種類似儲物櫃的資料結構,可用來組

織及管理相同類型的資料,這種結構稱為陣列。陣列不僅可以將程式

所使用到資料項目做組織、歸納,還可以減少在程式中使用過多的變

數,使程式較為簡潔。

在程式設計實務中,當需要將龐大筆數的資料排序,或從大筆資

料中找尋某些特定資料時,通常會先將資料存放在陣列中,以利資料

排序與資料搜尋的處理。趕快進入本章,學會使用「陣列」這個程式

撰寫的利器吧!

7-1 認識陣列

7-1.1 一維陣列

7-1.2 多維陣列

7-2 陣列的應用

7-2.1 資料排序

7-2.2 資料搜尋

Page 2: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

264 程式語言與設計-Visual Basic Ⅰ

7-1 認識陣列

在Visual Basic中,一個變數可以存入一項資料,若要存放10項資料就必須

設定10個變數,當要存放數千甚至數萬項資料時,變數的數量就會十分龐大,而

變得不易於管理及使用。Visual Basic提供的 陣列(array)可用來解決上述問

題。圖7-1為使用陣列宣告與多個變數宣告的比較。

Dim score(49) As Integer

Dim score1 As Integer

Dim score2 As Integer

Dim score3 As Integer

Dim score50 As Integer

宣告一個可存放50(0 ~ 49)筆成

績的陣列,只需一行宣告敘述

宣告50個可存放成績的整數變數,

共需50行宣告敘述

圖7-1 使用陣列宣告與多個變數宣告的比較▲

陣列是由一群資料型別相同的 陣列元素(elements)所組成。每一個陣列元

素可以存入一個資料項目,這些資料項目通常會儲存在電腦相鄰的記憶體中。當

我們要存取陣列中的資料項目時,必須使用陣列的 註標(index)來標示所要存取

的資料項目。註標值預設從0開始(圖7-2)。

陣列的形式有很多種,一般常依據陣列的註標個數,將陣列概分為㆒維陣列

及多維陣列,分別說明如下。

圖7-2 陣列示意圖▲

陣列A

10 25 30 45 50 …

0 1 2 3 4 …

名稱

陣列元素

註標

第3個元素(註標值為2)中存放的資料

為30,可用A(2) = 30表示

Page 3: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

265第 7 章 陣列

7-1.1 一維陣列

㆒維陣列是陣列最基本的形式,其註標只有1個。在使用一維陣列來儲存資

料之前,必須先使用陣列宣告敘述,宣告陣列的元素個數與資料型別,其語法如

下。

一、 宣告陣列:

宣告陣列A可存放4個整數資料

Dim 陣列名稱(註標上限) [As 資料型別]

Dim A(3) As Integer 陣列A

0 0 0 0

0 1 2 3

Dim 陣列名稱型別字元(註標上限)

Dim A%(3) 陣列A

0 0 0 0

0 1 2 3

語法 & 舉例

說明

① 陣列名稱的命名規則與變數命名規則相同。

② 陣列的註標值預設從0開始,因此陣列元素個數 = 註標上限 + 1,例如A(3),有A(0)、A(1)、A(2)、A(3)共4個陣列元素。

③ 未宣告資料型別,則資料型別預設為Object(物件)。

④ 宣告陣列時,若未指定初始值,Visual Basic會依宣告的資料型別,自動預設

陣列各元素的初始值。例如:

㈾料型別 初始值

數值類(如Integer、Single)字串(String)、物件(Object)布林(Boolean)

0空值(null)

False

Page 4: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

266 程式語言與設計-Visual Basic Ⅰ

⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

註: 不同資料型別的陣列元素所佔用的儲存空間不盡相同,請參照第2-1.2節表2-3說明。

在VB 6以後的版本,已不提供設定陣列上、下限值的語法「Dim 陣列名稱(M To N)」,但仍可設定陣列的上限值「Dim 陣列名稱(0 To N)」,因為陣列的

下限值固定為0,不可更動。

Tip

二、 宣告陣列並設定初始值:

宣告陣列A可存放4個整數資料,並設定初始值依序為24、5、13、47

Dim 陣列名稱[() As資料型別]=[New資料型別(註標上限)] {陣列元素初始值}

Dim A() As Integer = {24, 5, 13, 47} 陣列A

24 5 13 47

0 1 2 3

語法 & 舉例

說明

① 若省略資料型別的宣告,VB會依照初始值內容,自動選用合適的資料型別。

例如:Dim A = {10, 6} '㉂動宣告成Integer(整數)

   Dim B = {"X", "Y"} '㉂動宣告成String(字串)

② 設定陣列元素初始值,必須以逗號(,)區隔。

⑥ 陣列宣告後,可使用「陣列名稱(註標)」的語法來存取或更改陣列元素的資料

內容。例如A(3) = 10、A(1) = A(2) + A(3)。

範例 陣列元素個數 佔用空間註

Dim A(10) As Integer 11 11 × 4 bytes = 44 bytes

Dim A(5) As Single 6 6 × 4 bytes = 24 bytes

Dim X(9) As Long 10 10 × 8 bytes = 80 bytes

Dim X(4) As Double 5 5 × 8 bytes = 40 bytes

表7-1 陣列所佔用的儲存空間之範例▼

Page 5: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

267第 7 章 陣列

上述用來宣告陣列並設定初始值的敘述,是由以下2行程式敘述組成。

Dim 陣列名稱() As 資料型別 '宣告陣列

陣列名稱 = [New 資料型別(註標上限)] {陣列元素初始值} '設定初始值

Tip

內文範例 "ch7-1a.sln"

Private Sub Form1_Load(…) Handles MyBase.Load Dim A() As String = {"周杰倫", "陳漢典", "阮經天", "柯震東"} MsgBox("我的偶像:" & A(3))End Sub

執行結果

程式碼

例1 顯示陣列A(3)的內容。

例2 計算陣列元素A(0)的值。

內文範例 "ch7-1b.sln"

Private Sub Form1_Load(…) _ Handles MyBase.Load Dim A(5), K As Integer A(5) = 0 A(4) = 2 For K = 5 To 2 Step -1 A(K - 2) = A(K) + A(K - 1) Next KEnd Sub

K = 5 To 2 Step -1 A(K - 2) = A(K) + A(K - 1)

5 A(5 - 2) = A(5) + A(5 - 1)→A(3) = 0 + 2 = 2

4 A(4 - 2) = A(4) + A(4 - 1)→A(2) = 2 + 2 = 4

3 A(3 - 2) = A(3) + A(3 - 1)→A(1) = 2 + 4 = 6

2 A(2 - 2) = A(2) + A(2 - 1)→A(0) = 4 + 6 = 10

陣列A

10 6 4 2 2 0

0 1 2 3 4 5

程式碼 解析

③ 若設有註標上限,就必須設定與陣列元素相等個數的初始值。

例如:Dim A = New Integer(3) {8, 2, 4, 9}

   Dim B = New String(2) {"A", "B"} '需設定3個初始值錯誤

Page 6: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

268 程式語言與設計-Visual Basic Ⅰ

( )1. 下列Visual Basic宣告敘述,何者不正確? 

(A)Dim X(1 To 5) As Integer  (B)Dim T As String  (C)Dim A(19) As Integer  (D)Dim Beauty As Boolean。 ≒ 統測

( )2. Visual Basic的陣列註標,是從哪一個數值開始? 

(A)0 (B)1 (C)2 (D)3。

( )3. 若陣列A之內容如下圖,執行Debug.Print(A(A(2) + 1) + 1)指令後答案為

何? (A)1 (B)2 (C)3 (D)4。 ≒ 統測

馬㆖

練習練習

陣列A

內容 2 3 0 1

註標 0 1 2 3

( )4. 執行下列Visual Basic程式的最後輸出結果? 

(A)6 (B)8 (C)16 (D)21。 ≒ 技競

Dim P(10)

a = 8

P(0) = 0

P(1) = 1

For i = 2 To a

P(i) = P(i - 1) + P(i - 2)

Next

MsgBox(P(a))

( )5. 執行下列Visual Basic程式片段,請問最後a的值為何? 

(A)0 (B)1 (C)5 (D)10。 ≒ 技競

Dim x(10) As Integer

a = 0

For i = 10 To 1 Step -1

x(i) = i Mod 2 : a = a + x(i)

Next

Page 7: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

269第 7 章 陣列

設計一支可隨機顯示歌名,並讓遊戲者根據該歌名猜原唱者是誰的程式(圖

7-3),最後將專案儲存為 "Ans7-1a.sln"。

程式設計實例程式設計實例 猜猜原唱者是誰

1 以點選的方式,

猜歌曲的原唱者

12 按答案鈕

若配對正確,會顯示 "答對了!";反之,

顯示 "答錯了!"

2

圖7-3 猜猜原唱者是誰範例的執行結果▲

Step1-設計表單畫面(或開啟已佈建好控制項的範例檔案 "Ex7-1a.sln")

1. 在表單上佈建如圖7-4所示的控制項,其中1個Label(標籤)控制項,應

佈建在GroupBox(群組方塊)內。

圖7-4 猜猜原唱者是誰範例的表單佈建畫面▲

Page 8: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

270 程式語言與設計-Visual Basic Ⅰ

2. 依下表設定控制項的相關屬性。

表7-2 控制㊠的屬性設定▼

控制項名稱 屬性 設定值

Form1 Text 猜猜原唱者是誰

Button1 Text 答案

GroupBox1 Text 歌名

Label1 Text 猜猜這首歌原唱者是誰?

Label2

Font 字型大小:16pt

ForeColor Blue(藍色)

Text (空白)

3. 本實例將使用L i s tBox(清單)控制項來顯示歌手的姓名,以下是

ListBox控制項的使用說明。

ListBox控制項

ListBox(清單)控制項可用來顯示一串特定的清單資料(圖7-5),讓使用者從清單

中點選所需資料項目。表7-3為此種控制項常用的屬性及方法。

圖7-5 Excel儲存格格式交談窗(ListBox的使用實例)▲

L i s t B o x(清單)

Page 9: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

271第 7 章 陣列

表7-3 ListBox控制㊠常用的屬性及方法▼

屬性 /方法 功能

屬性

Count 傳回清單內的項目總數(此屬性只能透過程式敘述來取得)

Items 設定清單內要顯示的項目

SelectedIndex傳回清單內被選取之項目的索引值,索引值從0開始編號

(此屬性只能透過程式敘述來取得)

SelectedItem 傳回清單內被選取之項目(此2項屬性值皆只能使用程式敘

述取得) Text

Sorted設定清單內的資料項目是否要排序,True為要排序;False為不需排序(預設值)

方法

Items.Add()可讓程式設計者在程式執行階段,將資料項目加入至清單

內,其語法為清單控制項名稱.Items.Add("資料")

Items.Remove()可讓程式設計者在程式執行階段,移除清單內的資料項目,

其語法為清單控制項名稱.Items.Remove("資料")

Step2-解題分析

1. 宣告2個一維陣列(song、singer),分別用來儲存5首歌的歌名("不具名

的悲傷"、"我們都傻"、"星空"、"還是要幸福"、"說到愛")及這5首歌的

原唱者姓名("羅志祥"、"楊丞琳"、"五月天"、"田馥甄"、"蔡健雅")。

2. 利用For…Next迴圈敘述在清單(ListBox1)中加入5位歌手的姓名。

3. 從儲存在陣列( s o n g )中的 5 首歌,隨機挑出一首歌並顯示在標籤

(Label2)中。

4. 單按(Click)答案鈕後,利用If…Then…Else敘述判斷使用者所點選的

歌手姓名是否正確。

Page 10: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

272 程式語言與設計-Visual Basic Ⅰ

5. 圖7-6為本程式實例的流程圖。

圖7-6 猜猜原唱者是誰範例的流程圖▲

step3-撰寫程式

按檢視程式碼鈕 ,開啟程式碼視窗,分別在Form1_Load、But ton1_

Click事件程序中,撰寫如下的程式碼。

開始

宣告變數、陣列,

並設定陣列的初始值

i = 0

i <= 4

在ListBox1加入

第i位原唱者的姓名

i = i + 1

初始化亂數產生器

n = 0 ~ 4間的亂數

顯示

第n首歌名

結束

否(F)

是(T)

開始

是否點選

正確項目?

顯示

"答對了!"顯示

"答錯了!"

結束

否(F)

是(T)

表單Load事件程序的執行流程 答案鈕Click事件程序的執行流程

Page 11: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

273第 7 章 陣列

10

20

30

40

50

60

70

80

90

100

110

120

130

140

150

160

Dim n As Short

Private Sub Form1_Load(…) Handles Me.Load

Dim i As Short

Dim singer(4), song(4) As String

song = {"不具名的悲傷", "我們都傻", "星空", "還是要幸福", "說到愛"}

singer = {"羅志祥", "楊丞琳", "五月天", "田馥甄", "蔡健雅"}

For i = 0 To 4 '將歌手㈴單加入㉃清單㆗

ListBox1.Items.Add(singer(i))

Next

Randomize()

n = Int(Rnd() * 5) '隨機產生1個介於0~4之間的整數亂數

Label2.Text = song(n)

End Sub

Private Sub Button1_Click(…) Handles Button1.Click

If n = ListBox1.SelectedIndex Then

MsgBox("答對了!", , "答案揭曉")

Else

MsgBox("答錯了!", , "答案揭曉")

End If

End Sub

說明

10 : 將變數n(隨機產生的亂數)宣告的位置,置於事件程序的上方,則該變數

可被表單檔中的任一程序使用。

20∼30 : 宣告程式需使用的變數 i(計數),及宣告2個一維陣列song(歌名)、

singer(原唱者的姓名)。

40∼50 : 設定2個一維陣列的初始值。

60∼80 : 利用For…Next迴圈敘述及Items.Add()方法,將原唱者的姓名加入至清單

(ListBox1)中。

90 : 設定亂數的序列,避免程式每次執行時,皆產生相同的一組亂數。

100 : 產生1個介於0 ~ 4之間的整數亂數,並指定給n。

110 : 依照n值,在標籤(Label2)中顯示對應的歌名。

120∼160 : 利用If…Then…Else敘述,判斷使用者所點選的選項是否正確,並顯示答

對與答錯的訊息。

Page 12: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

274 程式語言-Visual Basic I

㆘課想2

若要增加當遊戲者猜對,可繼續猜下一首歌曲的原唱者之功能,並記錄答對的題數,

上述程式應如何修改?(提示:將原宣告陣列song、singer的敘述,移至事件程序的上

方,並在Button1_Click中的If…Then…Else敘述加入,若答對,繼續顯示下一首歌曲名

稱,並累計答對題數;若答錯,則結束程式)

成果預覽:

7-1.2 多維陣列

只有1個註標的陣列稱為㆒維陣列,含有2個註標之陣列稱為㆓維陣列,含有3個註標之陣列稱為㆔維陣列(圖7-7),…依此類推。當陣列的註標個數超過1個

時,我們稱這種陣列為多維陣列。

圖7-7 ㆓維陣列及㆔維陣列的示意圖▲

25

15

200

6

12345

0 1 2 3

第一維︵列︶

第二維(欄)

陣列A

A(3, 1)

A(5, 2)

A(1, 3)0

2

1

0

0 1

21

3

第二維

第三維

第一維

陣列B

17

83

26

B(0, 1, 2)

B(0, 3, 0)

B(1, 0, 1)

二維陣列A(6, 3) 三維陣列B(1, 3, 2)

Label3

Page 13: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

275第 7 章 陣列

若資料可用1個註標值來識別,可使用一維陣列來儲存,例如儲存全班同學的

某一科成績(註標值可代表座號);若資料需要使用2個註標值來識別,則需使用

二維陣列來儲存,例如儲存全班同學的國、英、數三科成績(第1維註標值代表座

號,第2維註標值代表科目別)。

一、 宣告陣列:

說明

① 陣列的註標個數㈹表陣列的維數,例如2個註標為二維陣列(如A(2, 4))、3個註標為三維陣列(如B(2, 4, 3)),…以此類推。

② 以A(2, 4)為例(圖7-8),陣列元素個數 = (2 + 1) * (4 + 1) = 15。

宣告陣列A可存放12(3 × 4)個整數資料

Dim 陣列名稱(n1, n2, …) [As 資料型別]

Dim A(2, 3) As Integer

陣列A

0 0 0 0 0

1 0 0 0 0

2 0 0 0 0

0 1 2 3

Dim 陣列名稱型別字元(n1, n2, …)

Dim A%(2, 3)

語法 & 舉例

③ 陣列宣告後,可使用「陣列名稱(註標1, 註標2, …)」的語法來存取或更改陣

列中的資料內容。

例如A(1, 3) = 10   A(3, 2) = A(0, 2) + A(3, 1)

圖7-8 ㆓維陣列的範例▲

陣列A

0 (0, 0) (0, 1) (0, 2) (0, 3) (0, 4)

1 (1, 0) (1, 1) (1, 2) (1, 3) (1, 4)

2 (2, 0) (2, 1) (2, 2) (2, 3) (2, 4)

0 1 2 3 4

3列

5欄

Page 14: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

276 程式語言與設計-Visual Basic Ⅰ

二、 宣告陣列並設定初始值:

宣告陣列A可存放6個整數資料,並設定初始值依序10、20、30、40、50、60

Dim 陣列名稱[( , …) As 資料型別] = [New 資料型別(n1, n2 …)] {{陣列元素初始值}, {陣列元素初始值},…}

Dim A(,) As Integer = {{10, 20, 30},

{40, 50, 60}}

陣列A

0 10 20 30

1 40 50 60

0 1 2

語法 & 舉例

設定第0列A(0, 0)、A(0, 1)、A(0, 2)等3個陣列元素的初始值

設定第1列A(1, 0)、A(1, 1)、A(1, 2)等3個陣列元素的初始值

說明

① 陣列名稱後的小括號內,需以逗號來表示陣列的維數,逗號的數目為「陣列維

數-1」,例如加入1個逗號表示宣告一個二維陣列、加入2個逗號表示宣告一

個三維陣列、…以此類推。

② 在語法中的「New 資料型別(n1, n2, …)」敘述,其資料型別後的小括號內,

也可直接以逗號來表示陣列的維數。若直接標示註標上限,就必須設定與陣列

元素個數相對應的初始值。例如:

Dim P(,) = New Integer(,) {{2, 4, 8}, {3, 6, 9}, {6, 12, 24}}

Dim Q(,) = New String (1, 2) {{"A", "B", "C"}, {"D", "E", "F"}}

Dim R(,) = New Integer(2, 2) {{12, 24, 48}, {3, 6, 9}}錯誤

陣列元素個數 = (2 + 1) * (2 + 1)= 9

設定的初始值數

少於9個

Page 15: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

277第 7 章 陣列

例1 求sum值。

內文範例 "ch7-1c.sln"

Private Sub Form1_Load(…) Handles MyBase.Load Dim sum As Integer Dim A(,) As Integer = {{3, 3}, {2, 1}, {0, 8}} sum = A(A(2, 0) + 1, 1) + 1End Sub

A(A(2, 0) + 1, 1) + 1= A(0 + 1, 1) + 1= A(1, 1) + 1= 1 + 1= 2

陣列A

0 3 3

1 2 1

2 0 8

0 1

程式碼 解析

例2 計算陣列元素B(2, 1)與B(3, 2)相乘的結果。

內文範例 "ch7-1d.sln"

Private Sub Form1_Load(…) Handles MyBase.Load Dim B(3, 2), K, I, J As Integer K = 3 For I = 0 To 3 For J = 0 To 2 B(I, J) = K * (I - 1) + J Next J Next IEnd Sub

B(I, J) = K * (I - 1) + J→ B(2, 1) = 3 * (2 - 1) + 1 = 3 * 1 + 1 = 4→ B(3, 2) = 3 * (3 - 1) + 2 = 3 * 2 + 2 = 8故B(2, 1) * B(3, 2) = 4 * 8 = 32

陣列B

0 -3 -2 -1

1 0 1 2

2 3 4 5

3 6 7 8

0 1 2

程式碼 解析

Page 16: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

278 程式語言與設計-Visual Basic Ⅰ

堆疊與佇列

資料結構(data structure)是用來組織及管理資料的結構設計,使用資料結構可將資

料建立成為一個便於取用與處理的結構,以節省資料的儲存空間,並提昇資料處理的

速度。前述所介紹的陣列,及下列將介紹的堆疊與佇列是3種基本的資料結構。

堆疊(stack):具有後進先出(Last In First Out, LIFO)特性。資料存取規則

是:資料項目加入時,只能加到堆疊的頂端(top);取出資料項目時,必須由頂

端將資料優先取出。網頁瀏覽器中用來切換上、下一頁的功能即為堆疊的應用。例

如push 10、push 8、pop、push 36、pop、pop後,依序輸出的數值為8、36、10(圖7-9)。

佇列(queue):具有先進先出(First In First Out, FIFO)特性。資料存取規

則是:加入資料項目時,只能從佇列的尾端(rear)加入;取出資料項目時,則只

能從佇列的前端(front)取出。印表機列印文件的順序即為佇列的應用。例如依

序加入10、加入8、刪除元素、加入36、刪除元素、加入2後,佇列的內容為36、2(圖7-10)。

10

8

10

36

10 10

1 push 10 2 push 8 4 push 36

3 pop(輸出8) 5 pop(輸出36) 6 pop(輸出10)

圖7-9 堆疊增刪範例的示意圖▲

10

1 加入10 2 加入8 4 加入36

3 刪除元素 5 刪除元素

6 加入2

36 210 8 8 36

圖7-10 佇列增刪範例的示意圖▲

Page 17: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

279第 7 章 陣列

設計一個可依使用者點選的性別及血型,來顯示對應性格的程式(圖

7-11),最後將專案儲存為 "Ans7-1b.sln"。

程式設計實例程式設計實例 血型性格分析

1 點選性別(如男)

2 選擇血型(如O型)

圖7-11 血型性格分析範例的執行結果▲

3 按分析鈕,即會顯示

性格分析結果

1 2

3

Step1-設計表單畫面(或開啟已佈建好控制項的範例檔案 "Ex7-1b.sln")

1. 在表單上佈建,如圖7-12所示之控制項,其中2個RadioButton(選項按

鈕)控制項,應佈建在GroupBox(群組方塊)內。

2. 依下表設定控制項的相關屬性。

表7-4 控制㊠的屬性設定▼

控制項名稱 屬性 設定值 控制項名稱 屬性 設定值

Form1 Text 血型性格分析RadioButton2

AutoSize False

GroupBox1 Text 性別 Text 女

RadioButton1

AutoSize False Label1 Text 血型

Text 男 Button1 Text 分析

Checked True

圖7-12 血型性格分析範例的表單佈建畫面▲

ComboBox1

Page 18: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

280 程式語言與設計-Visual Basic Ⅰ

3. 本實例將使用ComboBox(㆘拉式方塊)控制項來供使用者點選血型資

料,以下是ComboBox控制項的使用說明。

Step2-解題分析

1. 載入(Load)表單後,將4種血型("A型"、"B型"、"O型"、"AB型")

加入至下拉式方塊(ComboBox1)中。

2. 單按(Click)分析鈕後,執行下列內容:

(1) 宣告1個二維陣列,並依照表7-5血型性格分析表設定初始值。

表7-5 血型性格分析表▼

血型

性別A型 B型 O型 AB型

男 具責任感 善於交際 樂觀豪爽 認真能幹

女 小心謹慎 待人親切 率真俐落 魅力四射

ComboBox控制項

ComboBox(下拉式方塊)是一種結合「文字方塊」及「清單」特性的控制項(圖

7-13)。在表單上佈建此控制項,可讓使用者在程式執行時,透過下拉式方塊直接選

取資料。ComboBox常用的屬性(例如Count、Items、Text)、方法(例如Items.Add、I tems.Remove),與第7-1.1節「程式設計實例」中,延伸學習所介紹的

ListBox(清單)控制項相同,請同學自行參閱。

圖7-13 ComboBox的使用實例▲

Micorsoft Word 2010IE 8

用選按的方式來選取資料

Page 19: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

281第 7 章 陣列

(2) 宣告變數Inx(用來儲存使用者選取之血型的索引值)。

(3) 利用 I f…T h e n…E l s e敘述,判斷使用者點選的性別,從二維陣列

(type)中取出並顯示對應的性格分析。

3. 圖7-14為本程式實例的流程圖。

開始

在ComboBox1中加入4種血型

結束

開始

宣告變數及二維陣列,

並設定陣列初始值

性別 = 男?

顯示對應的

性格分析結果

結束

否(F)

是(T)

Inx = 使用者選取

之血型的索引值

顯示對應的

性格分析結果

表單Load事件程序的執行流程 分析鈕Click事件程序的執行流程

圖7-14 血型性格分析範例的流程圖▲

Page 20: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

282 程式語言與設計-Visual Basic Ⅰ

step3-撰寫程式

按檢視程式碼鈕 ,開啟程式碼視窗,分別在Form1_Load、But ton1_

Click事件程序中,撰寫如下的程式碼。

10

20

30

40

50

60

70

80

90

100

110

120

Private Sub Form1_Load(…) Handles MyBase.Load

ComboBox1.Items.Add("A型")

ComboBox1.Items.Add("B型")

ComboBox1.Items.Add("O型")

ComboBox1.Items.Add("AB型")

End Sub

Private Sub Button1_Click(…) Handles Button1.Click

Dim type(,) As String = {{"具責任感", "善於交際", "樂觀豪爽", "認真能幹"},

{"小心謹慎", "待人親切", "率真俐落", "魅力四射"}}

Dim Inx As Short

Inx = ComboBox1.SelectedIndex

If RadioButton1.Checked = True Then

MsgBox(type(0, Inx), , "分析結果")

Else

MsgBox(type(1, Inx), , "分析結果")

End If

End Sub

說明

10∼40 : 利用 I tems.Add()方法,將4種血型加入至下拉式方塊(ComboBox1)中。

50 : 宣告二維陣列type(性格分析結果)並設定初始值。

60 : 宣告變數Inx(用來儲存使用者選取之血型的索引值)。

70 : 將使用者在血型下拉式方塊中選擇之血型的索引值,指定給Inx。

80∼90 : 若性別為男性,依照Inx值,取出陣列type(0, Inx)的分析結果。

100∼120 :若性別為女性,依照Inx值,取出陣列type(1, Inx)的分析結果。

Page 21: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

283第 7 章 陣列

㆘課想2

若要根據血型專家提供的血型速配指數(如下表),增加可依選取的性別及血型,顯

示血型配對指數的功能,上述程式應如何修改?(提示:宣告用來儲存血型速配指數的二

維陣列match)

男 /女 A型 B型 O型 AB型

A型 79 92 67 83

B型 74 89 73 75

O型 94 67 80 93

AB型 76 83 93 87

Label2

Label3

GroupBox2

Label4 ~ Label8

成果預覽:

Page 22: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

284 程式語言與設計-Visual Basic Ⅰ

將陣列B調整為3 × 4的二維陣列,並保留原陣列內容

ReDim [Preserve] 陣列名稱(陣列上限)

Dim B = New Integer(2, 1) {{10, 20}, {30, 40}, {50, 60}}ReDim Preserve B(2, 3)

(內文範例 "ch7-1g.sln")

語法 & 舉例

UBound()、 Length()、 ReDim()方法

Visual Basic提供的UBound()、Length()、ReDim()方法,可分別用來取得陣列註

標的上限值、陣列的元素個數,以及重新調整陣列大小等,說明如下。

傳回陣列的上限值

UBound(陣列名稱[, 欲查詢的維數])

Dim A(7) As IntegerDebug.Print(UBound(A)) '傳回陣列A的上限值,即7Dim B(2, 4) As StringDebug.Print(UBound(B, 2)) '傳回陣列B之第㆓維的㆖限值,即4

(內文範例 "ch7-1e.sln")

語法 & 舉例

說明: 查詢一維陣列的上限值,不需輸入維數,如上例Debug.Print(UBound(A))。

說明

① 加入關鍵字 "Preserve",可保留原陣列元素的值;若省略,則會刪除原陣列

元素的值,而改以預設的初始值取代。

② 陣列的維度不可改變,若為多維陣列只能改變最右側的元素個數,例如:

Dim A(5) → ReDim A(9) '調整為可存放10個元素的㆒維陣列

Dim A(5) → ReDim A(3, 4) '不可將㆒維陣列,調整成㆓維陣列

Dim B(1, 3) → ReDim B(3, 5) '不可改變陣列B第㆒維的元素個數

③ 雖可調整陣列大小,但應慎重使用,以免增加程式除錯的困難度。

傳回陣列的長度(即陣列的元素個數)

陣列名稱.Length

Dim A(3) As IntegerDebug.Print(A.Length) '傳回陣列A的元素個數,即4Dim B(1, 2) As StringDebug.Print(B.Length) '傳回陣列B之第㆓維的元素個數,即6

(內文範例 "ch7-1f.sln")

語法 & 舉例

錯誤

Page 23: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

285第 7 章 陣列

一、選擇題

( )1. 在Visual Basic中,執行陣列宣告敘述 "Dim A() As Integer = {4, 1, 0, 6, 8}",則A(3)的值為何? (A)1 (B)0 (C)6 (D)8。

( )2. 執行下列Visual Basic程式片段時,請問陣列A占用記憶體多少bytes的儲存空

間? (A)160 (B)96 (C)80 (D)48。 ≒ 統測

Dim A(3, 4) As Double

( )3. 下列何種資料結構的資料元素存取方式是先進先出(First In First Out)? 

(A)陣列 (B)雙向串列 (C)堆疊 (D)佇列。 統測

( )4. 在Visual Basic中,某陣列宣告敘述以 "Dim B( , , ) As String" 開頭,由此

可知該陣列為幾維陣列? (A)1 (B)2 (C)3 (D)4。

( )5. 在Visual Basic中,執行陣列宣告敘述 "Dim X(2, 3, 2) As Long",則陣列X可儲存幾個陣列元素? (A)7 (B)12 (C)27 (D)36。

( )6. 執行程式(一)後,A(3)的值為何? (A)0 (B)1 (C)3 (D)6。 ≒ 統測

練習練習7-1

基礎

Dim A(3), Sum, I As IntegerSum = 0For I = 1 To 3 Sum = Sum + I A(I) = SumNext I

Dim A(8) As IntegerFor I = 1 To 8 A(I) = I + 2Next IDebug.Print(A(A(A(2) + 1) - 2) + 3)

程式(一) 程式(二)

( )7. 執行程式(二)後,其顯示的結果為何? (A)12 (B)11 (C)10 (D)9。 ≒ 技競

( )8. 執行下列Visual Basic程式片段後,輸出的結果為何? 

(A)15 (B)20 (C)25 (D)30。 ≒ 統測

Dim A(4) For i = 1 To 4 If (i Mod 2 <> 0) Then A(i) = i ^ 2 - 1 Else A(i) = i ^ 2 + 1 End If Next i MsgBox(A(4) + A(3) - A(2))

Page 24: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

286 程式語言與設計-Visual Basic Ⅰ

( )9. 下列Visual Basic程式片段執行後,A(1, 3)的值與下列哪一個元素的值相同? (A)A(2, 0) (B)A(2, 1) (C)A(2, 2) (D)A(2, 3)。 統測

Dim A(3, 3) As Integer

For I = 0 To 3

For J = 0 To 3

A(I, J) = 2 * I * (I + J)

Next J

Next I

( )10. 下列程式執行前陣列A(1)至A(5)之值依序為5, 6, 3, 4, 1,則其執行後印出陣

列A(1)至A(5)的結果為? 

(A)5, 6, 3, 4, 1  (B)6, 5, 4, 3, 1  (C)1, 3, 4, 5, 6  (D)5, 4, 6, 1, 3。 ≒ 技競

Dim a(5)

For J = 2 To 5

T = a(J) : I = J - 1 : M = J

While (I >= 1 And a(I) < T)

If a(I) < T Then a(M) = a(I) : I = I - 1 : M = M - 1

End While

a(I + 1) = T

Next J

( )11. 執行下列VB程式後,輸出的結果為何? 

(A)27 12 8 9 21 72  (B)72 21 9 8 12 27  (C)8 9 12 21 27 72  (D)72 27 21 12 9 8。 ≒ 統測

Dim a(6), i, b As Integer

a(1) = 27 : a(2) = 12 : a(3) = 8

a(4) = 9 : a(5) = 21 : a(6) = 72

For i = 1 To 3

b = a(i)

a(i) = a(7 - i)

a(7 - i) = b

Next i

For i = 1 To 6

Debug.Print(a(i))

Next i

進階

Page 25: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

287第 7 章 陣列

( )12. 執行下列Visual Basic程式片段後,sum、k的值分別為何? 

(A)產生陣列索引超出範圍之錯誤 (B)48 4 (C)66 3 (D)44 2。 ≒ 統測

Dim a(4, 3) As Integer a(1, 1) = 0 : a(1, 2) = 1 : a(1, 3) = 11 a(2, 1) = 0 : a(2, 2) = 2 : a(2, 3) = 22 a(3, 1) = 0 : a(3, 2) = 3 : a(3, 3) = 33 For i = 1 To 4 For j = 1 To 3 If a(i, j) <> 0 And a(i, j) Mod 2 <> 0 Then sum = sum + a(i, j) : k = k + 1 End If Next j Next i

二、多元練習題

1. 請依據下面各小題的資料儲存需求,撰寫宣告陣列的敘述。

(1) 利用陣列temp記錄全國某年1 ~ 12月的平均氣溫(溫度取至小數1位):

(2) 利用陣列score記錄全班50位同學的國、英、數、計概4科成績(分數為整數):

(3) 利用陣列match記錄如下表所示的十二星座之速配指數:

男 /女 牡羊 金牛 雙子 巨蟹 獅子 處女 天秤 天蠍 射手 魔羯 水瓶 雙魚

牡羊 90 68 79 52 97 61 85 60 43 43 72 71金牛 75 88 76 82 56 91 74 80 97 97 41 78雙子 82 72 89 78 79 76 98 68 70 70 91 46巨蟹 47 75 71 89 69 88 58 97 80 80 58 93獅子 94 45 81 61 87 66 88 65 59 59 78 61處女 65 91 57 84 72 89 77 84 92 92 64 65天秤 85 75 93 66 81 49 90 73 51 51 96 74天蠍 70 78 69 92 45 81 87 71 85 85 51 99射手 99 61 86 70 92 72 80 47 64 64 82 54魔羯 58 93 64 87 77 95 47 76 88 88 69 82水瓶 88 66 99 74 84 55 95 57 78 74 87 69雙魚 79 81 48 97 62 84 64 92 44 77 60 88

Page 26: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

288 程式語言與設計-Visual Basic Ⅰ

2. 選按『檔案/開啟專案』選項,開啟專案 "Ex7-1c.sln",利用二維陣列儲存近五期

的4星彩開獎號碼,並計算每個號碼出現的次數。

成果預覽:

提示: (1) 宣告一個用來存放近五期4星彩開獎號碼的二維陣列n。

(2) 宣告一個用來存放每個開獎號碼(0 ~ 9)出現次數的一維陣列count。

(3) 利用巢狀迴圈及InputBox()函數,讓使用者輸入近五期開獎的號碼。

(4) 利用Select Case敘述計算每個開獎號碼的出現次數,並顯示在對應的

文字方塊(TextBox2 ~ TextBox11)中。

1 按輸入4星彩開獎

號碼鈕

1

2 依序輸入五期的開

獎號碼

3 顯示開獎號碼及每

個號碼的出現次數

2

3

TextBox1 TextBox2 ~ TextBox6

TextBox7 ~ TextBox11

Page 27: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

289第 7 章 陣列

7-2 陣列的應用

在程式設計實務中,我們除了使用陣列來儲存多個具有相同資料型別的資料

(例如每位同學的成績)之外,為了增加資料的可讀性,通常還會對陣列元素進

行排序處理;另外,在某些情況下,可能會需要尋找特定的陣列元素,或確定某

筆資料是否儲存於陣列中。本節將介紹陣列在排序及搜尋上的應用。

7-2.1 資料排序

㈾料排序是指利用「比較」與「交換」的方法,將資料依照由小到大(遞

增)或由大到小(遞減)的條件,依序排列。以下介紹 氣泡排序法(b u b b l e

sort)及 選擇排序法(selection sort)兩種常見的資料排序法。

氣泡排序法

氣泡排序法(或稱泡沫排序法)的排序規則是逐次比較相鄰的兩個資料,並

依照由大到小或由小到大的排序條件,交換資料的位置,直到所有的資料排序完

成。

使用氣泡排序法排序,如果要將資料由大到小排序,則較大值的資料將逐漸

往上移動;相反地,如果要將資料由小到大排序,則較小的資料將逐漸往上移

動。這種變動資料位置的情形,就像氣泡上升的現象,氣泡排序法也因此而得

名。

圖7-15是將5個大小不等的數字(25、12、47、18、9),利用氣泡排序法

由小到大排序的過程。

Page 28: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

290 程式語言與設計-Visual Basic Ⅰ

圖7-15 利用氣泡排序法將5個數字由小到大排序▲

排序前:

25 12 47 18 9

25 12 47 18 9

12 25 47 18 9

12 25 47 18 9

12 25 18 47 9

12 25 18 9 47

12 25 18 9 47

12 18 25 9 47

12 18 9 25 47

12 18 9 25 47

12 9 18 25 47

9 12 18 25 47

排序後:

1 第一次循環:兩兩比較第1 ~ 5個相鄰的資料,

並依照比較結果調整數字的位置,使最大的數

字(47)排在第5個位置

2 第二次循環:兩兩比較第1 ~ 4個相鄰的資料,

並依照比較結果調整數字的位置,使第2大的

數字(25)排在第4個位置

3 第三次循環:兩兩比較第1 ~ 3個相鄰的資料,

並依照比較結果調整數字的位置,使第3大的

數字(18)排在第3個位置

4 第四次循環:兩兩比較第1 ~ 2個相鄰的資料,

並依照比較結果調整數字的位置,使第4大的

數字(12)排在第2個位置

說明: 為比較後交換位置;

    為比較後不交換位置。

Page 29: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

291第 7 章 陣列

使用氣泡排序法來排序N筆資料時,有以下3項特性:

1. 排序循環次數最多為N - 1次。

2. 不論原始資料的排列順序為何,完成排序所需的比較次數為

N * (N - 1) / 2次。

3. 若在氣泡排序法的程式中,加入

一段程式敘述,用以判斷在每次

循環中是否有資料進行交換,

如果沒有,則表示資料已完成

排序。如此一來,當資料為N筆

時,最少只需比較N - 1次(即

原始資料順序與欲排序的順序相

同時),即完成排序的工作。

流程圖表示

圖 7 - 1 6 是使用流程圖來描述利

用氣泡排序法將5個大小不等的資料

(25、12、47、18、9)由小到大依

序排序的流程(假設資料已儲存在陣

列A中)。

註: i用來表示排序循環的次數;j用來表示比較資

料的位置。圖7-16 氣泡排序法的流程圖▲

開始

宣告變數、陣列,

並設定初始值

i = 1註

i <= (5 - 1)

j = 0

j <= (4 - i)

A(j) > A(j + 1)

A(j)與A(j + 1)交換

j = j + 1

i = i + 1

結束

是(T)

是(T)

是(T)

否(F)

否(F)

否(F)

Page 30: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

292 程式語言與設計-Visual Basic Ⅰ

( )1. 佳佳想依照段考總分來排列30位同學的段考名次,如果她使用的是氣泡排序

法,請問她最多需要進行幾次的排序循環? 

(A)30 (B)29 (C)31 (D)28。

( )2. 如果要以氣泡排序法,將20個原先由重到輕依序排列的包裹(每個包裹的重量

皆不相同),改為由輕到重的順序重新排列,共需進行幾次比較? 

(A)190 (B)210 (C)200 (D)180。

( )3. 若要以氣泡排序法,將數列資料25、35、15、5、45由小到大依序排列,請問

在第一次循環結束後,數列排列的狀況為何? 

(A)5、35、15、25、45  (B)5、15、35、25、45 

(C)25、15、5、35、45  (D)5、15、25、35、45。

馬㆖

練習練習

程式範例

圖7-17是利用氣泡排序法將5個大小不等的資料,由小到大排序的程式碼。

圖7-17 使用氣泡排序法排序㈾料的程式範例▲

排序前:

25 12 47 18 9

0 1 2 3 4

9 12 18 25 47

0 1 2 3 4

排序後:

Dim A(4), tmp, i, j As IntegerA(0) = 25 : A(1) = 12 : A(2) = 47 : A(3) = 18 : A(4) = 9For i = 1 To (5 - 1) '排序循環4次 For j = 0 To (4 - i) '排序循環遞增,比較次數遞減

If A(j) > A(j + 1) Then tmp = A(j) A(j) = A(j + 1) A(j + 1) = tmp End If Next jNext i

《使用氣泡排序法,將資料由小到大排序的程式碼》

(內文範例 "ch7-2a.sln")

將 A ( j ) 與A(j + 1)的資料交換

改成A(j) < A(j + 1),可將資料由大到小排序

Page 31: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

293第 7 章 陣列

選擇排序法

若以由小到大(遞增)排序為例,選擇排序法的排序規則是從第1個數值開始

找尋,直到最後一個數值,以選出最小值,再將最小值與第1個數值交換;接著從

第2個數值之後的資料列中找出最小值,與第2個數值交換,…依此類推,不斷重

複上述步驟,直到所有的資料排序完成。

圖7-18是將5個大小不等的數字(53、46、12、38、76),利用選擇排序法

由小到大排序的過程。

圖7-18 利用選擇排序法將5個數字由小到大排序▲

排序前:

53 46 12 38 76

12 38 46 53 76

排序後:

1 第一次循環:在5個數字中比較資料的大小,

挑選出最小的數字(12),並與第1個位置的

數字(53)交換位置

2 第二次循環:在其餘4個數字中比較資料的大

小,挑選出最小的數字(38),並與第2個位

置的數字(46)交換位置

3 第三次循環:在其餘3個數字中比較資料的大

小,挑選出最小的數字(46),並與第3個位

置的數字(53)交換位置

4 第四次循環:在其餘2個數字中比較資料的大

小,挑選出最小的數字(53),正好位於第4個位置,不需交換位置,排序完成

說明: 為比較;S為最小值。

53 46 12 38 76S

12 46 53 38 76S

12 38 53 46 76S

12 38 46 53 76S

Page 32: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

294 程式語言與設計-Visual Basic Ⅰ

使用選擇排序法來排序N筆資料

時,有以下2項特性:

1. 排序循環次數最多為N - 1次。

2. 不 論 原 始 資 料 的 排 列 順 序 為

何,完成排序所需的比較次數為

N * (N - 1) / 2次。

流程圖表示

圖 7 - 1 9 是使用流程圖來描述利

用選擇排序法將5個大小不等的資料

(53、46、12、38、76)由小到大

依序排列的流程(假設資料已儲存在

陣列A中)。

註: i用來表示排序循環的次數;j用來表示比較資

料的位置。圖7-19 選擇排序法的流程圖▲

開始

宣告變數、陣列,

並設定初始值

i = 0註

i <= (4 - 1)

S = i

j <= (5 - 1)

A(S) > A(j)

j = j + 1

A(i)與A(S)交換

結束

是(T)

是(T)

是(T)

否(F)

否(F)

否(F)

j = (S + 1)

S = j

i = i + 1

Page 33: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

295第 7 章 陣列

( )1. 若要依照銷售總額的高低,以選擇排序法來排列園遊會中30個攤位的銷售名

次,請問需要進行幾次的排序循環? (A)30 (B)28 (C)31 (D)29。

( )2. 若要將未依大小順序排列的13張黑桃撲克牌(A ~ K),以選擇排序法由小到

大依序排列,共需進行幾次比較? (A)78 (B)91 (C)71 (D)82。

( )3. 使用選擇排序法,將數列資料(10、5、25、30、15)由大到小依序排列,共

需進行幾次比較? (A)8 (B)9 (C)10 (D)11。

馬㆖

練習練習

程式範例

圖7-20是利用選擇排序法將5個大小不等的資料,由小到大排序的程式碼。

圖7-20 使用選擇排序法排序㈾料的程式範例▲

排序前:

53 46 12 38 76

0 1 2 3 4

12 38 46 53 76

0 1 2 3 4

排序後:

Dim A(4), tmp, i, j, S As Integer '由小到大排序

A(0) = 53 : A(1) = 46 : A(2) = 12 : A(3) = 38 : A(4) = 76

For i = 0 To (4 - 1) '排序循環4次

S = i '設定最小值的位置在第i個

For j = (S + 1) To (5 - 1) '控制每次循環時,比較㈾料的位置

If A(S) > A(j) Then S = j '判斷㈾料大小,以找出最小值

Next j

tmp = A(i)

A(i) = A(S)

A(S) = tmp

Next i

《使用選擇排序法,將資料由小到大排序的程式碼》

(內文範例 "ch7-2b.sln")

將A ( i )與A(S)交換

改成A(S) < A(j),可

將資料由大到小排序

Page 34: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

296 程式語言與設計-Visual Basic Ⅰ

Array.Sort()與 Array.Reverse()方法

在Visual Basic 2010中,要將陣列中的資料進行排序,除了可利用前述介紹的巢狀

迴圈來完成之外,其實也可利用Array.Sort()與Array.Reverse()方法,來完成排序工

作。

Array.Sort()方法是用來將一維陣列中的資料遞增排序;Array.Reverse()方法則是用

來反轉一維陣列中的資料;使用這兩個方法來排序,相較於自己撰寫程式,具有快速

又不易出錯的優點。

將陣列中的資料由小到大(遞增)排序

Array.Sort(陣列名稱)

Dim A = {56, 84, 12, 68, 99, 6}Array.Sort(A)For i = 0 To 5 Debug.Print(A(i))Next

(內文範例 "ch7-2c.sln")

語法 & 舉例

反轉陣列中的資料

Array.Reverse(陣列名稱)

Dim A = {6, 12, 56, 68, 84, 99}Array.Reverse(A)For i = 0 To 5 Debug.Print(A(i))Next

(內文範例 "ch7-2d.sln")

語法 & 舉例

由上述二例可知,若要將陣列中的資料遞減排序,只要先利用Array.Sort()方法將資

料遞增排序後,再利用Array.Reverse()方法反轉資料即可。

Page 35: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

297第 7 章 陣列

7-2.2 資料搜尋

㈾料搜尋是指依照特定的條件及方法,在一群資料中尋找符合條件的資料。

我們可根據資料的排列特性(未排序或已排序),選擇使用不同的搜尋法來

找出特定的資料。以下將介紹 循序搜尋法(sequent ia l search)及 ㆓元搜尋法

(binary search)兩種常見的資料搜尋法。

循序搜尋法

循序搜尋法又稱線性搜尋法,它的搜尋規則是由第一個資料開始依序比對每

個資料,直到找到目標資料為止。當搜尋完所有項目後,仍未找到所要搜尋的資

料時,即表示該資料不存在資料列中。當資料筆數不大或資料列未經排序時,適

合使用循序搜尋法來搜尋資料。

圖7-21是在10個大小不等且未經排序的數字中,利用循序搜尋法來搜尋數字

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

圖7-21 利用循序搜尋法在㈾料列㆗找出數字15▲

使用循序搜尋法在N筆資料中要找到目標資料,有以下3項特性:

1. 資料列不須事先排序。

2. 搜尋的比對次數最少需要1次;最多需要N次。

3. 平均需要比對(N + 1) / 2次。

Page 36: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

298 程式語言與設計-Visual Basic Ⅰ

流程圖表示

圖7-22是使用流程圖來描述利用循序搜尋法在資料列(陣列A)中搜尋目標

資料(Target = 15)的流程。

圖7-22 循序搜尋法的流程圖▲

顯示目前資料

所在的位置

宣告變數、陣列,

並設定初始值

i <= 9

A(i) = Target?

結束

是(T)

是(T)

否(F)

否(F)

開始

Target = 15

i = 0

i = i + 1顯示

"找不到"

Page 37: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

299第 7 章 陣列

程式範例

圖7-23是利用循序搜尋法搜尋目標資料15的程式碼。

圖7-23 使用循序搜尋法進行㈾料搜尋的程式範例▲

( )1. 下列哪一種情形,較不適合使用循序搜尋法來搜尋資料? 

(A)在蛋糕店的產品展示櫥窗中找出起司蛋糕 

(B)在數萬筆的計程車駕駛名單中,找出名為 "張富貴" 的駕駛員 

(C)在家裡鞋櫃中找出自己的夏季涼鞋 

(D)在收到的10封電子郵件中,找出老師回覆問題的郵件。

( )2. 使用循序搜尋法,在1000筆學生資料中,搜尋「謝明華」的資料,請問最多

需要進行幾次的搜尋比較? (A)1000 (B)1 (C)999 (D)1001。

( )3. 使用循序搜尋法,在45張考卷中搜尋自己的考卷,請問平均要進行幾次的搜尋

比較? (A)1 (B)23 (C)45 (D)46。

馬㆖

練習練習

Dim Target, i As Integer

Dim A() As Integer = {28, 3, 15, 55, 48, 9, 14, 1, 38, 20}

Target = 15 '搜尋目標為15For i = 0 To 9

If A(i) = Target Then '判斷㈾料列㆗是否㈲要搜尋的㈾料

MsgBox("A(" & i & ") = " & Target)

End '結束程式

End If

Next i

MsgBox("找不到")

《使用循序排序法搜尋資料的程式碼》

(內文範例 "ch7-2e.sln")

陣列A

28 3 15 55 48 9 14 1 38 20

0 1 2 3 4 5 6 7 8 9

《執行結果》

Page 38: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

300 程式語言與設計-Visual Basic Ⅰ

二元搜尋法

循序搜尋法雖然簡單,但是要找到目標資料的比較次數卻很難預期,尤其是

當資料筆數龐大時,使用此方法來搜尋資料會非常沒有效率。為了提昇資料搜尋

的效率,我們可利用第7-2.1節所介紹的排序法,先將龐大的資料排序後,再使用

二元搜尋法來尋找資料。

㆓元搜尋法又稱二分搜尋法,它的搜尋規則是先找出資料列的中央位置,判

定所要搜尋的資料是位於資料列的前半段或後半段,然後捨去另一半的資料,將

搜尋範圍逐漸縮小;如此重複上述步驟,直到找到或確定資料不存在為止。

二元搜尋法的中間值(M)計算公式為M = (L + R) / 2,其中L表示資料

列可搜尋範圍的最㊧註標值,R表示資料列可搜尋範圍的最㊨註標值。計算時,中

間值只取到計算結果的整數位數。

圖7-24是在7個已依照由小到大排列的數值資料中,利用二元搜尋法來搜尋

81的過程。

圖7-24 利用㆓元搜尋法在㈾料列㆗找出81▲

1 找出中間值M(= (0 + 6) / 2 = 6 / 2 = 3),因搜尋目標(81)> M代表的

數值(47),捨棄前半段

2 找出中間值M(= (4 + 6) / 2 = 10 / 2 = 5),因搜尋目標(81)> M代表的

數值(67),捨棄前半段

3 找出中間值M(= (6 + 6) / 2 = 12 / 2 = 6),因搜尋目標(81)= M代表的

數值(81),找到目標,搜尋結束

陣列A

2 16 34 47 53 67 81

0 1 2 3 4 5 6

L M R

陣列A

2 16 34 47 53 67 81

0 1 2 3 4 5 6

L M R

陣列A

2 16 34 47 53 67 81

0 1 2 3 4 5 6

L RM

Page 39: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

301第 7 章 陣列

使用二元搜尋法在N筆資料中要找到目標資料,有以下2項特性:

1. 資料列必須事先排序。

2. 搜尋的比對次數最少需要比較1次、最多需要比對

log2(N + 1)次;若計算結果帶有小數,須無條件

進位至個位數。例如有8筆資料,最多比較次數為

log2(8 + 1) = log2(9) ≒ 3.17,須無條件進位為4,

表示必須比較4次(∵23 < 9 < 24)。

流程圖表示

圖7 - 2 5是使用流程圖來描述

利用二元搜尋法在由小到大排序的

資料列(陣列A)中,搜尋目標資

料(Target = 81)的流程。

log2N = X,

表示2X = N。

Tip

宣告變數、陣列,

並設定初始值

L <= R

Target?

結束

> A(M)

是(T)

否(F)

開始

顯示找到

的位置

M = (L + R) \ 2

L = M + 1 R = M - 1

= A(M) < A(M)

圖7-25 利用㆓元搜尋法在㈾料列㆗找出81▲

L = 0R = UBound(A)

Target = 81

顯示 "找不到"

Page 40: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

302 程式語言與設計-Visual Basic Ⅰ

Dim L, R, M, Target As IntegerDim A() As Integer = {2, 16, 34, 47, 53, 67, 81}L = 0 : R = UBound(A) : Target = 81 '搜尋目標(Target)為81Do While L <= R M = (L + R) \ 2 '計算㆗間值

Select Case Target Case Is = A(M) '找到目標㈾料

MsgBox("A(" & M & ") = " & Target) End '結束程式

Case Is > A(M) '若是,捨棄前半段,L值重設

L = M + 1 Case Is < A(M) '若是,捨棄後半段,R值重設

R = M - 1 End SelectLoopMsgBox("找不到")

《使用二元搜尋法搜尋資料的程式碼》

(內文範例 "ch7-2f.sln")

陣列A

2 16 34 47 53 67 81

0 1 2 3 4 5 6

《執行結果》

程式範例

圖7-26是利用二元搜尋法搜尋資料81的程式碼。

圖7-26 使用㆓元搜尋法進行㈾料搜尋的程式範例▲

Array.IndexOf()方法

Array.IndexOf()方法可在一維陣列(不需事先排序)中搜尋特定的資料,語法如下。

找出陣列A中目標資料12的註標值(假設陣列A存放的內容為56、84、12、68、99、6)

Array.IndexOf(陣列名稱, 目標資料[, 搜尋起點註標值])

Array.IndexOf(A, 12, 0) (內文範例 "ch7-2g.sln")

語法 & 舉例

說明: 若陣列中有多個符合條件的資料,僅會傳回第1個符合條件的資料之註標值。

執行結果為2,表示12在A(2)

Page 41: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

303第 7 章 陣列

一、選擇題

( )1. 利用氣泡排序法排列N筆資料的順序,最多做幾次的排序循環? 

(A)N / 2 次 (B)N 次 (C)N - 1 次 (D)N + 1 次。 統測

( )2. 二元搜尋法在搜尋升冪排序過後的資料時,是將所欲搜尋的數值與資料中的哪

一個元素進行比較? 

(A)任意一個 (B)第一個 (C)最後一個 (D)最中間的。 統測

( )3. 一組10個已排序的數值資料,若用二元搜尋法找其中某一個特定值,至多需要

比對幾次即可找到? (A)3 (B)4 (C)5 (D)9。 統測

( )4. 利用循序搜尋法,找尋某一筆已知存在陣列(有15筆資料)中的資料,最好的

情況要作比較次數與最壞的情況要作比較次數的平均為: 

(A)8 (B)7 (C)15 (D)2。 統測

( )5. 利用循序搜尋法在31筆「已排序」資料中尋找指定資料(假設該筆資料存

在),請問最少需要比較幾次,才能找到指定資料? 

(A)32 (B)31 (C)5 (D)1。 統測

( )6. 下列對二元搜尋法(Binary Search)的敘述,何者有誤? (A)平均效率比

循序搜尋法好 (B)資料必須先排序 (C)在N個資料中搜尋,比較次數最多為

log2(N + 1) (D)又稱為線性搜尋法。 ≒ 統測

( )7. 給定10個大小隨機排列的正整數,如果要以泡沫排序的方式,由小而大排

列,在程式設計上使用巢狀For…Next處理,請問至少要使用幾層巢狀For…Next? (A)10 (B)9 (C)2 (D)1。 統測

( )8. 有關循序搜尋法的敘述,何者正確? 

(A)若要在10筆資料中進行循序搜尋,最少需要10次的搜尋比較 

(B)當資料筆數很大時,使用循序搜尋法來找尋資料會較其它搜尋法有效率 

(C)在N個資料中要找到欲搜尋的資料,最多需要N / 2次的搜尋比對 

(D)適合用來找尋未排序且資料個數不多的資料。

( )9. 下列哪一組資料,不能使用二元搜尋法(Binary search)? 

(A)rose,rosa,paul,mary,john,jane,fred,bill,anne,adam 

(B)1,10,15,30,50,55,100,123,150  (C)1,5,6,8,9,12,15,20,30,53  (D)1.43,-2,0,10.2,5.8,3.56,1.44。 技競

練習練習7-2

基礎

進階

Page 42: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

304 程式語言與設計-Visual Basic Ⅰ

( )10. 執行下列程式,印出的結果為何? 

(A)5 8 15 20 35  (B)35 20 15 8 5  (C)20 15 35 8 5  (D)16 20 5 8 35。 ≒ 統測

Dim A(5), B

A(1) = 15

A(2) = 8

A(3) = 5

A(4) = 20

A(5) = 35

For X = 4 To 1 Step -1

For Y = 1 To X

If A(Y) < A(Y + 1) Then

B = A(Y)

A(Y) = A(Y + 1)

A(Y + 1) = B

End If

Next Y

Next X

For X = 1 To 5

Debug.Print(A(X))

Next X

二、多元練習題

1. 下列哪些情況適合使用循序搜尋法來找尋資料?請在方格中勾選。

   (1) 在文化走廊的10幅畫作中,找出名為「拾穗」的作品。

   (2) 在上萬筆統測資料中,找出准考證號碼為「10123456」的考生成績。

   (3) 從50張數學考卷中,找出得分90分以上的同學。

   (4) 在依釀造年份排序的數萬瓶葡萄酒中,找出釀造年份為1965年的法國波

爾多紅葡萄酒。

Page 43: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

305第 7 章 陣列

2. 請將同學每3人分為1組,每組依照下面的說明,完成下表的內容。

(1) 資料排序:每人分別提供2個數字,數字須介於1 ~ 99之間,且不得重複;再

利用本節所介紹的任一種資料排序法,將數列由大到小排列。

(2) 資料搜尋:請老師提供6個數字(須介於1 ~ 99之間)及目標資料數字;同學

利用二元搜尋法來搜尋該數字是否存在排序完成的數列中。

資料排序 資料搜尋

原始資料:

  、  、  、  、  、  

已排序資料:

  、  、  、  、  、  

目標資料:  

利用任一種資料排序法,將數字由大到

小排列:請勾選所使用的資料排序法

□氣泡排序法   □選擇排序法

第1次排序循環:

  、  、  、  、  、  

利用二元搜尋法來搜尋數字  是否存

在於排序完成的數列中(請在每一次搜

尋的數列下方,標示L、R、M值)

第1次搜尋:

  、  、  、  、  、  

第2次排序循環:

  、  、  、  、  、  

第2次搜尋:

  、  、  、  、  、  

第3次排序循環:

  、  、  、  、  、  

第3次搜尋:

  、  、  、  、  、  

第4次排序循環:

  、  、  、  、  、  

第5次排序循環:

  、  、  、  、  、  

Page 44: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

306 程式語言與設計-Visual Basic Ⅰ

一、選擇題

( )1. 在Visual Basic中,執行陣列宣告敘述 "Dim Y( , ) = {{1, 7}, {13, 17}}",則

Y(1, 1)的值為何? (A)1 (B)7 (C)13 (D)17。

( )2. 在Visual Basic中,我們可以使用下列哪一個敘述來變更陣列元素的個數? 

(A)UBound (B)Length (C)ReDim (D)LIFO。

( )3. 在Visual Basic中,不管陣列的維度是多少,各註標的下限值預設為? 

(A)0 (B)1 (C)2 (D)3。

( )4. 在Visual Basic中,宣告一個陣列 "Dim salary(9) As Short",表示陣列salary需使用多少記憶體空間(提示:短整數型別佔用2 bytes的記憶體空間)? 

(A)18 (B)20 (C)22 (D)24。

( )5. 在3000筆已由大至小排序好的資料中,用二元搜尋法(Binary Search)搜尋某

一筆特定資料(假定資料存在),最多需要比較幾次可以搜尋到該筆資料? 

(A)12 (B)16 (C)20 (D)30。 統測

( )6. 在電影裡,被害人(或目擊證人)到警局指認室中,從數十位可疑份子中找尋出

兇嫌的方法,類似於下列哪一種搜尋方法? 

(A)循序搜尋法 (B)二元搜尋法 (C)費氏搜尋法 (D)插補搜尋法。

( )7. 對下列7筆已排序的資料(2, 13, 27, 32, 44, 58, 67),以二元搜尋法找尋關鍵

值為58的資料,總共要作幾次比較? (A)2 (B)3 (C)4 (D)6。 統測

( )8. 下列有關陣列的敘述,何者錯誤? (A)同一陣列中的元素可儲存不同資料型別

的資料 (B)一維陣列只有1個註標值 (C)陣列元素通常會依先後順序儲存在電

腦記憶體中 (D)必須使用註標值才能存取陣列元素的資料內容。

( )9. 若陣列A之宣告為Dim A(2, 3) As Integer,A之內容如下圖,則A(A(1, 2) - 1, A(2, 3) + 1)的答案為何? (A)0 (B)1 (C)2 (D)3。 ≒ 統測

綜合評量綜合評量

基礎

進階

陣列A標註 0 1 2 3

0 2 3 0 1

1 1 3 2 0

2 3 0 2 1

Page 45: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

307第 7 章 陣列

( )10. 執行程式(一)後,何者的值與B(3, 1)的值相等? 

(A)B(0, 2) (B)B(1, 1) (C)B(1, 3) (D)B(2, 1)。

Dim B (3, 3) As Integer

For I = 0 To 3

For J = 0 To 3

B(I, J) = 2 * I * J

Next J

Next I

Dim A(3, 3) As Integer

For I = 1 To 3

For J = 1 To 3

A(I, J) = A(I - 1, J - 1) + (I + J) * 2

Next J

Next I

程式(一) 程式(二)

( )11. 執行程式(二)後,A(3, 3)的值為何? (A)16 (B)24 (C)30 (D)36。 ≒ 統測

( )12. 執行下列VB程式片段後,請問A(3, 1) =? (A)4 (B)3 (C)2 (D)0。 ≒ 統測

Dim A (5, 5) As Integer Dim I , J As Integer For I = 0 to 5 For J = 0 to 5 If (I > J) Then A(I, J) = A(I - 1, J) ElseIf (I = J) Then A(I, J) = I + J Else A(I, J) = I * J End If Next J Next I

二、實作題

1. 選按『檔案/開啟專案』選項,開啟專案 "Ex7-a.sln",撰寫一支可用來測驗英文單

字能力的程式。

成果預覽:

Label1

ComboBox1

Page 46: 認識陣列 - cd.fisp.com.twcd.fisp.com.tw/05857AB/pdf_b/05857AB_ch07.pdf · 266 程式語言與設計-Visual Basic Ⅰ ⑤ 陣列宣告後,電腦會為陣列預留一塊連續的儲存空間,如下表所示:

308 程式語言與設計-Visual Basic Ⅰ

提示: (1) 在事件程序的上方,宣告變數n,用來儲存隨機產生的亂數。

(2) 宣告一維陣列Engl i sh用來儲存 "a f ra id"、"a r t "、"baske tba l l "、"beach"、"chance" 等5個英文單字;宣告一維陣列Chinese用來儲存 "害怕"、"藝術"、"籃球"、"海灘"、"機會" 等5個中文字義。

(3) 在標籤(Label1)控制項中隨機顯示一個英文單字。

(4) 利用For…Next迴圈敘述在下拉式方塊(ComboBox1)控制項中加入5個中文字義。

(5) 雙按下拉式方塊控制項,在下拉式方塊的SelectedIndexChanged事件中

撰寫程式:利用If…Then…Else敘述判斷使用者所點選的中文字義選項

是否正確。

2. 選按『檔案 /開啟專案』選項,開啟專案 "Ex7-b.sln",撰寫一支可用來查詢國、

英、數成績並計算總分及平均的程式。

成果預覽:

提示: (1) 宣告1個二維陣列(score),並依上表設定5位同學的國、英、數成績。

(2) 依使用者輸入的座號,在標籤(Label2 ~ Label4)控制項,顯示對應的

國、英、數成績,並將計算所得的總分(sum)與平均(avg)顯示於標

籤(Label5、Label6)控制項中。

科目

座號國文 英文 數學

1 89 76 90

2 88 81 76

3 79 65 68

4 92 87 82

5 83 78 69

Button1

TextBox1

Label2 ~ Label6