27
本章學習目標 1. 讓讀者了解一維、二維及多維陣列的結構及表示方法。 2. 讓讀者了解矩陣中常見的各種運算<轉置、相加、相乘及 稀疏矩陣> 本章內容 3-1 陣列的觀念 3-2 陣列的宣告與儲存方式 3-3 二維陣列的觀念 3-4 多維陣列的觀念 3-5 陣列在記憶體中的表示法 3-6 多項式(polynomial) 3-7 矩陣(Matrices) 3-8 特殊矩陣 本章重點整理 課後評量 陣列(Array)

陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

本章學習目標

1. 讓讀者了解一維、二維及多維陣列的結構及表示方法。

2. 讓讀者了解矩陣中常見的各種運算<轉置、相加、相乘及

稀疏矩陣>

本章內容

3-1 陣列的觀念

3-2 陣列的宣告與儲存方式

3-3 二維陣列的觀念

3-4 多維陣列的觀念

3-5 陣列在記憶體中的表示法

3-6 多項式(polynomial)

3-7 矩陣(Matrices)

3-8 特殊矩陣

本章重點整理

課後評量

陣列(Array)

Page 2: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-2

3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及資料型態的變數之集合。由於

整個陣列中的變數均具有相同的名稱, 因此若要存取陣列中的變數, 我們只

需要透過陣列的註標(索引)來指定即可。

陣列與變數的功能都是用來儲存資料,但所不同的是每一個變數只能儲存一

項資料,而陣列則是由一連串的主記憶體空間組合而成,所以可以同時連續

儲放多項資料,亦即一次可宣告很多個變數,而不用一個一個宣告。因此,

可以少寫許多行程式,並且增加程式的可讀性。

例如,我們需要 3個整數變數來存放資料時, 我們就必須要宣告成 Dim x,y ,z

as Integer,亦即利用 x, y 及 z 三個變數來存放 3 個整數。問題來了,若我們

今天需要 50 個整數變數來存放資料呢?要如何為這 50 個變數來取名,這

真是一大頭痛的問題?解決方法:利用「陣列」。

1. 佔用連續記憶體空間。

2. 用來表示有序串列之一種方式。

3. 各元素的資料型態皆相同。

4. 支援隨機存取 (Random Access)與循序存取 (Sequential

Access)。

5. 插入或刪除元素時較為麻煩,因為須挪移其他元素。

假設我們需要 10 個整數變數來存放資料時,那就必須要宣告

一個 A 陣列為整數型態,其註標是按照順序排列從 0~9 共有

10 項,其含義如下:

Dim A (9) As Integer

陣列名稱 A

陣列註標 0 1 2 9

陣列元素 A(0) A(1) A(2) A(9)

Page 3: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-3

(1) Dim A(9)表示宣告 A 陣列內共有 9+1=10 個陣列元素,也

就是有 10 個變數,分別為 A(0)、A(1)、A(2)……A(9)。

(2) 每一個陣列元素可以存放一筆資料。

(3) 陣列內容的存取,通常是以迴圈指令配合輸入或輸出指令

來進行,如下片段程式。

陣列內資料的「輸入」方式 陣列內資料的「輸出」方式

For I=0 To 9 A(I)=Val(InputBox("請輸入一個數字"))

Next I

For I=0 To 9 MsgBox(A(I)) Next I

(4) 陣列所存放的每個資料叫做元素,若一個陣列中元素的個

數為n時,表示此陣列的長度為n,然後透過「陣列」與

「註標」可以用來區分每個元素,註標是以一個數字表示,

註標 0 是代表陣列的第一個元素,註標 1 代表陣列的第二

個元素,......,以此類推,則陣列的第 n 個元素則以註標

n-1 代表。例如在上表中,第 2 個元素 A(1),其註標為 1。

3-2 陣列的宣告與儲存方式 陣列宣告的方式和一般變數的宣告大同小異,所不同的是,在陣列名稱後,

必須要再加上陣列註標(索引)值大小,以便 VB2008 向系統爭取預留足夠的

主記憶體空間。

3-2.1 陣列的宣告 Dim 陣列名稱(陣列大小) As 資料型態

(1) 「陣列名稱」的命名規則和一般變數相同。

(2) 「陣列大小」必須是一數字型態。

Page 4: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-4

變數宣告與陣列宣告的差異

(1) 變數宣告

宣告三個變數(A,B,C)為整數型態,如圖 3-1 所示:

Dim A, B, C As Integer

圖 3-1 不連續的記憶體空間的配置

以上三個變數只能各儲存一項資料,並且變數與變數之間

都是個別獨立的記憶體空間。

(2) 陣列宣告

宣告一個 A(2)的陣列,如下所示:

DIM A(2) AS Integer ' 宣告一維陣列 A,共有 A(0)、A(1)、

A(2)三個元素。

此時,主記憶體就會即時配置 3 個位置,如圖 3-2 所示:

A陣列

A(0) A(1) A(2)

圖 3-2 連續的記憶體空間的配置

以上所配置位置是連續的記憶體空置,可以讓我們連續儲

存的多項資料,並且資料與資料之間都是按照順序排列的

記憶體空間。

Page 5: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-5

使用陣列的優點如下:

(1) 利用索引值(Index)可以快速的存取資料。

(2) 一次可以處理大批的資料。

(3) 較容易表達資料處理的技巧。

3-2.2 陣列的儲存方式

當宣告完成一個陣列名稱之後便可以開始儲存資料,其方法則直接在陣列名

稱之後加上“註標或索引值”即可。

宣告一個 A(2)的陣列,並分別儲存 10,20,30,如下所示: DIM A(2) AS Integer A(0)=10 ' 指把10指定給A陣列中的第0項的資料中

A(1)=20 A(2)=30

A陣列 10 20 30

A(0) A(1) A(2)

陣列比變數來得有彈性,因為陣列可以利用註標,而註標可以

是變數陣列中的註標可分為三個型式,如下所示:

(1) 當註標是「變數」時:變數 x=1 時,則 A(x)=20

(2) 當註標是「運算式」時:運算式 x*2 時,則 A(x*2)=30

(3) 當註標是「陣列元素」時:陣列 B(0)=1,則 A(B(0))=20

如果想要記錄六位學生的成績,原來方法必需要使用六個不同

變數名稱來存放成績,由於這些成績都是屬於同性質的資料,

就可以宣告一個陣列名稱為 A 的整數陣列,共含有六個陣列

元素,其寫法: Dim A(5) As Integer

Page 6: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-6

接下來,請依序輸入六位同學的成績到陣列中,並計算及輸出「總和」。

第一種寫法:

題目:使用陣列,但未使用 for 迴圈演算法 程式檔案名稱 ch3_2_2a.sln

01 02 03 04 05 06 07 08 09 10 11

Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click '宣告及初值設定

Dim A() As Integer = {60, 70, 80, 85, 90, 100} Dim sum As Integer = 0 '處理

sum = A(0) + A(1) + A(2) + A(3) + A(4) + A(5) '輸出 MsgBox("總和為:" & sum)

End Sub End Class

第二種寫法:(最佳)

題目:使用陣列,並使用 for 迴圈演算法 程式檔案名稱 ch3_2_2b.sln

01 02 03 04 05 06 07 08 09 10 11 12 13

Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click '宣告及初值設定

Dim A() As Integer = {60, 70, 80, 85, 90, 100} Dim i = 0, sum As Integer = 0 '處理

For i = 0 To 5 sum += A(i) 使用陣列與廻圈 Next '輸出 MsgBox("總和為:" & sum)

End Sub End Class

Page 7: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-7

承上一題實例,請依序輸入六位同學的成績到陣列中,並計算及輸出「總

分」及「平均成績」。

題目:計算及輸出「總分」及「平均成績」 程式檔案名稱 ch3_2_2c.sln

01 02 03 04 05 06 07 08 09 10 11 12 13 14

Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click '宣告及初值設定

Dim A() As Integer = {60, 70, 80, 85, 90, 100} Dim i = 0, sum As Integer = 0 '處理

For i = 0 To 5 sum += A(i) Next '輸出 MsgBox("總和為:" & sum) MsgBox("平均成績為:" & Int(sum / 6))

End Sub End Class

3-2.3 使用陣列的注意事項

雖然陣列比變數來得有彈性,但是,也要注意以下事項:

1. 不能夠一次讀取或指定整個陣列的資料。

現在寫一個程式,利用 A 陣列來存放數字 10。

(1) 直覺想法:以下的方法是錯誤 Dim A(50) As Integer A=10; 不能直接指定給陣列

原因:想把整個陣列的資料都指定為 10 時,電腦會產生錯誤 Error。

(2) 正確方法:可把程式改為如下:

Page 8: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-8

題目:指定整個陣列的資料 程式檔案名稱 ch3_2_3.sln

01 02 03 04 05 06 07 08 09 10

Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click Dim i As Integer Dim A(10) As Integer For i = 0 To 10 A(i) = 10 MsgBox("陣列A的第" & i & "個註標之元素為:" & A(i))

Next i End Sub End Class

2. 在使用多維陣列時,最多不可以超過 60 維陣列。

3. 用來指定某一項資料的註標不能超過陣列的註標範圍。

例如:Dim A(50) '宣告一個陣列 A 其註標是從 0~50

A(-1)=100 '註標是 –1,超出陣列 A 的範圍

A(51)=100 '註標是 51,超出陣列 A 的範圍

3-2.4 陣列的初值設定 有學過 VB6.0 的學習者都知道,它並無法提供我們在宣告陣列的同時並指

定初值,而 VB2008 就可以解決此問題,如此可以縮短程式的長度。其方法

只要在資料型別後面,使用等號(=)接大括號,將初值寫在括號內,初值間

以逗號隔開即可。其語法如下:

Dim 陣列名稱() As 資料型別 ={陣列初值串列}

(1) 宣告 A 是一個含有 5 個整數的陣列,其中初值為:A(0)=1 :

A(1)=2 : A(2)=3 :A(3)=4 : A(4)=5,其寫法如下:

Dim A( ) As Integer = {1,2,3,4,5}

(2) 宣告一個 A(2,2)的二維整數陣列,其初值分別為: A(0,0)=1 : A(0,1)=2 : A(0,2)=3 A(1,0)=4 : A(1,1)=5 : A(1,2)=6 A(2,0)=7 : A(2,1)=8 : A(2,2)=9

其寫法如下: Dim A(,) As Integer={{1,2,3},{4,5,6},{7,8,9}}

必須利用迴圈來控制,使數值

10 逐一的存到陣列中

Page 9: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-9

宣告陣列時明確指定陣列大小,此時不允許在宣告陣列的同時

設定初值。下面例 2 為錯誤的寫法。

例 1. Dim A( ) As Integer={1,2,3,4,5} '正確

例 2. Dim A(4) As Integer={1,2,3,4,5} '錯誤

3-3 二維陣列的觀念 在前面所介紹一維陣列,可以視為直線方式來存取資料,這對於一般的問題

都可以順利的處理,但是對於比較複雜的問題時,那就必須要使用二維陣列

來處理。否則會增加程式的複雜度。例如:計算 4 位同學的 5 科成績之總分

與平均的問題。

Dim 陣列名稱 (M,N) AS 資料型態

M 代表列數,N 代表行數

Dim A(3,4) As Integer

' 列註標表示範圍: 0~3 共有 4 列

' 行註標表示範圍: 0~4 共有 5 行

在宣告之後,主記憶的邏輯配置如圖 3-3 所示:

列 第 0 行 第 1 行 第 2 行 第 3 行 第 4 行

第 0 列 Score (0,0) Score (0,1) Score (0,2) Score (0,3) Score (0,4)

第 1 列 Score (1,0) Score (1,1) Score (1,2) Score (1,3) Score (1,4)

第 2 列 Score (2,0) Score (2,1) Score (2,2) Score (2,3) Score (2,4)

第 3 列 Score (3,0) Score (3,1) Score (3,2) Score (3,3) Score (3,4)

圖 3-3 二維陣列的邏輯配置

Page 10: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-10

利用二維陣列中的兩個註標來表示。

假設老師平時記錄了學生的考試成績,並記錄在二維表格中,

如下所示:

姓名 國文 英文 數學 資料庫 程式設計

張三 65 85 78 75 69

李四 66 55 52 92 47

王五 75 99 63 73 86

雄雄 77 88 99 91 100

問題一:請利用二維陣列的方式來求出「雄雄」同學的五科成績的總分與平

均成績。

題目:計算五科成績的總分與平均成績 程式檔案名稱 ch3_3a.sln

01 02 03 04 05 06 07 08 09 10 11 12 13 14

Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click '宣告及初值設定

Dim Total, Aver As Integer Dim Score(,) As Integer = {{65, 85, 78, 75, 69}, {66, 55, 52, 92, 47}, {75, 99, 63, 73, 86}, {77, 88, 99, 91, 100}} '處理(算出總合)

Total = Score(3, 0) + Score(3, 1) + Score(3, 2) + Score(3, 3) + Score(3, 4)

Aver = Total / 5 '算出平均 '輸出 MsgBox("總和=" & Total) MsgBox("平均=" & Aver)

End Sub End Class

Page 11: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-11

問題二:請利用二維陣列的方式來計算出「每一科目」的平均分數。

For i = 0 To 3 '控制列數 For j = 0 To 4 '控制行數 Subject_Sum(j) = Subject_Sum(j) + Score(i, j)'計算出每一科目的總分數

Next j Next i For j = 0 To 4 Subject_Average(j) = Subject_Sum(j) / 4 '計算出每一科目的平均分數

Next i

問題三:請利用二維陣列的方式來計算出「每一位學生」平均成績。

For i = 0 To 3 '控制列數 For j = 0 To 4 '控制行數 Stu_Sum(i) = Stu_Sum(i) + Score(i, j) '計算出每一位同學的總成績

Next j Next i For i = 0 To 3 Stu_Average(i) = Stu_Sum(i) / 5 '計算出每一位同學的平均成績

Next i

問題四:綜合問題二與問題三,列出那來同學的「程式設計」科目的成績低

於該科目的平均成績。

題目:二維陣列的應用 程式檔案名稱 ch3_3b.sln

01 02 03 04 05 06 07 08 09 10 11 12 13 14

Public Class Form1 Dim i, j As Integer Dim Temp As String = "" Dim Stu_Sum(3) As Integer '學生總成績 Dim Stu_Average(3) As Integer '學生平均成績 Dim Subject_Sum(4) As Integer '科目總成績 Dim Subjcet_Average(4) As Integer '科目平均成績 Dim Stu_Name() As String = {"張三", "李四", "王五", "雄雄"}

Dim Score(,) As Integer = {{65, 85, 78, 75, 69}, {66, 55, 52, 92, 47}, {75, 99, 63, 73, 86}, {77, 88, 99, 91, 100}}

Private Sub Button1_Click(……) Handles Button1.Click ' ======= 讀取資料並計算各科總分====== For i = 0 To 3 '控制列數 For j = 0 To 4 '控制行數 Stu_Sum(i) = Stu_Sum(i) + Score(i, j)'計算出每一位「同學」

Page 12: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-12

題目:二維陣列的應用 程式檔案名稱 ch3_3b.sln

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

的總成績 Subject_Sum(j) = Subject_Sum(j) + Score(i, j)'計算出每

一「科目」的總成績

Next j Next i '========= 印出開頭======== Temp = "姓名 國文 英文 數學 計概 程設" & vbNewLine

Temp = Temp & "======================================== & vbNewLine

' ======== 印出成績單======= For i = 0 To 3 '控制列數

Temp = Temp & Stu_Name(i) For j = 0 To 4 '控制行數

Temp = Temp & " " & Score(i, j) Next j Temp = Temp & vbNewLine Next i Label1.Text = Temp End Sub Private Sub Button2_Click(……) Handles Button2.Click '問題一

Dim Total, Aver As Integer Total = Score(3, 0) + Score(3, 1) + Score(3, 2) + Score(3, 3)

+ Score(3, 4) Aver = Total / 5 '算出平均 Label4.Text = "總分=" & Total & vbNewLine & "平均=" & Aver

End Sub Private Sub Button3_Click(……) Handles Button3.Click '問題二 ' ======== 印出學科平均成績======= Label2.Text = "學科平均" For j = 0 To 4 '控制行數 Subjcet_Average(j) = Subject_Sum(j) / 4 '計算出每一科目的

平均分數

Label2.Text = Label2.Text & " " & Subjcet_Average(j) Next j End Sub Private Sub Button4_Click(……) Handles Button4.Click '問題三 ' ======== 印出學生平均成績======= Label3.Text = "學生成績" & vbNewLine & vbNewLine For i = 0 To 3 '控制列數

Page 13: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-13

題目:二維陣列的應用 程式檔案名稱 ch3_3b.sln

56 57 58 59 60 61 62 63 64 65 66 67 68 69

Stu_Average(i) = Stu_Sum(i) / 5 '計算出每一位同學的平均成績

Label3.Text = Label3.Text & Stu_Average(i) & vbNewLine Next i End Sub Private Sub Button5_Click(……) Handles Button5.Click '問題四 Label5.Text = "程設低於平均:" & vbNewLine For i = 0 To 3 '控制列數

If (Score(i, 4) < Subjcet_Average(4)) Then Label5.Text = Label5.Text & Stu_Name(i) & vbNewLine End If Next i End Sub End Class

Page 14: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-14

月考次數

學生人數

科目數

3-4 多維陣列的觀念 當陣列的維度是二維以上時,就稱為多維陣列。而其中最常見是三維陣列,

其圖形為三度空間的立體圖形,並且我們可以將三維陣列視為多個二維陣列

的組合。

Dim 陣列名稱 (L,M,N) As 資料型態

L 代表二維陣列個數

M 代表列數

N 代表行數

Dim Score (2,3,4) As Integer

' 二維陣列的個數: 0~2 共有 3 個二維陣列

' 列註標表示範圍: 0~3 共有 4 列

' 行註標表示範圍: 0~4 共有 5 行

設計一個某高中,3 次月考,全班 4 位同學的 5 個科目成績。

利用三維陣列來存取每位學生的成績。 Dim Score(2 , 3 , 4) As Integer

此例子中 Score 陣列共有三個註標,故 Score 陣列是一個三

維陣列。宣告 Score 是由 3 個(0~2)二維陣列,每個二維陣列

包含 4 列(0~3),5 行(0~4)組合而成的整數三維陣列。並且共

計有 3×4×5=60 元素。如圖 3-4 所示:

Page 15: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-15

圖 3-4 三維陣列的邏輯配置

假設老師利用二維表格,來記錄學生的三次月考成績,如下

所示:

第一次月考成績單

姓名 國文 英文 數學 資料庫 程式設計

張三 65 85 78 75 69

李四 66 55 52 92 47

王五 75 99 63 73 86

雄雄 77 88 99 91 99

第二次月考成績單

姓名 國文 英文 數學 資料庫 程式設計

張三 77 88 66 77 66

李四 65 66 88 55 77

王五 70 88 56 88 88

雄雄 80 90 95 99 99

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

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

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

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

Score(0,0,0)

Score(1,0,0)

Score(2,0,0)

Page 16: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-16

第三次月考成績單

姓名 國文 英文 數學 資料庫 程式設計

張三 55 67 56 98 67

李四 66 69 76 66 78

王五 77 89 88 77 77

雄雄 88 89 99 97 88

題目:三維陣列的應用 程式檔案名稱 ch3_4.sln

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Public Class Form1 Dim i, j, k As Integer Dim Temp As String = "" Dim Stu_Sum(2, 4) As Integer '學生總成績 Dim Stu_Average(2, 4) As Integer '學生平均成績 Dim Subject_Sum(2, 4) As Integer '科目總成績 Dim Subjcet_Average(2, 4) As Integer '科目平均成績 Dim Stu_Name() As String = {"張三", "李四", "王五", "雄雄"} Dim Score(,,) As Integer = {{{65, 85, 78, 75, 69}, {66, 55, 52, 92, 47}, {75, 99, 63, 73, 86}, {77, 88, 99, 91, 99}}, {{77, 88, 66, 77, 66}, {65, 66, 88, 55, 77}, {70, 88, 56, 88, 88}, {80, 90, 95, 99, 99}}, {{55, 67, 56, 98, 67}, {66, 69, 76, 66, 78}, {77, 89, 88, 77, 77}, {88, 89, 99, 97, 88}}} Private Sub Button1_Click(……) Handles Button1.Click ' ======= 讀取資料並計算各科總分====== For k = 0 To 2 '3次月考 For i = 0 To 3 '控制列數 For j = 0 To 4 '控制行數 '計算出每一位「同學」的總成績 Stu_Sum(k, i) = Stu_Sum(k, i) + Score(k, i, j)

'計算出每一「科目」的總成績 Subject_Sum(k, j) = Subject_Sum(k, j) + Score(k, i, j) Next j Next i Next k '========= 印出開頭======== For k = 0 To 2 '3次月考 Temp = Temp & "=========第" & (k + 1) & "次月考成績如下:========" &

vbNewLine Temp = Temp & "姓名 國文 英文 數學 計概 程設" & vbNewLine Temp = Temp & "===================================" &

vbNewLine ' ======== 印出成績單======= For i = 0 To 3 '控制列數

Page 17: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-17

題目:三維陣列的應用 程式檔案名稱 ch3_4.sln

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Temp = Temp & Stu_Name(i) For j = 0 To 4 '控制行數 Temp = Temp & " " & Score(k, i, j) Next j Temp = Temp & vbNewLine Next i Temp = Temp & vbNewLine Temp = Temp & vbNewLine Temp = Temp & vbNewLine Label1.Text = Temp Next k End Sub Private Sub Button2_Click(……) Handles Button2.Click ' ======== 印出學科平均成績======= Label2.Text = "學科平均" Label4.Text = "學科平均" Label6.Text = "學科平均" For k = 0 To 2 '3次月考 For j = 0 To 4 '控制行數 ('計算出每一科目的平均分數) Subjcet_Average(k, j) = Subject_Sum(k, j) / 4 Next j Next k For j = 0 To 4 '控制行數 Label2.Text = Label2.Text & " " & Subjcet_Average(0, j) Label4.Text = Label4.Text & " " & Subjcet_Average(1, j) Label6.Text = Label6.Text & " " & Subjcet_Average(2, j) Next j End Sub Private Sub Button3_Click(……) Handles Button3.Click ' ======== 印出學生平均成績======= Label3.Text = "學生成績" & vbNewLine & vbNewLine Label5.Text = "學生成績" & vbNewLine & vbNewLine Label7.Text = "學生成績" & vbNewLine & vbNewLine For k = 0 To 2 For i = 0 To 3 '計算出每一位同學的平均成績 Stu_Average(k, i) = Stu_Sum(k, i) / 5 Next i Next k For i = 0 To 3 Label3.Text = Label3.Text & Stu_Average(0, i) & vbNewLine Label5.Text = Label5.Text & Stu_Average(1, i) & vbNewLine Label7.Text = Label7.Text & Stu_Average(2, i) & vbNewLine Next i End Sub End Class

Page 18: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-18

3-5 陣列在記憶體中的表示法 陣列是由一連串的記憶體組合而成,其陣列元素之儲存位址計算,如下所示:

一、一維陣列

(1) 若陣列 A 有 N 個元素,其陣列的起始位址為 Lo,並且索引值從

0 開始,d 為元素大小,則 A[i]的起始位置為多少?

以 VB2008 宣告方式:Dim A(N) As Integer

0 1 2 …… i N-1

d d

Lo Lo+2d Lo+i*d

令: Lo 為起始位址

d 為元素大小

則 A[i]之位置計算=Lo+i*d

Page 19: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-19

假設每一個整數佔用 2 個 byte,若 A 陣列的起始位址是 100

開始,則

A[5]的起始位址為多少?

令: Lo=100

d=2

則 A[5]=100+5*2=100+10=110

(2) 若陣列 A 的索引從 L 到 U,其陣列的起始位址為 Lo,d 為元素

大小,則 A[i]的起始位置為多少?

宣告方式:A[L…U]

L L+1 L+ 2 …… i U

d d

Lo Lo+2d Lo+(i-L)*d

令: Lo 為起始位址

d 為元素大小

則 A[i]之位置計算=Lo+(i-L)*d

假設每一個整數佔用 2 個 byte,若 A[10]起始位址是 200 開

始,則

A[20]的位址為多少?

令: Lo=200

d=2

則 A[20]=200+(20-10)*2=200+10*2=220

Page 20: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-20

二、二維陣列

宣告方式:A[0…M-1, 0…N-1]

其中:M 代表列數(Row),橫向。

N 代表行數(Column),縱向。

所以,共有 M*N 格。

0 1 2 3 4 …… N-2 N-1

0

1

2 △

M-2

M-1

說明:圖的儲存位置:A[1,4]

△圖的儲存位置:A[2,1]

圖的儲存位置:A[M-1,N-2]

3-5.1 Row-major(以列為主)

在二維陣列中,如何將二維陣列轉成一維陣列,一般而言,有兩種方式:「以

列(Row)為主」或「以行(Column)為主」。但 VB2008 語言的記憶體

配置方式都是以列為主。

一、以列為主(Row-major)方式:

以列為主的二維陣列要轉為一維陣列時,是將二維陣列「由上往下」一

列一列讀入一維陣列,亦即將二維陣列儲存的邏輯位置轉換成實際電腦

中主記憶體的存儲方式。如下圖所示:

Page 21: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-21

0 1 2 …… N-1 主記憶體

0 A[0,0]

1 A[0,1]

2 …

3 A[0,N-1]

… A[1,0]

… A[1,1]

M-1 A[M-1,N-1]

(邏輯位置) (實體位置)

二、以列為主的儲存公式:

令 Lo 為起始位址

d 為元素大小

則 A[i,j]的位置=Lo+[i*N+j]*d

0 1 2 …… N-1

0 1

2

3 ▲

A[i,j]

… j 行

… …

M-11

▲的位置為:A[3,2]=Lo+[3*N+2]*d=Lo+(3N+2)*d

因此,當 Lo=1, N=10,d=1 時,則 A[3,2]=1+(3*10+2)*1=33

1. 宣告方式 A[L1…U1, L2…U2]

其:列數為U1-L1+1

行數為U2-L2+1

i 列

Page 22: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-22

2. 以列為主的儲存公式:

A[i,j]的位置=Lo+[(i-L1)*( U2-L2+1)+(j-L2)]*d

檔案在附書光碟中。

以列為主(Row-major) 以行為主(Column-major)

請將下列的二維陣列轉換成一維陣列(以列為主)。

0 1 2 3 4

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

0

1

2

Page 23: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-23

題目:二維矩陣轉一維矩陣(以列為主) 程式檔案名稱 ch3_5_1.sln

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

Public Class Form1 Dim N As Integer = 3 '列數 Dim M As Integer = 5 '行數

Dim Array_Data1(,) As Integer = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}} Dim Array_Data2(N * M) As Integer Dim Temp1 As String = "" Dim Temp2 As String = "" Dim row, column, i As Integer Private Sub Form1_Load(……) Handles MyBase.Load Temp1 = Temp1 & "二維資料之原始資料:" & vbNewLine

For row = 0 To N - 1 For column = 0 To M - 1 If (Array_Data1(row, column) >= 10) Then Temp1 = Temp1 & Array_Data1(row, column) & " " Else Temp1 = Temp1 & Array_Data1(row, column) & " " End If Next column Temp1 = Temp1 & vbNewLine Next row Label1.Text = Temp1 End Sub End Class Private Sub Button1_Click(……) Handles Button1.Click Temp2 = Temp2 & "以列為主:" & vbNewLine

For row = 0 To N - 1 For column = 0 To M - 1 i = column + row * M Array_Data2(i) = Array_Data1(row, column) & " " Next column Next row For i = 0 To N * M - 1 Temp2 = Temp2 & Array_Data2(i) & " " Next i Label2.Text = Temp2 End Sub

Page 24: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-24

3-5.2 Column-major(以行為主)

一、以行為主(Column-major)方式:

以行為主的二維陣列要轉為一維陣列時,是將二維陣列「由左往右」

一行一行讀入一維陣列,亦即將二維陣列儲存的邏輯位置轉換成實

際電腦中主記憶體的存儲方式。如下圖所示:

0 1 2 …… N-1 主記憶體

0 A[0,0]

1 A[1,0]

2

3 A[M-1,0]

… A[0,1]

… A[1,1]

M-1 A[M-1,N-1]

(邏輯位置) (實體位置)

二、以行為主的儲存公式:

令 Lo 為起始位址

d 為元素大小

則 A[i,j]的位置=Lo+[j*M+i]*d

0 1 2 …… N-1

0 1 i 列

2

3 ▲

A[i,j]

… …

M-1

j 行

Page 25: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-25

▲的位置為:A[3,2]=Lo+[2*M+3]*d

因此,當 Lo=1, M=10,d=1 時,則 A[3,2]=1+(2*10+3)*1=24

宣告方式 A[L1…U1, L2…U2]

其:列數為U1-L1+1

行數為U2-L2+1

以行為主的儲存公式:

A[i,j]的位置=Lo+[(j-L2)*( U1-L1+1)+(i-L1)]*d

請將下列的二維陣列轉換成一維陣列(以行為主)。

0 1 2 3 4

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

0

1

2

Page 26: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

3-58

0B一、基本題《題庫來源:研究所及高普考》

1. 請詳細定義「陣列」的意義及優點?並說明使用「一般變數」與「陣列

變數」的差異?

2. 有一整數陣列 int A[50]; (假設 sizeof(int)=2)

(1)此陣列共佔多少位元組?

(2)若 A[0]在記憶體中的位址為 03C416,則元素 A[21] 的位址為何?

(3)若 A[31]在記憶體中的位址為 10E916,元素 A[40] 的位址為何?

3. 有一 4×3 陣列[Aij],其中 1≦i≦4, 1≦j≦3,若採取以列為主(row-major)的連續記憶體儲存方式,則元素 A32 應儲存記憶體中的位址為何?(假設 A11 的記憶體位址在 A 的位址)

4. 請將下列的稀疏矩陣儲存到二維陣列中。

0 0 0 0 5

0 -1 0 0 0

1 0 3 0 0

0 0 0 0 0

0 2 4 0 0

0 0 0 0 0

5. 在程式語言中如果我們使用二維陣列來處理資料,但是,如何將資料內

容儲存到主記憶體中的一維陣列?請詳細說明兩種方法。

6. 假設有一個(2×3)矩陣 A,請將它轉置為(3×2)的 B 矩陣。其矩陣 A 的

內容如下:

32161514131211

×

=

    

    A

7. 假設 A,B 都是(2×3)矩陣,請將 A 矩陣加上 B 矩陣以得到一個(2×3)的C 矩陣。其矩陣 A,B 的內容如下:

32161514131211

×

=

    

    A

32262524232221

×

=

    

    B

Page 27: 陣列(Array) - epaper.gotop.com.twepaper.gotop.com.tw/pdf/AEE032432.pdf · 3-2 3-1 陣列的觀念 何謂陣列呢?陣列是指一群具有相同名稱及 資料型態的變數之集合。由於

陣列(Array)

3-59

二、進階題

1. 假設 A 為(2 × 3)矩陣,而 B 為(3 × 3)矩陣,請將 A 矩陣乘上 B 矩陣以

得到一個(2 × 3)的 C 矩陣。其矩陣 A,B 的內容如下:

32654321

×

=

    

    A

33100110111

×

=

    

    

    

B

2. 設假有一個下三角矩陣(Lower-Triangular Matrix),B 是一個 m × n 的

陣列,其中 B(i,j)=0, i<j。

(1) 求 B 陣列中非 0 元素的最大個數。

(2) 如何將 B 陣列以最經濟的方式儲存在記憶體中。

3. 若為一下半部三角矩陣,即 A[i,j]=aij,假如 i≧j;反之 A[i,j]=0,其中

aij≠0 ,1≦i≦N,1≦j≦N,且 N>1。假設矩陣中的每一個非零元素皆以

一個位置來儲存,而 A[i,j]=0 元素不儲存,同時假設矩陣是以列為主的

方式儲存在一連續記憶體。若 A[1,1]儲存在 1000 處,且 A[2,2]儲存在

1002 處,則 A[i,j]應存在那裡?

4. 在一個二維的方形矩陣中,當主對角線以上的元素均為零時,稱為

lower-triangular matrix。若欲將 A 中非零元素對映到一個一維陣列中,

請問:

(1) B 陣列的大小為何?

(2) 試求出一個位址計算公式將 A(i,j)對映到 B(k)中,分別以列為主和

以行為主兩種方式。 (3) 矩陣 A 中之零項元素 A(i,j)中的 i 與 j 有何關係? (4) 試寫一個 Algorithm 將二維矩陣 A 中的元素(非零項)儲存到一維矩

陣 B 中。 (5) 試寫一個 Algorithm 從 B 陣列中取出 A(i,j)。

5. 一個陣列(Array)以列為主的順序存放在記憶體中,每個陣列佔用四個單

位的記憶體。若起始位置是 100,下列宣告中所列元素存放位置為何?

Var A:array[-100…1, 1...100],求 A[1,12]的位址?

Var A:array[5…10, -10...20],求 A[5,-5]的位址?