數(shù)組及應(yīng)用
當(dāng)需要處理的數(shù)據(jù)具有同一性質(zhì)并且數(shù)據(jù)量大時,例如要記錄一個班的30名同學(xué)的成績;要做一個上千人的職工信息表;輸入100個數(shù),然后排序,等等,如果用變量存儲數(shù)據(jù)會很不方便,這時用數(shù)組實(shí)現(xiàn)比較方便。數(shù)組是在基本數(shù)據(jù)類型的基礎(chǔ)上擴(kuò)展的數(shù)據(jù)類型,對于構(gòu)思比較復(fù)雜的解題思路是非常有幫助的。數(shù)組是編程語言數(shù)據(jù)類型中重要的數(shù)據(jù)結(jié)構(gòu)。數(shù)組與循環(huán)結(jié)構(gòu)結(jié)合使用可以有效地處理大批量具有相同類型的數(shù)據(jù),解決用簡單變量無法(或困難)實(shí)現(xiàn)的問題。
5.1數(shù)組概述
1.?dāng)?shù)組的定義
數(shù)組是一組具有相同數(shù)據(jù)類型的變量的集合。每個數(shù)組都有一個名字,數(shù)組名代表邏輯上相關(guān)的一批數(shù)據(jù),數(shù)組中元素的個數(shù)稱為數(shù)組的長度(大小)。數(shù)組在內(nèi)存中被分配連續(xù)的存儲單元,每個存儲單元代表數(shù)組中的數(shù)據(jù),數(shù)組中的每一個數(shù)據(jù)稱為數(shù)組元素,用數(shù)組名和該數(shù)據(jù)在數(shù)組中的序號來標(biāo)識。序號又稱為下標(biāo),數(shù)組元素又稱為下標(biāo)變量。數(shù)組元素由數(shù)組名、一對括號和下標(biāo)來表示,數(shù)組元素可以像普通變量一樣使用。利用數(shù)組可以簡化程序,提高編程效率。
2.?dāng)?shù)組的特點(diǎn)
(1)數(shù)組能保存多個值。
(2)數(shù)組是相同數(shù)據(jù)類型的元素的集合。
(3)數(shù)組可以與循環(huán)語句配合使用,實(shí)現(xiàn)復(fù)雜的運(yùn)算。
(4)數(shù)組元素用整個數(shù)組的名字和它自己在數(shù)組中的順序位置來表示。例如,a[0]表示名字為a的數(shù)組中的第一個元素,a[1]代表數(shù)組a的第二個元素,依此類推。
(5)數(shù)組常用來表示與一維、二維、三維空間分布相關(guān)的數(shù)據(jù)。一維數(shù)組相當(dāng)于數(shù)學(xué)中的數(shù)列,二維數(shù)組相當(dāng)于數(shù)學(xué)中的矩陣。
(6)動態(tài)數(shù)組可以根據(jù)需要開辟內(nèi)存空間,優(yōu)化程序,提高效率。
(7)數(shù)組還可以用作過程或函數(shù)的參數(shù)或返回值,可傳遞或返回大量的值。
(8)數(shù)組中的各元素是有先后順序的。
3.?dāng)?shù)組的分類
在VisualBasic中,數(shù)組一般可以從以下幾個角度進(jìn)行分類。
(1)按數(shù)組所占存儲空間的不同分類。
①靜態(tài)數(shù)組:聲明時確定了大小的數(shù)組,所占的內(nèi)存空間是固定不變的。
②動態(tài)數(shù)組:聲明時沒有給定數(shù)組大小,所占的內(nèi)存空間是可變的。
(2)按數(shù)組的維數(shù)分類。
①一維數(shù)組:數(shù)組中的元素只有一個下標(biāo)。
②二維數(shù)組:數(shù)組中的元素有兩個下標(biāo)。
③多維數(shù)組:數(shù)組中的元素具有多個下標(biāo)。
(3)按數(shù)組的元素的數(shù)據(jù)類型分類。
①數(shù)值型數(shù)組:數(shù)組元素是Integer、Long、Single等類型的變量。
②字符串?dāng)?shù)組:數(shù)組元素是String類型的變量。
③日期型數(shù)組:數(shù)組元素是Date類型的變量。
④變體數(shù)組:數(shù)組元素是Variant類型的變量。
⑤自定義數(shù)組:數(shù)組元素是自定義類型的變量。
(4)按數(shù)組的功能分類。
①變量數(shù)組:數(shù)組元素都是同類型的變量。
②控件數(shù)組:數(shù)組元素都是同類型的對象。
在VisualBasic中數(shù)組沒有隱式聲明,所有使用的數(shù)組必須先聲明,后引用。數(shù)組的聲明包括聲明數(shù)組名、數(shù)組的維數(shù)及數(shù)據(jù)類型。
5.2靜態(tài)數(shù)組
靜態(tài)數(shù)組是指程序在運(yùn)行時數(shù)組元素的個數(shù)不變,所占有的分配空間也保持不變的數(shù)組。靜態(tài)數(shù)組在聲明時就已確定大小。靜態(tài)數(shù)組分為一維數(shù)組、二維數(shù)組和多維數(shù)組。
5.2.1一維數(shù)組
1.一維數(shù)組的聲明
只有一個下標(biāo)的數(shù)組稱為一維數(shù)組。其聲明格式如下:
Public|Private|Dim|Static數(shù)組名(<下標(biāo)>)[As<類型>]
說明:
(1)Public:用于建立公用數(shù)組,在模塊的聲明段用Public聲明數(shù)組,此類數(shù)組可在多個模塊中被調(diào)用。
(2)Private與Dim:都可用于建立模塊級數(shù)組或局部數(shù)組。
(3)Static:只能用于建立局部數(shù)組,在過程內(nèi)部使用。
(4)數(shù)組名:與變量的命名規(guī)則相同,遵循標(biāo)識符命名規(guī)則。數(shù)組的作用域和變量的作用域相同。
(5)下標(biāo):用來指定數(shù)組元素的個數(shù)(數(shù)組的長度),它是整型常量,不能是變量。
下標(biāo)形式為“[下界To]上界”,當(dāng)省略下界時,其默認(rèn)值為0。
數(shù)組大小為“上界-下界+1”。
(6)As<類型>:指定數(shù)組(元素)類型,可以是VB語言支持的數(shù)據(jù)類型,如果省略則定義為變體類型,數(shù)組可以存儲任意類型的數(shù)據(jù)。
例如:
Dima(1To3)AsInteger,b(4)AsInteger
Dimc(-2To2)
Dims(5)AsString*8
第一條語句定義了兩個整型數(shù)組a和b,a數(shù)組的長度為3(含3個元素),元素為a(1)、a(2)、a(3),b數(shù)組的長度為5(含5個元素),元素為b(0)、b(1)、b(2)、b(3)、b(4),兩個數(shù)組的元素均為整型。
這里以b數(shù)組為例,系統(tǒng)在內(nèi)存中為b數(shù)組分配5個連續(xù)的存儲單元,每個存儲單元占兩個字節(jié),如圖5.1所示。
圖5.1數(shù)組b(4)的存儲單元
第二條語句定義了類型為Variant的c數(shù)組,其長度為5,元素為c(-2)、c(-1)、c(0)、c(1)、c(2),數(shù)組的元素均為Variant型。
第三條語句定義了字符串類型的s數(shù)組,有6個元素,每個元素最多存放8個字符。
提示:
(1)數(shù)組下界默認(rèn)為0,為了便于使用,在VB中的窗體層或標(biāo)準(zhǔn)模塊層用“OptionBasen”語句指定在定義數(shù)組時下標(biāo)下界省略時的默認(rèn)值(不能在過程中使用)。
例如:
OptionBase1
Dimm(3)AsInteger
設(shè)定默認(rèn)下界為1,數(shù)組m中的元素分別為m(1)、m(2)、m(3)。
注意:該語句只能對本模塊中聲明時默認(rèn)下界的數(shù)組起作用,對其他模塊的數(shù)組不起作用。
(2)在定義數(shù)組時可用類型符來指定數(shù)組的類型。例如:
Dima(3)AsInteger
Dima%(3)
上述兩條語句定義的整型數(shù)組是等價的。類似地還有:
DimB!(3To5)、C#(12)、D$(5)
2.?dāng)?shù)組元素的引用
一維數(shù)組被定義之后便具有了內(nèi)存空間,可以通過以下方式引用數(shù)組指定下標(biāo)的元素。
數(shù)組名(下標(biāo)值)
引用數(shù)組元素時的“下標(biāo)”可以是整型(或長整型)常量、變量或表達(dá)式。下標(biāo)值不能小于數(shù)組下標(biāo)的下界,不能大于下標(biāo)的上界。
3.?dāng)?shù)組元素的賦值
對于靜態(tài)數(shù)組,數(shù)組聲明后由于其個數(shù)是固定的,因此所有元素都已經(jīng)在內(nèi)存中分配好了空間,此時的數(shù)組元素與簡單變量一樣存在默認(rèn)的初值,若需要給數(shù)組的元素重新賦值,可以采用直接賦值,當(dāng)數(shù)組元素很多時也可以采用循環(huán)方式,使賦值簡單、快捷。
1)直接賦值
直接賦值即直接將值賦給數(shù)組中的每個元素。例如,下列程序?qū)?shù)組元素賦值如下:
Dimstu(3)AsInteger
stu(0)=1
stu(1)=2
stu(2)=3
stu(3)=4
這就實(shí)現(xiàn)了對數(shù)組中的每個元素進(jìn)行賦值。
2)利用循環(huán)結(jié)構(gòu)賦值
當(dāng)需要賦值的數(shù)組元素較多,且所賦值有一定的規(guī)律時,使用循環(huán)結(jié)構(gòu)賦值是非常有效的一種方法。例如,給數(shù)組stu(1To10)中的每個元素都賦初值0,程序如下:
Dimstu(1To10)AsInteger
DimiAsInteger
Fori=1To10
stu(i)=0
Nexti
3)數(shù)組元素間互相賦值
例如將A數(shù)組的元素值賦給B數(shù)組,對應(yīng)的賦值程序?yàn)椋?
DimA(1To100)AsInteger,iAsInteger
DimB(1To100)AsInteger
Fori=1To100
A(i)=i
PrintA(i);
Nexti
Print
Fori=1To100
B(i)=A(i)
PrintB(i);
Nexti
在VisualBasic6.0中可以直接將一個數(shù)組的值賦給另一個數(shù)組。例如:
Dimstu(3)AsInteger
Dimtea()AsInteger
tea=stu
使用這種方法賦值需要注意以下事項(xiàng):
(1)賦值號兩邊的數(shù)組類型必須一致。
(2)如果賦值號左邊是一個動態(tài)數(shù)組,則賦值時系統(tǒng)自動將動態(tài)數(shù)組ReDim成與右邊相同大小的數(shù)組。
(3)如果賦值號左邊是一個大小固定的數(shù)組,則數(shù)組賦值出錯。
4)利用Array函數(shù)賦值
例如,以下程序?qū)山M數(shù)據(jù)轉(zhuǎn)化為數(shù)組中的數(shù)組元素。
DimaAsVariant,bAsVariant,i%
a=Array(1,2,3,4,5)
b=Array("abc","def","67")
注意:本函數(shù)只能給變體類型的變量或變體類型的動態(tài)數(shù)組賦值。
……