- Visual Basic從入門到精通(第2版)
- 龍馬高新教育策劃 國家863中部軟件孵化器編著
- 288字
- 2019-01-02 05:00:30
第4章 同類型批量數據管理的技巧—數組
本章視頻教學錄像:1小時2分鐘
在實際應用過程中,將一批相互有聯系、有一定順序、同一類型和具有相同性質的數據采用集合進行定義和存儲,這樣的集合就是數組。數組在同類型批量數據管理中有著很廣泛的應用。本章將帶領讀者從數組的基礎開始循序漸進地學習。本章介紹數組的基本概念、基本操作和數組相關函數及語句,主要包括定長和動態數組和數組元素的輸入、輸出、插入、查找、刪除等。
本章要點(已掌握的在方框中打鉤)
□ 了解數組的基本概念和分類
□ 了解數組的引用和初始化
□ 掌握數組元素的插入、刪除和查找
□ 熟悉數組元素的應用及排序
□ 了解數組相關的函數
□ 了解數組相關的語句
4.1 數組的概念
本節視頻教學錄像:10分鐘
數組的英文名是“Array”。Array在英文中是“陣列”的意思。所謂“陣列”,就是一組集中的、排列有序的集合。數組并不是一種數據類型,而是一組相同類型的變量的集合,可用于存儲和處理成組的有序數據,數組必須先聲明后使用。每一個數組給定一個名稱,叫作數組名;數組中的每一個數或變量被稱為數組元素;一個數組中各個數組元素之間的區別用數組的下標來表示,放在數組名后面的括號內,因此,數組元素又被稱為下標變量。
總體上數組可分為兩類: 定長(靜態)數組和動態(可變長)數組。
提示
數組和簡單變量相比有以下幾個特點。⑴ 數組的命名規則和簡單變量的命名規則相同。⑵ 數組的數據類型和數組中所存儲的數組元素的類型必須相同。⑶ 由于受到計算機硬件和軟件條件的限制,數組中的元素個數必須是有限的。
4.1.1 定長數組及聲明
定長數組是一組具有相同類型的變量的有序集合,集合中的變量稱為數組元素。數組元素共用一個名字,通過下標來唯一標識自己。
在使用某個數組前,需要先聲明該數組。對數組進行聲明,應該包括數組名、維數、大小、類型以及作用域等。
數組聲明語句的具體語法是:
Dim|Private|Public|Static數組名([下界1 To]上界1,<[下界2 To]上界2,……>) [As數據類型]
對數組聲明語句的說明如下。
Dim:聲明普通局部數組。
Private:聲明模塊級數組。
Public:聲明可在工程任何模塊中使用的數組。
Static:聲明靜態數組。
As:用來說明數組元素的類型。聲明時若沒有指定數組的數據類型,則默認是變體型。
例如:
Dim Private A(6 To 12)As lnteger '數組A為私有整型一維數組,共7個元素,下標從6到12。 Dim Public N(-3 to 6,9) '聲明數組N為公用二維數組,共有10*10=100個元素。
注意
在聲明數組時,也可以使用類型說明符代替“[As數據類型]”,例如:
Dim a$(10) '字符串類型數組 Dim b%(5,5) '整型數組
4.1.2 動態數組及聲明
有時我們并不能在編寫程序的時候就確定數組中到底會存儲多少元素,對于這種情況,一般的解決方法是對所有的數組都按照它可能的數組元素的最大值創建數組,但是這樣會浪費很多存儲空間。動態數組就是為了解決這個問題而產生的。動態數組中的數組元素個數不定,并且可以根據需要動態改變數組元素的個數。
可以按照下面的步驟創建一個動態數組。
⑴ 首先像前面定長數組的聲明一樣,先聲明一個數組,但是不說明維數和界限。
Dim|Private|Public|Static數組名() [As數據類型]
⑵ 然后在實際使用的時候用ReDim語句定制數組的維數和上下界,為數組分配實際的內存空間。
ReDim [Preserve] 數組名(<維數說明>) [As類型]
使用ReDim語句時,需要遵循下面一些規則。
⑴ ReDim語句中的維界定義中的上下界可以是常量,也可以是有了確定值的變量。
⑵ ReDim語句只能出現在過程體內,為數組臨時分配存儲空間,當所在過程結束時,分配的存儲空間就會釋放。
⑶ 使用Redim語句時,如果不使用Preserve選項,原來數組中的值會丟失,即數組中的內容全部被重新初始化,當前存儲在數組中的值會全部丟失。Visual Basic會重新將數組元素的值置為Empty(對Variant數組)、0(對Numeric數組)、零長度字符串(對String數組)或者Nothing(對于對象的數組)。如果希望改變數組大小又不丟失數組中的數據,使用具有Preserve關鍵字的ReDim語句就可以做到這點。
使用ReDim語句時,如果使用Preserve選項,則在對數組重新說明時,將會保留數組中原來的數據,但是不能改變維數,并且只能改變最后一維的大小,前面維的大小不能改變。
提示
⑴ 在動態數組ReDim語句中的下標可以是常量,也可以是確定值的變量。
⑵ 在過程中可以多次使用ReDim來改變數組的大小,也可改變數組的維數。
⑶ 每次使用ReDim語句都會使原來數組中的值丟失,可以在ReDim語句后加Preserve參數來保留數組中的數據,但只能改變最后一維的大小,前面幾維大小不變。
4.2 數組基本操作
本節視頻教學錄像:34分鐘
在數組的學習中,數組的應用是非常重要的一項內容,而這就需要我們了解數組的一些基本功能,熟練掌握一些數組的基本操作和實現。本小節就讓我們來一起學習一些數組的基本操作。
4.2.1 數組的引用
數組元素的引用—數組名(下標)。
例如:求數組中的最大元素及所在下標。
Dim Max As lnteger, iMax As lnteger
Dim ia(1 to 10) as integer Max=iA(1):iMax=1 For i=2 To 10 lf iA(i)>Max Then Max=iA(i) iMax=i End lf Next l
4.2.2 數組的初始化
當數組被聲明后,根據數組被聲明的數據類型,數組中的元素將被賦予不同的默認值。

提示
⑴ 初始值與相應數組元素一對應,初始值相互之間用逗號隔開。
⑵ 初始化前對數組元素的定義不能是具體的數據類型,只能是Variant或默認類型。
⑶ 對于該數組可以不定義而直接由Array函數來確定。
⑷ 此種方法只能初始化一維數組。
4.2.3 數組元素的輸入、輸出
1. 數組元素的輸入
對于數組元素較少的數組,可通過單個賦值語句進行輸入操作;對于數組元素較多的數組,一般通過For語句、InputBox函數和文本框輸入。
⑴ 通過InputBox函數輸入適合輸入少量數據
例如:
01 Dim SB(3,4)As singer 02 For i=0 To 3 03 For j=0 To 4 04 SB(i,j)=lnputBox("輸入"&i&j&"的值") 05 Next j 06 Next i
⑵ 通過For語句輸入
例如:
01 Option Base 1 '默認下標下界為1 02 DlM b(2,3)as single 03 For i=1 to 2 04 For i=1 to 3 05 b(i,j)=inputbox("輸入b(" & i &","& j &")的值") 06 Next 07 Next
⑶ 通過文本框控件輸入
對大批量的數據輸入,采用文本框和函數split()\join()進行處理,效率更高。
2. 數組的輸出
數組的輸出同樣是以數組元素為操作對象,可通過Print方法來實現,也可用For…Next循環語句輸出。
⑴ 通過For…Next循環語句實現輸出
例如:
01 For i=1 To 10 02 Print A(i), '在一行上顯示 03 Next l 04 For i=1 To 100 05 Print B(i), 06 lf i Mod 10=0 Then Print '每10個一行顯示 07 Next i
⑵ 通過print方法實現輸出
例如:輸出方陣中下三角元素。
01 Dim sc(5,5)As lnteger,i As lnteger,j As lnteger 02 For i=1 To 5 03 For j=1 To 5 04 sc(i,j)=i*j; '數組賦初值 05 Next 06 Next 07 For i=1 To 5 08 For j=1 To i '內循環控制每行輸出的元素個數 09 Print sc(i,j); '以緊湊格式輸出數組元素 10 Next 11 Print 12 Next
4.2.4 數組元素的插入、刪除和查找
數組元素的插入、刪除操作一般是在已排序好的數組中插入或刪除一個元素,使得插入或刪除以后的數組還是有序的;這涉及到查找問題,在數組中先找到插入的位置或刪除的元素,然后進行相應的操作。
1.數組中元素的插入
例如:設有一按升序排列的有n個元素的數組a(數組元素為整型),現將一個數“11”插入后,仍保持其有序。
解題思路:
⑴ 查找插入位置k(1≤k ≤n-1)。
⑵ 從n-1到k逐一往后移動一個位置,將第k個元素的位置騰出。
⑶ 將數據插入。
01 Dim a(),i,k As lnteger 02 Print"插入前:"; 03 Redim a(1 To 9) '給數組元素賦值 04 a=Array(2,4,6,8,10,12,14,16) 05 For i=1 To 8 06 Print a(i); 07 Next 08 For k=1 To 9 '查找插入的位置 09 lf 10=a(k)Then Exit For 10 Next 11 For i=9 To k setp-1 '從k+1元素開始往前移動 12 a(i+1)=a(i) 13 Next 14 a(k)=11 15 Print"插入后:"; 16 For i=1 To 9 17 Print a(i); 18 Next
2. 數組中元素的刪除
解題思路:
⑴ 查找欲刪除的元素所在的位置k。
⑵ 從k+1到n個位置逐個往前移動。⑶ 將數組個數減1。

例如:刪除數組一個元素。設數組的元素為(2,4,6,8,10,11, 12,14,16),刪除其中的元素“11”。
01 Dim a(),i,k As lnteger 02 Print"插入前:";
03 Redim a(1 To 9) '給數組元素賦值 04 a=Array(2,4,6,8,10,11,12,14,16) 05 For i=1 To 9 06 Print a(i); 07 Next 08 For k=1 To 9 '查找插入的位置 09 lf 11=a(k)Then Exit For 10 Next 11 For i=k+1 To 9 '從k+1元素開始往前移動 12 a(i-1)=a(i) 13 Next 14 Redim Preserve a(1 To 8) '利用數組重新聲明減少一個元素,但保持數組原來的值 15 Print:Print '顯示插入后的數組元素 16 Print"插入后:"; 17 For i=1 To 8 18 Print a(i); 19 Next
4.2.5 數組元素的應用及排序
排序就是將一組數按遞增或遞減的次序重新排列。常用的方法有選擇法、冒泡法、插入法。
1. 選擇法排序
算法描述:
設有n個數的數組a(1),a(2),…,a(n),要求按遞增的次序排列。
首先設變量k用于存放當前最小數的下標,然后按下列步驟進行。
⑴ 從n個數中選出最小元素的下標,然后將最小數與第一個數交換位置,即a(k)與a(1)互換。先將a(k)與a(2)進行比較,k的初值為1,若a(2)<a(k),則將變量k指向2(k總是為較小元素的下標值);再將a(k) 與a(3)…a(n-1)、a(n)比較,并依次做出同樣的處理,最終k為n個數中最小元素的下標,a(k)為最小的元素,此時將a(k)與a(1)互換。
⑵ 從除第一個數外,其余n-1個數按步驟⑴的方法選出次小的數,使a(k)與a(2)交換位置。先將k置為2,將a(k)與a(3)、a(4)、…、a(n-1)、a(n)比較,每當a(i)<a(k)時,置k為i,最后,k為第一輪余下的n-1個數中的最小數,將a(k)與a(2)互換。
⑶ 繼續進行第三輪,第四輪…直到第n-1輪,余下的a(n)就是n個數中的最大值。
至此,n個數已從小到大順序存放到數組a中。
2. 冒泡法排序
冒泡法在每一輪排序時將相鄰的數比較,當次序不對就交換位置,冒泡法若有n個元素,則需要比較n-1輪,比較方向可以從右向左,也可以從左向右,而且每一輪都是從頭比較到尾。
例如:將數組中的6個數,用冒泡排序法排序。
01 Dim a(6)As lnteger
02 Dim k,n,i,j,t As lnteger 03 Randomize 04 n=6 05 For i=1 To n 06 a(i)=lnt(Rnd*9)+1 '給數組6個元素賦值,0~9中的隨機整數 07 Label3.Caption=Label3.Caption+Str(a(i)) 08 Next 09 '冒泡排序法 10 For i=1 To n-1 11 For j=n To i+1 Step-1 12 lf a(j-1)>a(j)Then '相鄰元素比較 13 t=a(j) 14 a(j)=a(j-1) 15 a(j-1)=t 16 End lf 17 Next 18 Label4.Caption=Label4.Caption+Str(a(i)) '將排序結果顯示在Label上 19 Next 20 Label4.Caption=Label4.Caption+Str(a(i))
4.3 數組相關函數及語句
本節視頻教學錄像:14分鐘
數組相關函數及語句是數組的比較常用的實現方式,本小節讓我們來認識和學習一些在數組中比較常用的數組相關函數及語句。
4.3.1 Array函數
Array函數格式:數組變量名=Array(數組元素值表)。
功能:把一組數據賦給數組中的每個元素。
說明:
⑴ 數組元素值表是一個用逗號分隔的值表,這些值構成數組的各元素值。
⑵ Array函數僅適用于一維數組,只能給Variant類型的變量賦值,賦值后的數組大小由參數的個數決定。
⑶ 使用array函數創建的數組,其下界受Option base語句指定的下界的限制。
⑷ 若不提供參數,則創建一個長度為0的數組。
提示
數組變量名是預先定義的數組名。在數組變量名后沒有括號。采用變量定義形式,作為數組使用,類型為variant。
例如:要將1、2、3、4、5、6、7、8、9、10這些值賦給數組A,可以使用下面的方法。
Dim A A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
4.3.2 UBound函數和LBound函數
函數格式:
LBound(數組名[,N]) UBound(數組名['N])
功能:
LBound函數返回“數組名”指定的數組的第N維的下界。
UBound函數返回“數組名”指定的數組的第N維的上界。
說明:N為1表示第一維,N為2表示第二維,等等。如果省略N,則默認為1。
例如:要打印一維數組A的各個值,可以通過下面的代碼實現。
For l = LBound(A) To UBound(A) Print A(l); Next l
例如:要打印二維數組B的各個值,可以通過下面的代碼實現。
01 For l=LBound(B,1)To UBound(B,1) 02 For J=LBound(B,2)To UBound(B,2) 03 Print B(l,J); 04 Next J 05 Print 06 Next l
4.3.3 Split函數
Split函數格式:Split(字符串表達式[,分隔符])
功能:以某個指定符號作為分隔符,將“字符串表達式”指定的字符串分離為若干個子字符串,以這些子字符串為元素構成一個下標從零開始的一維數組。
說明:“字符串表達式”用于指定要被分隔的字符串,“分隔符”是可選的,如果忽略,則使用空格作為分隔符。例如:
Dim A A = Split("how are you", " ")
執行以上賦值之后:
A(0)="how",A(1)="are",A(2)="you"。
也可以用Split函數給一個動態數組賦值。例如:
Dim A() As String A = Split("how are you", " ")
4.3.4 Option Base語句
在模塊級別中使用,用來聲明數組下標的缺省下界。
語法:Option Base {0 | 1}
說明:由于下界的缺省設置是0,因此無需使用Option Base語句。如果使用該語句,則必須寫在模塊的所有過程之前。一個模塊中只能出現一次Option Base,且必須位于帶維數的數組聲明之前。
注意 :Dim、Private、Public、ReDim以及Static語句中的To子句提供了一種更靈活的方式來控制數組的下標。不過,如果沒有使用To子句顯式地指定下界,則可以使用Option Base將缺省下界設為1。使用Array函數或ParamArray關鍵字創建的數組的下界為0,Option Base對Array或ParamArray不起作用。Option Base語句只影響位于包含該語句的模塊中的數組下界。例如:
01 Option base 1 '將缺省的數組下標設為1 02 Dim LowerDim MyArray(20) 03 TwoDArray(3,4) '聲明數組變量 04 Dim ZeroArray(0 To 5) '取代缺省的下標 05 LBound '使用函數來測試數組的下界 06 Lower=LBound(MyArray) '返回1 07 Lower=LBound(TwoDArray,2) '返回1 08 Lower=LBound(ZeroArray)
【范例4-1】 編寫代碼以實現運行程序后單擊窗體,在窗體上垂直輸出1、2、3、4、5。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標準EXE】圖標,然后單擊【打開】按鈕。
⑵ 在【Form1】窗體上單擊鼠標右鍵,在彈出的快捷菜單中選擇【查看代碼】菜單項,進入代碼窗口。
⑶ 在代碼窗口中選擇【Form】窗體的【Click】事件。

技巧
用鼠標雙擊窗體或者選擇【視圖】菜單下的【代碼窗口】命令,也可以進入代碼窗口。
⑷ 輸入以下代碼。
01 Private Sub Form_Click() 02 Dim l As lnteger '定義一個整型變量 03 Dim a%(5) '定義一個整型數組,并為數組設置元素個數 04 For l=1 To 5 '從1至5開始循環運算 05 a(l)=l '為數組賦值 06 Print a(l) '輸出數組中的元素值 07 Next l '循環不結束,繼續下一次循環 08 End Sub
【運行結果】
保存程序,單擊【啟動】按鈕,運行程序。用鼠標單擊窗體,將會在窗體中垂直顯示1、2、3、4、5等數字。

【拓展訓練】
既然能輸出“1、2、3、4、5”這幾個數字,那么要想輸出100~110這一系列數字也就不是一件很難的事了。
只需要對步驟⑷中的代碼進行相關的修改就可以了(拓展代碼2-1.txt)。
01 Private Sub Form_Click() 02 Dim l As lnteger '定義整型變量 03 Dim a%(100 To 110) '定義整型數組,并為其設置坐標上限和下限 04 For l=100 To 110 '利用循環語句開始循環 05 a(l)=l '為數組賦值 06 Print a(l) '輸入數組元素 07 Next l '循環條件為真,進行下一次循環 08 End Sub
提示
在修改程序時,主要是對數組所定義的上界和下界進行了修改。如果對程序限界定義的過大,則會造成系統資源的浪費;如果對程序上界和下界定義過少,則會出現下標越界的嚴重錯誤。
運行后,單擊窗體就會看到所需的結果。

4.4 高手點撥
本節視頻教學錄像:4分鐘
在平時使用數組進行賦值時,以下一些常見的問題需要注意。
1. 只能將數據類型定義為可變類型
賦值的數據雖然可以有多種類型,但定義時必須將數據定義成可變型。若定義成其他類型,比如定義為整型:
Dim a() As Integer A()=Array(1,3,5,10)
則系統會報告類型錯誤。就是說在利用Dim等進行定義時,除了Variant類型外,Integer等其他類型都不適合這種形式。
2. 數組定義時不要指定上、下界
比如要對10個數據進行賦值,不能將數組定義成:
Dim s(10) As Variant
這樣當利用Array函數賦值時系統將會報錯。也就是說數組s()應定義成動態數組,不指定上下界,其上下界在用Array函數賦值時自動指定。
3. 有關數組的隱性聲明
當使用數組的隱性聲明形式時,即不對數組進行提前聲明而直接使用Array函數賦值時,要注意此時數組名要省略其后面的括號,數組s()應寫成s,即有:
s=Array(...)
而如果寫成s()=Array(...),系統將會報錯。只要注意了以上幾點,對數組的大量數據初始化問題就能得到順利的解決。
4.5 實戰練習
查找下標為0,上標為9的數組中值為“5”的元素索引值,若沒有,則返回“找不到”。