第7 章陣列的活用 - mcu.edu.t · 陣列(Array)用來記錄一群同性質的資料。...

60
Visual Basic 2005學習 範本 7 章 陣列的活用

Transcript of 第7 章陣列的活用 - mcu.edu.t · 陣列(Array)用來記錄一群同性質的資料。...

  • Visual Basic 2005學習 範本

    第 7 章 陣列的活用

  • 7-1 陣列當我們需要處理資料時,都使用變數來存放資料。因為一個變數只能代表一個資料,若需要處理100位同學的成績時,便要使用100個不同的變數名稱,這不但會增加變數名稱命名上的困擾,在處理這些變數時也會增加程式的長度以及造成程式維護以及偵錯上的困難。所幸,Visual Basic語言另外提供-陣列資料型別。陣列(Array)用來記錄一群同性質的資料。透過陣列我們可以用同一個陣列名稱但不同的索引指標(或稱為索引、註標),分別來代替同性質不同的變數。

    「陣列」的基本原理是來自數學中的「矩陣」。

    所謂「陣列」就是一群資料型別相同的變數,在主記憶體中能擁有連續存放空間的集合。

    7-2

  • 例如:我們想記錄50位學生的成績,便宣告一個score(49)的整數陣列,其中score是陣列名稱。此時在主記憶體中會保留50個連續位置來存放score(0)~score(49)等陣列元素,我們可以利用來存放50位同學成績。「陣列」中每個元素相當於一個變數,在「陣列」中存取變數只需要指定索引指標就可以。通常為方便程式處理,會以座號當作陣列的索引指標,但因為索引指標是由0開始,所以要記得減1。由於陣列的索引指標也可以使用變數當索引指標(如score(x)),因此配合計數For廻圈,不但可以免除為大量變數命名的困擾,而且使得程式碼的撰寫將更簡潔而有效率。

    7-2

  • 一、一般陣列的宣告方法「陣列」在使用之前必須先宣告,宣告的目的在決定主記憶體應保留多少個連續空間給此陣列使用,並定出陣列中每一個元素的資料型別。陣列宣告完畢後,才能透過索引指標來存取陣列中的資料。語法:Dim arrayname (index1 [, index2 […..]]) As type功能:宣告一維(二維…)陣列並指定陣列所存取的資料型別

    【說明】1. arrayname:代表陣列名稱,其命名方式和識別字命名一樣。2. index:為索引指標。可為常數、變數或運算式等,只有一個index時稱為「一維陣列」;若有二個index時稱為「二維陣列」;以此類推…。3.index範圍由0 ~ index為止。譬如:Dim a(5) As Integer,可定義出a(0)、a(1)、a(2)、a(3)、a(4)、a(5)共6個元素。

    7-3

    7-2 陣列的宣告與使用

  • 範例【例1】一班有30人,使用整數陣列來存放學生的英文成績。

    Dim score (29) As Integer即score(0) - score(29) 代表1 - 30號的學生英文成績

    【例2】一年級有一、二兩班各30人,使用整數陣列來存放英文學期成績。

    Dim score (1 , 29) As Integer即score(1,20) 代表二班21號的學生英文成績。

    7-3~4

  • 範例【例3】一班有30人,使用整數陣列來存放學生的英文成績。共有三個年級,每個年級有一、二兩班各30人,使用整數陣列來存放英文的學期成績。Dim score (2, 1 , 29) As Integer即score(1,0,15) 代表二年一班16號的學生英文成績。

    7-4

  • 一、一般陣列的宣告方法【說明】

    4. As type宣告一個陣列的資料型別是很重要的,必須視要處理資料的值有多大,再宣告合適的資料形別陣列,以免陣列佔用太多的主記憶體空間。As Integer:將該陣列宣告為整數陣列,也就是說該陣列內每個元素的資料型別都設為整數。譬如:Dim score(30) As Integer表示宣告一個名稱為score的整數陣列,有score(0)-score(30)共31個陣列元素,每個元素能存放資料的有效範圍介於-2,147,483,648~2,147,483,647之間的整數。As Single:將該陣列宣告為倍精確度陣列。譬如:Dim score(30) As Single宣告一維倍精確度陣列,可處理含有小數的資料。As Double:將該陣列宣告為倍精確度陣列。譬如:Dim score(30) As Double宣告一維倍精確度陣列,可處理含有小數的資料。As String:將該陣列宣告為字串陣列,也就是說該陣列內每個元素的資料型態都設為字串。譬如:Dim s_name(2, 30) As String宣告二維字串陣列,可處理含有字串的資料。As Object:將該陣列宣告為物件陣列。譬如:Dim s_name(2, 30) As Object宣告二維Object物件型別陣列,在程式執行時,陣列中的每個元素都可以接受任何資料型別的資料。

    7-4~5

  • 一、一般陣列的宣告方法【說明】

    5.陣列宣告後若未賦予初值,則數值陣列中,所有的元素預設值皆為零。字串陣列中,所有的元素預設值皆為空字串。物件(Object)資料型態陣列中,所有的元素預設值皆為空值(Empty)。6.陣列的元素亦可以和相同型別的變數或陣列元素做各種運算。如:score (3) = score(2) + y7.陣列若僅在自己所屬的程序中使用,只要在使用前在該程序內先宣告即可,如此該陣列則屬區域陣列。離開該程序時該陣列自動釋放。若陣列需要給同一表單中所有的程序共用,該陣列就必須在表單檔程式碼最上方宣告,如此該陣列則屬全域陣列。

    7-5

  • 【例】陣列宣告方式及簡單使用情形

    Dim score(3) As Integer '宣告整數陣列Dim i, total As IntegerDim avg As Singlescore(0) = 97 : score(1) = 82 '設定陣列元素內容值score(2) = 55 : score(3) = 67total = 0For i = 0 To 3

    total += score(i) '累計陣列內所有元素的數值Next iavg = total / 4 '計算陣列內所有元素內容平均值

    7-6

  • 二、指定初值的陣列宣告方式陣列可以在宣告陣列型態的同時,一併設定各陣列元素的初值。語法:Dim arrayname() As type = {initiationlist}功能:宣告陣列並指定陣列元素的初值。【說明】initiationlist:為陣列元素初值設定,若串列的個數超過兩個,中間必須以逗號分隔。

    【例】宣告s_name為字串陣列並同時給予元素初值。Dim s_name() As String = {"張三", "李四", "王五", "周六"}結果:

    s_name(0) = "張三"s_name(1) = "李四"s_name(2) = "王五"s_name(3) = "周六"

    7-6

  • 三、陣列索引指標的上下界值宣告陣列時,下界的index值皆由0開始算起,而上界的索引指標可以由UBound函數取得,語法如下:語法:LBound (arrayname [, dimension])功能:取得陣列之某一維的索引指標下界值。語法:UBound (arrayname [, dimension])功能:取得陣列之某一維的索引指標上界值。

    【說明】1.LBound函數的傳回值為陣列某一維的索引指標下界值,因陣列的下界索引指標均由0開始算起,故LBound函數的傳回值恆為「0」。2.UBound函數的傳回值為陣列某一維的索引指標上界值。3.dimension(維數):若為1則代表一維、2則代表二維、…,若省略此參數,預設為一維。

    7-7

  • 【例】宣告Dim score(3, 15, 20) As String後

    UBound(score) 的傳回值為3(第一維的索引指標上界值)

    UBound(score, 2)的傳回值為15(第二維的索引指標上界值)

    UBound(score, 3)的傳回值為20(第三維的索引指標上界值)

    LBound(score)的傳回值為0 (第一維的索引指標下界值)

    7-6

  • 四、For Each ...Next 陣列迴圈Visual Basic提供For Each…Next陣列廻圈,透過陣列元素的數目,電腦自行決定迴圈內的敘述區段重覆執行的次數。語法:For Each variable In arrayname

    [statements] (敘述區段)[Exit For][statements] (敘述區段)

    Next功能:以所指定的陣列元素數目,去重複執行某個敘述區段。【說明】1.variable:是用來逐一存放陣列元素內容的變數,故該變數所宣告的資料型別要和陣列的資料型別一致。2.陣列元素的個數決定迴圈內的敘述區段(statements)重覆執行的次數。3.每次進入迴圈,陣列元素會依序將元素內容指定給variable(變數),當所有元素皆讀完後,系統會執行緊接在Next後面的敘述。【例】將money陣列中的元素加總。For Each m in money

    total += mNext

    7-8

  • 【範例7_2_1】

    7-8

    使用者輸入國文、英文、數學、社會、自然等五科成績後,列出平均分數和五科中的最高分。

    【執行結果】

  • 【編寫程式碼】

    7-9

    第2行:宣告subject字串陣 列,並同時給予陣列初 始值。

    第3行:宣告score整數陣 列,陣列大小為5。

    第5-7行:使用For迴圈將使 用者輸入的成績,依序

    存入score陣列中。

    第10-13行:使用For Each 迴圈將score陣列的元素

    依序取出,求出最大值 和總分。

    第14行:利用UBound函數 得知score陣列索引指標 的上界值,計算出平均

    分數。

  • 7-3 二維陣列一個陣列若具有兩個索引稱為「二維陣列」;若具有三個索引稱為三維陣列…以此類推下去。二維陣列的應用十分廣泛,如數學的矩陣、學校中學生的成績單、甚至貿易公司的銷售業績表、股票行情表…等,這些都需要使用二維陣列來處理。我們可以將「二維陣列」視為由列 (Row) 和欄(Column) 組合而成的資料表 (Data Table),如下表所示,代表某個公司北、中、南三個分公司每個營業處的銷售金額表,其中第1列第2欄的資料「2300」,即為台中分公司第三營業處的業績。

    7-10

    第一處 第二處 第三處 第四處

    台北分公司 1000 2200 4300 4800 第0列

    台中分公司 2000 5200 2300 1500 第1列

    高雄分公司 4700 1300 800 2800 第2列

    第0欄 第1欄 第2欄 第3欄

  • 二維陣列分別以列和欄來代表兩個索引,索引之間以「,」號分開,其宣告方式如下:語法:Dim arrayname (index1,index2) As type功能:宣告為二維陣列。

    【例1】Dim amt(2, 3) As Integer

    【例2】Dim amt(,) As integer = {{1000, 2200, 4300, 4800}, _

    {2000, 5200, 2300, 1500}, {4700, 1300, 800, 2800}}

    7-10

  • 上表中分公司各營業處使用amt二維整數陣列,兩索引指標由0開始,它具有3*4=12個陣列元素。陣列元素的對應索引指標如下圖所示:

    其中amt(1,2) 的內容表示台中分公司第三營業處的銷售金額,即amt(1,2)=2300。

    7-11

    第一處 第二處 第三處 第四處

    台北分公司 1000 2200 4300 4800 第0列

    台中分公司 2000 5200 2300 1500 第1列

    高雄分公司 4700 1300 800 2800 第2列

    第0欄 第1欄 第2欄 第3欄

    第一處 第二處 第三處 第四處

    台北分公司 amt(0,0) amt(0,1) amt(0,2) amt(0,3)

    台中分公司 amt(1,0) amt(1,1) amt(1,2) amt(1,3)

    高雄分公司 amt(2,0) amt(2,1) amt(2,2) amt(2,3)

  • 【範例7_3_1】

    7-11

    使用者輸入兩位同學的國文、英文、數學等三科成績後,列出同學的各科成績和總分。

    【結果】

  • 【編寫程式碼】

    7-11~12

    第4行:宣告score(1, 3)來 存放兩人、三科和總分 成績。

    第6-10行:用巢狀迴圈讓使 用輸入成績,並存在相

    對的陣列元素中。

    第12-18行:計算個人成績 總和,並存在score(n,3)

    陣列元素中。

  • 【編寫程式碼】

    7-11~12

    第19-31行:取出陣列元素 來顯示成績報表,

    vbTab可以讓字串跳到 下一個定位點,以便讓 表格中資料對齊。

  • 7-13

    7-4 靜態陣列與動態陣列陣列的宣告方式有兩種:靜態陣列和動態陣列。

    若是使用靜態陣列的宣告方式,系統會在主記憶體內保留連續位址給該陣列使用,直到程式結束後才釋放記憶體空間。

    小規模的程式內使用靜態陣列,對程式或系統不會造成影響,但若是在較具規模的大程式內使用太多的靜態陣列,會增加記憶體及CPU的負荷。嚴重時會影響的電腦的執行速度或造成電腦當機。

    要避免陣列一直佔用記憶體,就得使用「動態陣列」。

    動態陣列是指該陣列在程式執行時系統未立即配置記憶空間給該陣列,而是等到程式的流程到需要使用該陣列時,系統才配置記憶體給該陣列,而在該陣列使用完畢時,也可以將該陣列所佔用的記憶體釋放掉,以供其他資料使用。

  • 一、宣告動態陣列宣告動態陣列的方法有下列兩種:1.在程序中以Dim來宣告有維數的區域陣列,例如:Dim arr(10) As Integer在程序中Dim敘述不可對同一陣列名稱重複宣告。此方式所宣告的陣列,在該程序被執行時,系統會立即配置記憶體給該陣列,一旦該程序結束時,系統立即釋放該陣列所佔用的記憶體。2.先用Dim來宣告大小為0的陣列,然後用ReDim宣告陣列大小,例如:Dim st(0) As String 或 Dim st(0,0) As String【注意】一維陣列的宣告可以省略0,如:Dim st() As StringReDim st(3) 或 ReDim st(3,5)ReDim敘述的宣告方法與Dim敘述相同。在程序中ReDim敘述可對同一陣列名稱重複宣告,但維數不能改變,只能改變重新配置陣列的元素數目。

    7-13~14

  • 【例】認識ReDim的使用方法:

    1 Dim i, arr() As Integer '宣告一維的動態陣列arr2 ReDim arr(5) ‘配置 6 個元素

    ' 指定陣列元素內容,使arr(0)~arr(5)依序為0、2、4、6、8、103 For i = 0 To UBound(arr)4 arr(i) = i * 25 Next i6 ReDim arr(10) '重設陣列大小,配置11個元素,每個元素預設值為0

    7-13~14

  • 二、保留陣列先前的元素內容使用ReDim來重新設定動態陣列的元素數目時,系統會先將陣列釋放掉再建立,造成原來存放在陣列元素內的內容也被清除掉了。若在使用ReDim時,加入Preserve關鍵字,則可保留相同索引指標的元素內容。Preserve 只適用於一維動態陣列。【例】了解Preserve的使用情形:1 Dim i, arr(0) As Integer '宣告一維的動態陣列arr 2 ReDim arr(5) ‘配置 6 個元素' 指定陣列元素內容,使arr(0)~arr(5)依序為0、2、4、6、8、10

    4 For i = 0 To UBound(arr)5 arr(i) = i * 26 Next i7 ReDim Preserve arr(10)' 重設陣列大小,配置11個元素,但保留arr(0)~arr(5)原來的內容

    本例中重設大小後的陣列元素內容,依序是arr(0)=0、arr(1)=2、arr(2)=4、arr(3)=6、arr(4)=8、arr(5)=10,但arr(6)~arr(10)的內容皆為0。

    7-14

  • 在宣告區以Static來宣告維數、大小固定的靜態陣列,如:Static num(20) As Single

    用Static所宣告的靜態陣列,在程式執行期間,一直佔用被配置的記憶空間,所以下一次再呼叫同一程序中,都可以讀取該陣列各元素原有內容。

    三、宣告靜態陣列

    7-15

  • 程式執行時,可使用ReDim敘述重新設定陣列的大小並清除陣列元素內容,但清除陣列也可使用Erase敘述。Erase語法如下:語法:Erase arrayname功能:清除陣列,並將所佔據之記憶體釋放掉。1.Erase敘述將陣列從主記憶體中完全清除。2.若在同一程序中還要再使用被Erase的陣列,則須再用ReDim來宣告。【例】了解Erase的使用情形:1 Dim arr(3) As Integer '宣告陣列arr 2 arr(2) = 1003 Erase arr '清除陣列arr4 ReDim arr(4) '重新宣告陣列arr5 arr(4) = 200

    四、清除陣列

    7-15

  • 【範例7_4_1】

    7-16

    比較用 Static所宣告的靜態陣列 x,和Dim宣告的動態陣列y的不同。

    【結果】

  • 【編寫程式碼】

    7-16~17

    第4-17行:程式執行三次, 每次都重新宣告靜態陣

    列x和動態陣列y。

    第8行:設靜態陣列x值為原 值加上i+1。

    第13行:設動態陣列y值為 原值加上i+1。

    由執行結果發現,靜態陣列重新宣告

    後仍會保留原陣列值;而動態陣 列重新宣告後元素值歸零。

  • 7-5 陣列的常用方法每個陣列均繼承自 System.Array 類別,Array類別提供一些有用的方法可以處理陣列,下面介紹一些常用的方法。

    一、Sort方法Sort方法可以快速而且簡單地將一維陣列的元素,由小排列到大排序。

    語法:Array.Sort (arrayname)功能:將指定一維陣列的元素值由小到大遞增排列

    【例】有一score整數陣列,使用Sort方法排序。Dim score () As Integer ={98,78,85,64}Array.Sort(score)【說明】排序後score陣列值為{64,78,85, 98}

    7-17

  • 二、Reverse方法Reverse方法可以將一維陣列的元素反轉排列,也就是第一個變成最後一個元素。如果先用Sort方法排序再用Reverse方法,就可以達到降冪排序的效果。語法:Array. Reverse (arrayname)功能:將指定一維陣列的元素值反轉排列

    【例】有一score陣列,使用Reverse、Sort方法排列。Dim score () As Integer ={98,78,85,64}Array. Reverse (score) ‘score={64,85,78,98 }Array.Sort(score) ‘score={64,78,85,98 }Array. Reverse (score) ‘score={98,85,78,64 }

    7-18

  • 三、IndexOf方法IndexOf方法可以由一維陣列中,由指定的索引指標元素開始,搜尋出符合指定物件的元素,並傳回第一個相符元素的索引指標。

    語法:Array. IndexOf (arrayname,Object [,index])功能:傳回一維陣列由指定索引指標開始,符合指定物件的元素索引指標

    【說明】index可以省略,省略時就由索引指標0開始搜尋。

    【例1】由score陣列中,找出第1個59。index = Array.IndexOf(score,59)【例2】由score陣列中,找出所有59的元素。Do

    index = Array.IndexOf(score,59,index+1)Loop While index>=0【說明】Array.IndexOf(score,59,index+1),表示由索引指標index+1開始搜尋。

    7-18~19

  • 清單方塊(ListBox)控制項主要是用來製作一連串的清單選項,以供使用者從清單中選取所要的項目。一、建立清單方塊控制項1.在工具箱中選取清單方塊工具。2.移指標至表單,按住滑鼠左鍵拖曳拉出適當大小後,放開左鍵。3.在屬性視窗中Items屬性的『…』鈕上按一下,出現「字串集合編輯器」對話方塊。4.在輸入框內逐行輸入選項,每輸入一個選項完畢就按『Enter』 鍵移到下一行繼續輸入下一個項目。5.所有項目都輸入完畢後,按 『確定』 鈕就完成ListBox清單控制項中項目的設定。

    7-6 清單方塊 ListBox

    7-19

  • 二、清單方塊常用的屬性

    7-20

    屬 性 說 明

    Text 在清單方塊中被選取的選項文字。

    SelectedIndex在清單方塊中被選取選項的索引指標。若是第一個選

    項,則索引指標為0;第二個,為1;第三個,為2;…。

    Items 清單方塊內所有選項內容之集合體。

    Sorted 清單方塊內的選項以字母順序排序。

    MultiColumns 設定清單方塊內選項是否多欄顯示,預設值為False。

    SelectionMode

    設定在清單方塊中選取選項的方式:None-沒有選取功能One-只能選取其中一個選項(預設值)MultiSimple-能配合Ctrl 鍵做簡單的多重選擇MultiExtended-能配合Ctrl、Shift 鍵做複雜的多重選擇

  • 三、Items屬性的用法所謂「清單」就是能提供選項供使用者選取,而清單方塊內的選項文字之建立、新增、移除、選項數量統計等方法,皆須賴Items屬性來完成。1.在設計階段中建立清單方塊內的選項文字,方法如前面所述。2.在執行階段中新增清單方塊內的選項,其語法如下:語法:ListBoxname.Items.Add(string)功能:在清單方塊選項後面再新增選項。【說明】  string:為字串變數或字串資料。 若清單方塊內尚未建立任何選項文字,則所新增的選項會成為清單內的第一個選項。【例】在ListBox1清單方塊中再新增三個選項,其寫法如下:Dim i As Integer Dim item_name() As String = {"咖啡", "綠茶", "豆漿"}For i = 0 To 2

    ListBox1.Items.Add(item_name(i))Next i

    7-21

  • 三、Items屬性的用法3. 在執行階段中移除清單方塊內指定的選項,其語法如下:語法:ListBoxname.Items. Remove(string)功能:由清單方塊選項中移除指定選項。【說明】string:為清單方塊內的選項內容。

    例1:移除ListBox1清單方塊中選項內容為「汽水」的選項,其寫法如下:ListBox1.Items.Remove(“汽水”)

    例2:移除ListBox1清單方塊中目前選取的選項,其寫法如下:ListBox1.Items.Remove(ListBox1.SelectedItem)

    7-21

  • 三、Items屬性的用法4. 在執行階段中移除清單方塊內全部的選項,其語法如下:

    語法:ListBoxname.Items.Clear功能:由清單方塊選項中移除全部選項。

    5. 在執行階段中取得清單方塊內選項的數目,其語法如下:

    語法:ListBoxname.Items.Count功能:取得清單方塊內所有選項的數目。

    7-22

  • 四、清單方塊常用的事件- SelectedIndexChanged事件清單方塊在程式執行時,得提供使用者選取選項,而當使用者選取了其中一個選項時,就會觸發SelectedIndexChanged事件。因此,把選取選項之後想讓系統做出反應動作的程式敘述,可寫在SelectedIndexChanged事件程序中。

    7-22

  • 【範例7_6_1】

    7-28

    從清單方塊中選取ListBox的常用屬性,會顯示該屬性的簡介。

    【執行結果】

  • 【問題分析】

    1.可以在程式執行階段用Add方法加入清單選項。

    2.先使用陣列存放各屬性的簡介,清單方塊的選項被選取時會觸動SelectedIndexChanged事件,在該事件中指定文字方塊顯示陣列中存放的簡介文字。

    7-23~24

  • 【介面設計】

    7-23

    屬性預設名稱

    Name(名稱)

    Font/Size(字骿大小)

    ListBox1 lstProperty (預設值)

    Label1 (預設值) (預設值)

    Label2 lblIntroduce 12

  • 【編寫程式碼】

    7-23~24

    第1行:設introduce為字串全域陣列,並設定 初值。

    第4-8行:用Add方法加入選 項。

    第9行:設定選取第一個選 項。

    第12行:設定lblIntroduce顯示 introduce陣列相對的元素。

  • 7-7 下拉式清單方塊 ComboBox

    下拉式清單方塊(ComboBox)控制項包含「清單方塊」控制項功能,而且另外還提供了可輸入文字功能的「文字方塊」。

    下拉式清單控制項和ListBox清單控制項大致相同,主要的差別清單控制項在表單中的大小是固定,至於下拉式清單控制項多了下拉鈕,而且當使用者按下拉鈕,下拉式清單控制項才顯示清單項目,如此可以節省版面空間,當然也可透過DropDownStyle屬性設為固定式。

    7-24

  • 一、建立下拉式清單方塊控制項

    1.在工具箱中選取下拉式清單方塊工具。2.移動指標至表單,按住滑鼠左鍵拖曳拉出適當大小後,放開左鍵。

    3.加入選項的方法和ListBox相同。

    7-25

  • 二、下拉式清單方塊的型式在「清單方塊」中一些常用的屬性皆通用於下拉式清單方塊,但「下拉式清單方塊」多了DropDownStyle屬性。

    DropDownStyle屬性值可決定下拉式清單方塊的型式,共分為三種,如下:

    7-25

    組合下拉式清單方塊 下拉式清單方塊 組合式清單方塊

    DropDownStyle屬性值為DropDown (預設值)

    DropDownStyle屬性

    值為DropDownListDropDownStyle屬性

    值為Simple

    按下拉鈕會顯示清單方

    塊。可直接在文字方塊

    輸入選項文字,或由拉

    出清單方塊中選取選

    項。

    按下拉鈕會顯示清單

    方塊。只能從清單方

    塊中選取選項,無法

    由文字方塊中輸入文

    字。

    執行時,可在文字方

    塊輸入文字。

  • 【範例7_7_1】

    7-25~26

    製作具有書店書籍進、售價查詢、修改和新增功能的程式。

    【執行結果】

  • 【問題分析】

    1.宣告book_name、book_money和book_sale三個全域陣列,分別存放書名、進價和售價。2.使用者選取要查詢的書籍選項後,根據ComboBox的SelectedIndex屬性,可以將相對進價和售價陣列元素,顯示在文字方塊中。3.如果書籍的進價或售價有更動時,按『修改』鈕時會存入相對陣列中。4.如果在下拉式清單方塊中輸入新的書目,按『修改』 鈕時用ReDim Preserve重新宣告陣列大小,然後將資料存入相對陣列中。

    7-26

  • 【介面設計】

    7-27

  • 【編寫程式碼】

    7-27~28

    第1-3行:宣告全域陣列,其中字串陣列book_name 存放書名、整數陣列book_money存放書本進

    價、整數陣列book_sale存放售價。

    第8-10行:用Add方法將 book_name陣列元素逐一

    指定給cboBook.Items。

    第11行:預設選取第1個選 項。

    第13-16行:當清單內的 選項被選取時,利用 SelectedIndex屬性將 選取書本的進價與售

    價,顯示在對應的文 字方塊中。

  • 【編寫程式碼】

    7-28~29

    第20-22行:用For迴圈檢查 cboBook.Text是否已經

    存在book_name陣列 中,若存在設same值為

    True。

    第23-35行:若same為True, 只存修改的進價和售價到

    陣列中。若same為False, 就要將陣列大小重新宣

    告,再將書名、進價和售 價到陣列中。

    第28-30行:重新宣告時要 用ReDim Preserve敘

    述,才能保存原值。

  • 7-8 ArrayList類別動態陣列與靜態陣列,這兩類陣列都有一個共同面對的問題,就是陣列的元素數目均為固定。

    Visual Basic提供了「ArrayList類別」,可以建立一個元素數目不固定陣列。使用ArrayList類別建立的陣列,其陣列中的每一個元素內容可存放任何型別的資料。

    7-29

  • 一、宣告ArrayList類別陣列語法:Dim arrayname As New System.Collections.ArrayList()功能:宣告用ArrayList類別所建立的陣列。

    【說明】

    1.arrayname:即陣列名稱,其命名方式和變數一樣。

    2.此類陣列屬Object資料型別,宣告時不須再指定資料型別。該陣列的元素可存放任何型別的資料。

    7-30

  • 二、ArrayList類別陣列常用的屬性

    7-30

    屬性 說 明

    Count 記錄ArrayList類別陣列的元素數目。

    Item 記錄ArrayList類別陣列的元素內容。

  • 三、ArrayList類別陣列常用的方法

    7-30

    方法 說 明

    Add新增一個元素到已宣告為ArrayList類別的陣列,新增的元素

    內容可為任意型別資料。

    Clear 清除ArrayList類別陣列內的所有元素,使元素數目為0。

    Contains搜尋指定的元素是否存在ArrayList類別陣列中,若存在則傳

    回True;否則傳回False。

    IndexOf搜尋指定的元素是否存在ArrayList類別陣列中,若存在則傳

    回元素所在索引指標位置;否則傳回一個負值。

    Insert插入一個元素到ArrayList類別陣列的指定索引指標位置。索

    引指標由0開始,接著是1、2、3 …。

    RemoveAt 移除ArrayList類別陣列指定索引指標位置的元素。

    Reverse 將ArrayList類別陣列的元素重新反轉排列。

    Sort 將ArrayList類別陣列的元素以升冪方式重新排列。

  • 【範例7_8_1】

    7-31

    利用ArrayList類別陣列設計一個簡易的醫院掛號系統按『新增』鈕,新增掛號姓名,將號碼和姓名顯示在掛號清單上。

    按『插入』鈕,輸入欲插入的掛號號碼。

    按『刪除』鈕,輸入就診號可以刪除或插入病患。

    按『清除』鈕,清除全部掛號名單。

    【執行結果】

  • 【問題分析】

    1.因為ArrayList可以任意增刪陣列中元素,所以可以適合用來做像掛號系統不斷易動內容的陣列。宣告s_name為全域的ArrayList陣列,存放掛號病患姓名。2.按『新增』鈕時,利用InputBox輸入姓名,然後用ArrayList的Add方法,新增元素到陣列中。3.按『插入』鈕時,利用InputBox輸入就診號,診號必須是清單上面有的才能繼續輸入就診姓名,然後用Insert方法,插入元素到陣列指定位置中。

    4.按『刪除』鈕時,利用InputBox輸入就診號,然後RemoveAt方法,移除陣列中指定的元素。5.按『清除』鈕時,利用ArrayList的Clear方法,清除陣列中所有元素。

    7-31

  • 7-32

    【介面設計】

    屬性預設名稱

    Name(名稱)

    Text(文字)

    Multiline(多行)

    ScrollBars(捲軸)

    Label1 (預設值) VB醫院掛號系統 - -

    TextBox1 txtList True Vertical

    Button1 btnAdd 新增 - -

    Button2 btnIns 插入 - -

    Button3 btnDel 刪除 - -

    Button4 btnClear 清除 - -

  • 【編寫程式碼】

    7-32~33

    第1行:宣告s_name為ArrayList類別陣列。

    第3-7行:依序由s_name陣 列讀取元素,在txtList中 顯示病患名單。

    第13行:呼叫Form1_load程 序顯示病患名單。因為

    程式碼相同,所以共用 程序以便程式維護。也 可以自訂Sub程序來共 用,Sub程序會在第9章

    介紹。

  • 【編寫程式碼】

    7-33

    第18-20行:用Do…Loop廻 圈接受就診號,直到輸

    入合乎範圍。

  • 【編寫程式碼】

    7-33~34

    Visual Basic 2005學習範本7-1 陣列投影片編號 37-2 陣列的宣告與使用範例範例投影片編號 7投影片編號 8投影片編號 9投影片編號 10投影片編號 11投影片編號 12投影片編號 13【範例7_2_1】【編寫程式碼】7-3 二維陣列投影片編號 17投影片編號 18【範例7_3_1】【編寫程式碼】【編寫程式碼】7-4 靜態陣列與動態陣列一、宣告動態陣列【例】認識ReDim的使用方法:二、保留陣列先前的元素內容三、宣告靜態陣列四、清除陣列【範例7_4_1】【編寫程式碼】7-5 陣列的常用方法投影片編號 31投影片編號 327-6 清單方塊 ListBox投影片編號 34投影片編號 35投影片編號 36投影片編號 37投影片編號 38【範例7_6_1】【問題分析】【介面設計】【編寫程式碼】7-7 下拉式清單方塊 ComboBox投影片編號 44投影片編號 45【範例7_7_1】【問題分析】【介面設計】【編寫程式碼】【編寫程式碼】7-8 ArrayList類別投影片編號 52投影片編號 53投影片編號 54【範例7_8_1】【問題分析】投影片編號 57【編寫程式碼】【編寫程式碼】【編寫程式碼】