vb.net 視窗程式設計 - homepage.ntu.edu.twhomepage.ntu.edu.tw/~d02922022/vb/ppt/part 1/06...

Post on 21-Oct-2019

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

VB.NET 視窗程式設計 基本語法:陣列

NTU CSIE

講師:張傑帆

前言

陣列可將同性質資料集中放在連續記憶體上。

宣告一個陣列名稱score整數陣列來存放

五位同學的成績,用 score(0)~score(4) 分別代表score1~score5 五個整數變數名稱。

將score(0) ~score(4) 稱為「陣列元素」

小括號內的數字稱為 index「索引」或「註標」。

改變索引値便可存取陣列中的任何一個元素。

陣列的宣告及存取

陣列使用時機

處理多筆同性質資料,可用陣列元素取代

多個同性質的變數。

陣列先經宣告才能使用。

宣告陣列時,編譯器依宣告陣列資料型別和元素

多寡,在記憶體中保留連續位址給該陣列使用。

一維陣列

陣列的宣告

當我們使用一般變數時,必須先宣告它的型別,同樣地陣列變數也是如此,其宣告方式如下:

例如,以下敘述會建立一個下限是0,上限是5,小大為6,名稱為a的短整數型號

0 1 2 3 4 5

陣列的宣告及初值設定 一維陣列的宣告

若省略下限值,則其預設值是0。例如,以下敘述同義於上式

宣告 score為一個含有10 個陣列元素的 整數陣列:

Dim score(9) As Integer

score 陣列含有score(0) ~ score(9) 共10個陣列元素,依序存放在記憶體的連續位址中

每個陣列元素裡面存放的資料必須是整數。

可用 score(0) ~ score(9) 存放1~10 號 同學的計概成績。

索引1:0~9當座號1~10

0 1 2 3 4 5

0 1 2 3 4 5

陣列的宣告及初值設定

陣列的宣告與初值設定

宣告陣列時,也可同時設定陣列元素初值。

一維陣列初值以左右大括號框住,

資料間以逗號隔開。

陣列的個別存取

陣列可以在同一變數中儲存多個元素,所以當你在存取陣列中的某個元素時,必須指定一個索引值(index)來指向你所想要的元素;其中索引值可以是整數常數,也可以是整數變數。

所以,下述可將陣列索引0的值設定為1

•下敘可將陣列索引0的值指派給變數b

陣列的整體存取

陣列的整體存取,有二種方式,分別是For

與For Each

For語法

For Each 語法

課堂練習-Ex61-1 陣列練習:

設有資料如下: 77, 66, 99, 44, 55

請寫一個程式,以陣列儲存以上資料,並計算與輸出平均、最高分及最低分。

課堂練習- Ex61-2

線上輸入練習:

可線上輸入5位學生成績

提示:InputBox(“”,“請輸入成績”)

可用陣列儲存

可由使用者輸入學號來查詢成績

選擇排序法(Selection Sort)

使用一迴圈將最大值換到陣列最前

如果有n個數要判斷n-1個數值

5個數要判斷4次

只需交換一次

0

最大值位置(pos)

34 1 12 66 5

34 1 12 66 5

34 1 12 66 5

34 1 12 66 5

0

0

0

3

66 1 12 34 5 3

swap

j=0

j=1

j=2

j=4

Index 0 1 2 3 4

選擇排序法(Selection Sort)

再使用一迴圈連續對陣列把最大值放到第i個位置

如果有n個數要做n-1次

5個數要做4次

34 1 12 66 5

66 1 12 34 5

66 34 12 1 5

66 34 12 1 5

66 34 12 5 1

i=0

i=1

i=2

i=3

i=4

Index 0 1 2 3 4

課堂練習-Ex62

成績統計程式

設計一個程式可以:

定義一個一維陣列儲存10個學生的數學成績

50, 65, 80, 48, 35, 93, 57, 90, 86, 77

將成績由大至小印出

計算出「及格」與「不及格」的人數

二維與多維陣列

含有兩個索引值的陣列稱為二維陣列

含有兩個以上索引的陣列都稱為多維陣列

一般多維陣列最常應用的是二維陣列,下面我們就以二維陣列為例,來介紹如何使用多維陣列。

多維陣列

一維陣列 (1-Dimensional Array)

陣列宣告時只用一個索引,維度為1 的陣列 。

二維陣列(2-Dimensional Array)或矩形陣列

使用兩個索引,維度為2 的陣列。

三維陣列(3-Dimensional Array)

使用三個索引,維度為3 的陣列。

VB 可處理陣列的最大維度限 32 個。

一個陣列的陣列元素總數是所有維度的乘積。

二維陣列變數宣告

二維陣列變數宣告語法如下:

例如,以下敘述宣告一個二維的短整數型別變數

0 1 2 3 4

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

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

2 a(2,0) a(2,1) a(2,2) a(2,3) a(2,3)

二維陣列的初值設定

二維陣列亦可宣告時同時,亦給予初值。例如:

0 1 2

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

1 a(1,0)=6 a(1,1)=7 a(1,2)=5

陣列的宣告及初值設定

二維陣列的宣告

宣告score 是一個二維整數陣列,

存放10 位同學三次計概成績

Dim score ( 9, 2 ) As Integer

索引2:0~2當第1~3次計概成績

索引1:0~9當座號 1 ~ 10

0 1 2

0

1

2

3

4

5

6

7

8

9

陣列的宣告及初值設定

陣列的每個元素,可當作一個變數來運算:

1. score(0,0) 陣列元素代表座號1號同學的第1次計概成績。

2. score(1,1) 陣列元素代表座號2號同學的第2次計概成績。

3. score(2,2) 陣列元素代表座號3號同學的第3次計概成績。

4. score(9,2) 陣列元素代表座號10號同學的第3次計概成績。

【例】將第一位同學三次計概成績相加

sum = score(0,0) + score(0,1) + score(0,2)

0 1 2

0

1

2

3

4

5

6

7

8

9

若想把不同型別的資料放在一起呢?

陣列的上界

課堂練習-Ex63

計算各球員的全壘打數 (及平均)

Dim years() As Integer = {2009, 2010, 2011, 2012} '年度 Dim name() As String = {"張泰山", "林益全", "周思齊", "彭政閔", "林智勝"} '姓名 Dim bits(,) As Object = {{63, 78, 74, 96}, {113, 55, 55, 92}, {49, 56, 88, 91}, {71, 65, 55, 88}, {111, 79, 68, 85}}

參考程式碼

& 與 +串連運算子 有什麼不一樣

+ 運算子 (Visual Basic)

主要目的是將兩個數字相加。 不過,它也可以串連數值運算元與字串運算元。 + 運算子有一組複雜的規則,可判斷是要相加、串連、通知編譯器錯誤,還是擲回執行階段 InvalidCastException 例外狀況。

& 運算子 (Visual Basic)

只針對 String 運算元進行定義,且它一律會將運算元擴展成 String,不論 Option Strict 的設定為何。 建議使用 & 運算元進行字串串連,因為它的定義為專門針對字串,且能減少產生意外轉換的機會。

排序與搜尋

陣列的排序

將資料存到陣列中都是無規律性,欲查詢陣列的資料

必須從頭開始逐一往下搜尋。

此種搜尋方式放在前面資料搜尋時間比後面資料短,

導致平均搜尋時間不一致。

若在搜尋資料前,先將陣列中的元素排列整齊,可透

過較好搜尋演算法,資料不論置於前後搜尋時間

差不多。

VB 提供 Array.Sort(陣列名稱)方法,不用寫程式便可

將一維陣列內的陣列元素由小到大做遞增排序。

排序與搜尋

排序與搜尋

執行 Array.Sort (score)

只對score做排序

但分數與名字卻對不起來?

執行 Array.Sort (score, name)

但是若我的成績想由高排到低呢?

陣列的反轉

陣列由大而小做遞減排序

先用 Array.Sort() 方法由小而大做遞增排序

再用 Array.Reverse() 方法將排序過的陣列

做反轉。

清除陣列- Clear 方法

Clear 方法可以清除一維陣列指定索引的元素值,使還原為宣告型別的預設值。數字預設值為0,字串為空字串,其寫法如下:

陣列的搜尋

設計輸出入介面

放入資料 Public Class Form1 Dim pName() As String = {"麥格倫", "強納森", "林煜清", "鎌田祐哉", "迪薩猛", "林其緯", "林晨樺", "林英傑", "銳", "鄭承浩", "鄭錡鴻", "陽建福", "增菘瑋", "賴鴻誠", "摩爾", "王豐鑫", "岡薩雷茲", "狄納多", "陳逸宸", "羅政龍"} Dim score() As Single = {4.082, 2.484, 3.909, 3.151, 2.767, 5.163, 3.96, 3.434, 3.904, 4.871, 4.297, 5.651, 3.628, 5.592, 3.921, 5.077, 4.447, 4.5, 4.112, 7.534}

Form_Load()

顯示出所有投手的資料

遞增排序

到數5名

查詢

加入最佳5名

自己練習將上述綠習中加入「最佳5名」

回家作業-HW5 成績統計程式:

假定某班有5位學生,每位學生各修3門科目,請利用二維陣列的方式儲存學生的各科成績,並將每位學生的各科成績、總分及平均列印出來,並按照總分由高到低排序。

本章結束 Take a Break …..

top related