官术网_书友最值得收藏!

第4章 同類型批量數(shù)據(jù)管理的技巧—數(shù)組

本章視頻教學錄像:1小時2分鐘

在實際應用過程中,將一批相互有聯(lián)系、有一定順序、同一類型和具有相同性質(zhì)的數(shù)據(jù)采用集合進行定義和存儲,這樣的集合就是數(shù)組。數(shù)組在同類型批量數(shù)據(jù)管理中有著很廣泛的應用。本章將帶領讀者從數(shù)組的基礎開始循序漸進地學習。本章介紹數(shù)組的基本概念、基本操作和數(shù)組相關函數(shù)及語句,主要包括定長和動態(tài)數(shù)組和數(shù)組元素的輸入、輸出、插入、查找、刪除等。

本章要點(已掌握的在方框中打鉤)

□ 了解數(shù)組的基本概念和分類

□ 了解數(shù)組的引用和初始化

□ 掌握數(shù)組元素的插入、刪除和查找

□ 熟悉數(shù)組元素的應用及排序

□ 了解數(shù)組相關的函數(shù)

□ 了解數(shù)組相關的語句

4.1 數(shù)組的概念

本節(jié)視頻教學錄像:10分鐘

數(shù)組的英文名是“Array”。Array在英文中是“陣列”的意思。所謂“陣列”,就是一組集中的、排列有序的集合。數(shù)組并不是一種數(shù)據(jù)類型,而是一組相同類型的變量的集合,可用于存儲和處理成組的有序數(shù)據(jù),數(shù)組必須先聲明后使用。每一個數(shù)組給定一個名稱,叫作數(shù)組名;數(shù)組中的每一個數(shù)或變量被稱為數(shù)組元素;一個數(shù)組中各個數(shù)組元素之間的區(qū)別用數(shù)組的下標來表示,放在數(shù)組名后面的括號內(nèi),因此,數(shù)組元素又被稱為下標變量。

總體上數(shù)組可分為兩類: 定長(靜態(tài))數(shù)組和動態(tài)(可變長)數(shù)組。

提示

數(shù)組和簡單變量相比有以下幾個特點。⑴ 數(shù)組的命名規(guī)則和簡單變量的命名規(guī)則相同。⑵ 數(shù)組的數(shù)據(jù)類型和數(shù)組中所存儲的數(shù)組元素的類型必須相同。⑶ 由于受到計算機硬件和軟件條件的限制,數(shù)組中的元素個數(shù)必須是有限的。

4.1.1 定長數(shù)組及聲明

定長數(shù)組是一組具有相同類型的變量的有序集合,集合中的變量稱為數(shù)組元素。數(shù)組元素共用一個名字,通過下標來唯一標識自己。

在使用某個數(shù)組前,需要先聲明該數(shù)組。對數(shù)組進行聲明,應該包括數(shù)組名、維數(shù)、大小、類型以及作用域等。

數(shù)組聲明語句的具體語法是:

      Dim|Private|Public|Static數(shù)組名([下界1 To]上界1,<[下界2 To]上界2,……>) [As數(shù)據(jù)類型]

對數(shù)組聲明語句的說明如下。

Dim:聲明普通局部數(shù)組。

Private:聲明模塊級數(shù)組。

Public:聲明可在工程任何模塊中使用的數(shù)組。

Static:聲明靜態(tài)數(shù)組。

As:用來說明數(shù)組元素的類型。聲明時若沒有指定數(shù)組的數(shù)據(jù)類型,則默認是變體型。

例如:

      Dim Private A(6 To 12)As lnteger      '數(shù)組A為私有整型一維數(shù)組,共7個元素,下標從6到12。
      Dim Public N(-3 to 6,9)      '聲明數(shù)組N為公用二維數(shù)組,共有10*10=100個元素。

注意

在聲明數(shù)組時,也可以使用類型說明符代替“[As數(shù)據(jù)類型]”,例如:

            Dim a$(10)      '字符串類型數(shù)組
            Dim b%(5,5)     '整型數(shù)組

4.1.2 動態(tài)數(shù)組及聲明

有時我們并不能在編寫程序的時候就確定數(shù)組中到底會存儲多少元素,對于這種情況,一般的解決方法是對所有的數(shù)組都按照它可能的數(shù)組元素的最大值創(chuàng)建數(shù)組,但是這樣會浪費很多存儲空間。動態(tài)數(shù)組就是為了解決這個問題而產(chǎn)生的。動態(tài)數(shù)組中的數(shù)組元素個數(shù)不定,并且可以根據(jù)需要動態(tài)改變數(shù)組元素的個數(shù)。

可以按照下面的步驟創(chuàng)建一個動態(tài)數(shù)組。

⑴ 首先像前面定長數(shù)組的聲明一樣,先聲明一個數(shù)組,但是不說明維數(shù)和界限。

      Dim|Private|Public|Static數(shù)組名() [As數(shù)據(jù)類型]

⑵ 然后在實際使用的時候用ReDim語句定制數(shù)組的維數(shù)和上下界,為數(shù)組分配實際的內(nèi)存空間。

      ReDim [Preserve] 數(shù)組名(<維數(shù)說明>) [As類型]

使用ReDim語句時,需要遵循下面一些規(guī)則。

⑴ ReDim語句中的維界定義中的上下界可以是常量,也可以是有了確定值的變量。

⑵ ReDim語句只能出現(xiàn)在過程體內(nèi),為數(shù)組臨時分配存儲空間,當所在過程結束時,分配的存儲空間就會釋放。

⑶ 使用Redim語句時,如果不使用Preserve選項,原來數(shù)組中的值會丟失,即數(shù)組中的內(nèi)容全部被重新初始化,當前存儲在數(shù)組中的值會全部丟失。Visual Basic會重新將數(shù)組元素的值置為Empty(對Variant數(shù)組)、0(對Numeric數(shù)組)、零長度字符串(對String數(shù)組)或者Nothing(對于對象的數(shù)組)。如果希望改變數(shù)組大小又不丟失數(shù)組中的數(shù)據(jù),使用具有Preserve關鍵字的ReDim語句就可以做到這點。

使用ReDim語句時,如果使用Preserve選項,則在對數(shù)組重新說明時,將會保留數(shù)組中原來的數(shù)據(jù),但是不能改變維數(shù),并且只能改變最后一維的大小,前面維的大小不能改變。

提示

⑴ 在動態(tài)數(shù)組ReDim語句中的下標可以是常量,也可以是確定值的變量。

⑵ 在過程中可以多次使用ReDim來改變數(shù)組的大小,也可改變數(shù)組的維數(shù)。

⑶ 每次使用ReDim語句都會使原來數(shù)組中的值丟失,可以在ReDim語句后加Preserve參數(shù)來保留數(shù)組中的數(shù)據(jù),但只能改變最后一維的大小,前面幾維大小不變。

4.2 數(shù)組基本操作

本節(jié)視頻教學錄像:34分鐘

在數(shù)組的學習中,數(shù)組的應用是非常重要的一項內(nèi)容,而這就需要我們了解數(shù)組的一些基本功能,熟練掌握一些數(shù)組的基本操作和實現(xiàn)。本小節(jié)就讓我們來一起學習一些數(shù)組的基本操作。

4.2.1 數(shù)組的引用

數(shù)組元素的引用—數(shù)組名(下標)。

例如:求數(shù)組中的最大元素及所在下標。

      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 數(shù)組的初始化

當數(shù)組被聲明后,根據(jù)數(shù)組被聲明的數(shù)據(jù)類型,數(shù)組中的元素將被賦予不同的默認值。

提示

⑴ 初始值與相應數(shù)組元素一對應,初始值相互之間用逗號隔開。

⑵ 初始化前對數(shù)組元素的定義不能是具體的數(shù)據(jù)類型,只能是Variant或默認類型。

⑶ 對于該數(shù)組可以不定義而直接由Array函數(shù)來確定。

⑷ 此種方法只能初始化一維數(shù)組。

4.2.3 數(shù)組元素的輸入、輸出

1. 數(shù)組元素的輸入

對于數(shù)組元素較少的數(shù)組,可通過單個賦值語句進行輸入操作;對于數(shù)組元素較多的數(shù)組,一般通過For語句、InputBox函數(shù)和文本框輸入。

⑴ 通過InputBox函數(shù)輸入適合輸入少量數(shù)據(jù)

例如:

      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

⑶ 通過文本框控件輸入

對大批量的數(shù)據(jù)輸入,采用文本框和函數(shù)split()\join()進行處理,效率更高。

2. 數(shù)組的輸出

數(shù)組的輸出同樣是以數(shù)組元素為操作對象,可通過Print方法來實現(xiàn),也可用For…Next循環(huán)語句輸出。

⑴ 通過For…Next循環(huán)語句實現(xiàn)輸出

例如:

      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方法實現(xiàn)輸出

例如:輸出方陣中下三角元素。

      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;      '數(shù)組賦初值
      05      Next
      06   Next
      07   For i=1 To 5
      08      For j=1 To i       '內(nèi)循環(huán)控制每行輸出的元素個數(shù)
      09        Print sc(i,j);     '以緊湊格式輸出數(shù)組元素
      10      Next
      11      Print
      12   Next

4.2.4 數(shù)組元素的插入、刪除和查找

數(shù)組元素的插入、刪除操作一般是在已排序好的數(shù)組中插入或刪除一個元素,使得插入或刪除以后的數(shù)組還是有序的;這涉及到查找問題,在數(shù)組中先找到插入的位置或刪除的元素,然后進行相應的操作。

1.數(shù)組中元素的插入

例如:設有一按升序排列的有n個元素的數(shù)組a(數(shù)組元素為整型),現(xiàn)將一個數(shù)“11”插入后,仍保持其有序。

解題思路:

⑴ 查找插入位置k(1≤k ≤n-1)。

⑵ 從n-1到k逐一往后移動一個位置,將第k個元素的位置騰出。

⑶ 將數(shù)據(jù)插入。

      01 Dim a(),i,k As lnteger
      02 Print"插入前:";
      03 Redim a(1 To 9)  '給數(shù)組元素賦值
      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. 數(shù)組中元素的刪除

解題思路:

⑴ 查找欲刪除的元素所在的位置k。

⑵ 從k+1到n個位置逐個往前移動。⑶ 將數(shù)組個數(shù)減1。

例如:刪除數(shù)組一個元素。設數(shù)組的元素為(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)  '給數(shù)組元素賦值
      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)  '利用數(shù)組重新聲明減少一個元素,但保持數(shù)組原來的值
      15 Print:Print       '顯示插入后的數(shù)組元素
      16 Print"插入后:";
      17 For i=1 To 8
      18  Print a(i);
      19 Next

4.2.5 數(shù)組元素的應用及排序

排序就是將一組數(shù)按遞增或遞減的次序重新排列。常用的方法有選擇法、冒泡法、插入法。

1. 選擇法排序

算法描述:

設有n個數(shù)的數(shù)組a(1),a(2),…,a(n),要求按遞增的次序排列。

首先設變量k用于存放當前最小數(shù)的下標,然后按下列步驟進行。

⑴ 從n個數(shù)中選出最小元素的下標,然后將最小數(shù)與第一個數(shù)交換位置,即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個數(shù)中最小元素的下標,a(k)為最小的元素,此時將a(k)與a(1)互換。

⑵ 從除第一個數(shù)外,其余n-1個數(shù)按步驟⑴的方法選出次小的數(shù),使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個數(shù)中的最小數(shù),將a(k)與a(2)互換。

⑶ 繼續(xù)進行第三輪,第四輪…直到第n-1輪,余下的a(n)就是n個數(shù)中的最大值。

至此,n個數(shù)已從小到大順序存放到數(shù)組a中。

2. 冒泡法排序

冒泡法在每一輪排序時將相鄰的數(shù)比較,當次序不對就交換位置,冒泡法若有n個元素,則需要比較n-1輪,比較方向可以從右向左,也可以從左向右,而且每一輪都是從頭比較到尾。

例如:將數(shù)組中的6個數(shù),用冒泡排序法排序。

      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    '給數(shù)組6個元素賦值,0~9中的隨機整數(shù)
      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 數(shù)組相關函數(shù)及語句

本節(jié)視頻教學錄像:14分鐘

數(shù)組相關函數(shù)及語句是數(shù)組的比較常用的實現(xiàn)方式,本小節(jié)讓我們來認識和學習一些在數(shù)組中比較常用的數(shù)組相關函數(shù)及語句。

4.3.1 Array函數(shù)

Array函數(shù)格式:數(shù)組變量名=Array(數(shù)組元素值表)。

功能:把一組數(shù)據(jù)賦給數(shù)組中的每個元素。

說明:

⑴ 數(shù)組元素值表是一個用逗號分隔的值表,這些值構成數(shù)組的各元素值。

⑵ Array函數(shù)僅適用于一維數(shù)組,只能給Variant類型的變量賦值,賦值后的數(shù)組大小由參數(shù)的個數(shù)決定。

⑶ 使用array函數(shù)創(chuàng)建的數(shù)組,其下界受Option base語句指定的下界的限制。

⑷ 若不提供參數(shù),則創(chuàng)建一個長度為0的數(shù)組。

提示

數(shù)組變量名是預先定義的數(shù)組名。在數(shù)組變量名后沒有括號。采用變量定義形式,作為數(shù)組使用,類型為variant。

例如:要將1、2、3、4、5、6、7、8、9、10這些值賦給數(shù)組A,可以使用下面的方法。

      Dim A
      A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

4.3.2 UBound函數(shù)和LBound函數(shù)

函數(shù)格式:

      LBound(數(shù)組名[,N])
      UBound(數(shù)組名['N])

功能:

LBound函數(shù)返回“數(shù)組名”指定的數(shù)組的第N維的下界。

UBound函數(shù)返回“數(shù)組名”指定的數(shù)組的第N維的上界。

說明:N為1表示第一維,N為2表示第二維,等等。如果省略N,則默認為1。

例如:要打印一維數(shù)組A的各個值,可以通過下面的代碼實現(xiàn)。

      For l = LBound(A) To UBound(A)
          Print A(l);
      Next l

例如:要打印二維數(shù)組B的各個值,可以通過下面的代碼實現(xiàn)。

      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函數(shù)

Split函數(shù)格式:Split(字符串表達式[,分隔符])

功能:以某個指定符號作為分隔符,將“字符串表達式”指定的字符串分離為若干個子字符串,以這些子字符串為元素構成一個下標從零開始的一維數(shù)組。

說明:“字符串表達式”用于指定要被分隔的字符串,“分隔符”是可選的,如果忽略,則使用空格作為分隔符。例如:

      Dim A
      A = Split("how are you", " ")

執(zhí)行以上賦值之后:

      A(0)="how",A(1)="are",A(2)="you"。

也可以用Split函數(shù)給一個動態(tài)數(shù)組賦值。例如:

      Dim A() As String
      A = Split("how are you", " ")

4.3.4 Option Base語句

在模塊級別中使用,用來聲明數(shù)組下標的缺省下界。

語法:Option Base {0 | 1}

說明:由于下界的缺省設置是0,因此無需使用Option Base語句。如果使用該語句,則必須寫在模塊的所有過程之前。一個模塊中只能出現(xiàn)一次Option Base,且必須位于帶維數(shù)的數(shù)組聲明之前。

注意 :Dim、Private、Public、ReDim以及Static語句中的To子句提供了一種更靈活的方式來控制數(shù)組的下標。不過,如果沒有使用To子句顯式地指定下界,則可以使用Option Base將缺省下界設為1。使用Array函數(shù)或ParamArray關鍵字創(chuàng)建的數(shù)組的下界為0,Option Base對Array或ParamArray不起作用。Option Base語句只影響位于包含該語句的模塊中的數(shù)組下界。例如:

      01 Option base 1  '將缺省的數(shù)組下標設為1
      02 Dim LowerDim MyArray(20)
      03 TwoDArray(3,4) '聲明數(shù)組變量
      04 Dim ZeroArray(0 To 5) '取代缺省的下標
      05 LBound   '使用函數(shù)來測試數(shù)組的下界
      06 Lower=LBound(MyArray) '返回1
      07 Lower=LBound(TwoDArray,2) '返回1
      08 Lower=LBound(ZeroArray)

【范例4-1】 編寫代碼以實現(xiàn)運行程序后單擊窗體,在窗體上垂直輸出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)     '定義一個整型數(shù)組,并為數(shù)組設置元素個數(shù)
      04   For l=1 To 5  '從1至5開始循環(huán)運算
      05    a(l)=l       '為數(shù)組賦值
      06    Print a(l)     '輸出數(shù)組中的元素值
      07   Next l '循環(huán)不結束,繼續(xù)下一次循環(huán)
      08 End Sub

【運行結果】

保存程序,單擊【啟動】按鈕,運行程序。用鼠標單擊窗體,將會在窗體中垂直顯示1、2、3、4、5等數(shù)字。

【拓展訓練】

既然能輸出“1、2、3、4、5”這幾個數(shù)字,那么要想輸出100~110這一系列數(shù)字也就不是一件很難的事了。

只需要對步驟⑷中的代碼進行相關的修改就可以了(拓展代碼2-1.txt)。

      01 Private Sub Form_Click()
      02  Dim l As lnteger '定義整型變量
      03  Dim a%(100 To 110)     '定義整型數(shù)組,并為其設置坐標上限和下限
      04  For l=100 To 110      '利用循環(huán)語句開始循環(huán)
      05   a(l)=l       '為數(shù)組賦值
      06   Print a(l)      '輸入數(shù)組元素
      07  Next l  '循環(huán)條件為真,進行下一次循環(huán)
      08 End Sub

提示

在修改程序時,主要是對數(shù)組所定義的上界和下界進行了修改。如果對程序限界定義的過大,則會造成系統(tǒng)資源的浪費;如果對程序上界和下界定義過少,則會出現(xiàn)下標越界的嚴重錯誤。

運行后,單擊窗體就會看到所需的結果。

4.4 高手點撥

本節(jié)視頻教學錄像:4分鐘

在平時使用數(shù)組進行賦值時,以下一些常見的問題需要注意。

1. 只能將數(shù)據(jù)類型定義為可變類型

賦值的數(shù)據(jù)雖然可以有多種類型,但定義時必須將數(shù)據(jù)定義成可變型。若定義成其他類型,比如定義為整型:

      Dim a() As Integer
      A()=Array(1,3,5,10)

則系統(tǒng)會報告類型錯誤。就是說在利用Dim等進行定義時,除了Variant類型外,Integer等其他類型都不適合這種形式。

2. 數(shù)組定義時不要指定上、下界

比如要對10個數(shù)據(jù)進行賦值,不能將數(shù)組定義成:

      Dim s(10) As Variant

這樣當利用Array函數(shù)賦值時系統(tǒng)將會報錯。也就是說數(shù)組s()應定義成動態(tài)數(shù)組,不指定上下界,其上下界在用Array函數(shù)賦值時自動指定。

3. 有關數(shù)組的隱性聲明

當使用數(shù)組的隱性聲明形式時,即不對數(shù)組進行提前聲明而直接使用Array函數(shù)賦值時,要注意此時數(shù)組名要省略其后面的括號,數(shù)組s()應寫成s,即有:

      s=Array(...)

而如果寫成s()=Array(...),系統(tǒng)將會報錯。只要注意了以上幾點,對數(shù)組的大量數(shù)據(jù)初始化問題就能得到順利的解決。

4.5 實戰(zhàn)練習

查找下標為0,上標為9的數(shù)組中值為“5”的元素索引值,若沒有,則返回“找不到”。

主站蜘蛛池模板: 庄浪县| 左云县| 巴彦县| 凭祥市| 长顺县| 离岛区| 蛟河市| 平舆县| 保定市| 章丘市| 牡丹江市| 自贡市| 定兴县| 延庆县| 丰宁| 剑阁县| 徐闻县| 饶阳县| 健康| 偃师市| 崇文区| 赤壁市| 呼玛县| 东兰县| 嘉定区| 古蔺县| 卫辉市| 永昌县| 德州市| 江都市| 涞源县| 上高县| 华蓥市| 北辰区| 弋阳县| 东方市| 泾源县| 井冈山市| 兴国县| 略阳县| 扎鲁特旗|