1.93k likes | 2.07k Vues
第 8 章. 陣列. 本章重點提要. 8-1 陣列的基本觀念與用法 8-2 陣列進階 8-3 ListBox ( 清單方塊 ) 控制項 8-4 ComboBox ( 下拉式清單方塊 ) 控制項. 本章閱讀建議. 本章閱讀建議新觀念 Microsoft Visual Basic 程式設計陣列是一種儲存資料的結構 , 經常用於多筆資料的處理工作中 , 可以說是變數的功能延伸 , 是提升程式效率一定要會的基礎。底下是本章各節的閱讀建議:. 本章閱讀建議.
E N D
第 8 章 陣列
本章重點提要 • 8-1陣列的基本觀念與用法 • 8-2 陣列進階 • 8-3 ListBox (清單方塊) 控制項 • 8-4 ComboBox (下拉式清單方塊) 控制項
本章閱讀建議 • 本章閱讀建議新觀念 Microsoft Visual Basic 程式設計陣列是一種儲存資料的結構, 經常用於多筆資料的處理工作中, 可以說是變數的功能延伸, 是提升程式效率一定要會的基礎。底下是本章各節的閱讀建議:
本章閱讀建議 • 8-1 陣列的基本觀念與用法:陣列對初學者來說可能比較陌生, 學習的重點在於如何宣告陣列、以及如何存取陣列中的資料。讀者只要跟著上機實例操作, 很快就能熟悉陣列的基本用法。 • 8-2 陣列進階:陣列的進階用法包含:排序、搜尋、二維陣列...等, 在進階程式設計中, 這些主題經常會被用到。本節的上機實例比較難一點, 但多花點時間學習卻是值得的。
本章閱讀建議 • 8-3 ListBox (清單方塊) 控制項:ListBox 是一種『可以顯示多項資料供使用者選取』的控制項, 具備了單選、複選、排序、搜尋...等功能, 閱讀時建議透過上機實例來瞭解這些功能。 • 8-4 ComboBox (下拉式清單方塊) 控制項:ComboBox 就是將TextBox 及 ListBox 組合起來的控制項, 讓使用者可以用打字或選取的方式來輸入資料。學會 ListBox 後再來學 ComboBox,應該會覺得很輕鬆才對。
8-1 陣列的基本觀念與用法 • 陣列 (Array) 與變數一樣, 都是用來儲存資料, 所不同的是每一個變數只能儲存一項資料, 而每一個陣列則可儲存多項的資料。
陣列的宣告與使用 • 陣列必須先宣告才能使用, 宣告的格式和變數很像, 例如: • 最簡單的陣列宣告格式是:
陣列的宣告與使用 • 其中 N 代表最後一項資料的編號, 例如:
陣列的宣告與使用 • 一旦宣告了陣列, 我們就可以使用『陣列名稱(編號)』的方式, 來存取陣列中指定編號的資料項, 例如:
陣列的宣告與使用 • 在術語上, 陣列中的每一個資料項叫做一個『元素』(Element), 用來指定某一個元素的 0、1、2、... 編號, 則叫做『索引』(Index)或『註標』(Subscript), 如下圖所示: • 請注意, Dim X(4) 所宣告的陣列是包含 5 個元素 (索引 0~4), 而非 4個元素喔!
指定陣列的資料型別 • 在宣告陣列時也可以用 As 來指定資料型別, 其寫法就和宣告變數一樣, 例如:
指定陣列的資料型別 • 在宣告陣列時指定資料型別, 會有什麼好處?(可複選) (1) 在存取陣列中的元素時, 會比較有彈性。 (2) 可以提升執行效率。 (3) 程式比較不容易出錯。 (4) 讓程式變得比較複雜, 以避免被別人看懂。
指定陣列的資料型別 (2)、(3) 不宣告型別時, 在使用上會比較有彈性, 因為可以將任意型別的資料存入陣列元素中。若將陣列宣告為特定型別, 則只能存入該型別的資料, 因此彈性較低;但也由於型別固定, 所以執行效率會比較好, 同時也可避免存入錯誤型別的資料, 例如將字串資料存入成績陣列中, 那麼在比較成績時 "100" 會小於 "99" (因為字串是由第 1個字元開始比較)!
陣列的型別 vs 陣列中元素的型別 • 當我們宣告了陣列的型別時, 例如: • 那麼 X 陣列中的每個元素 (X(0)、X(1)) 都是 String 型別, 而 X 陣列本身則為『String()』型別。換句話說, 在型別名稱後面加上 (), 就表示其為陣列的型別,例如 Byte()、Integer() 等。
陣列的型別 vs 陣列中元素的型別 • 另外, 陣列的大小與陣列型別無關, 例如:
使用陣列的注意事項 • 使用陣列時應注意以下幾件事: • 不能夠一次讀取或指定整個陣列的資料, 例如:
使用陣列的注意事項 • 存取陣列中的元素時, 所指定的索引不能超出陣列的索引範圍,例如:
陣列的優點 • 陣列的優點, 就是可以把多個資料項排列起來, 然後用數值的編號(索引) 來存取。例如, 我們將 5 項資料放到 5 個變數裡面, 那麼要輸出時就必須一一指定變數名稱:
陣列的優點 • 如果我們把這 5 項資料放在陣列裡面, 那麼只需要一個 For 迴圈就可以把它們全部輸出了, 例如:
陣列的優點 • 而即使資料的項數多達 100 項, 也只要將上述程式 For 敘述中的 4 改成 99, 就可輸出全部的資料;但若換成輸出 100 個變數可就累了。 • 寫一主控台程式可輸入 5 份數值資料, 然後顛倒順序輸出這 5 份資料。 • 建立主控台應用程式專案 Ch08-01。 • 在程式模組中輸入以下程式:
陣列的優點 • 執行程式, 假設依序輸入 10, 20, 30, 40, 50 五份資料, 則程式執行結果如下: 在以上程式中, 我們使用 Val() 函式將輸入的資料轉換為數值。請注意第二個 For 迴圈要加上『Step -1』, 否則程式不會進入該迴圈執行!
陣列的優點 • 寫一程式輸入 5 個數值資料, 輸入完畢後, 輸出這 5 個數值的最大值及最小值。 • 建立主控台應用程式專案 Ch08-02。 • 在程式模組中輸入以下程式:
陣列的優點 • 執行程式, 假設依序輸入 10, 100, -99, 345, 50 五份整數,則程式執行結果如下:
陣列的優點 一開始還不知道最小值 (Min) 及最大值 (Max), 所以先將陣列第 0個元素視為最小值及最大值;接著, 就用迴圈來與第 1~4 個元素比較, 如果有更小的值則將之設為最小值, 如果有更大的值則將之設為最大值。當所有的元素都比完之後, 就可將最小值 (Min) 及最大值 (Max) 顯示出來了。
陣列的優點 • 想想看, 如果修改第 2 及 6 行的程式: 然後重新執行程式, 並輸入同樣的資料, 猜猜看結果如何?結果最小值為 -99, 但最大值卻是 50 (而不是 345), 這是為什麼呢?
陣列的優點 Console.ReadLine() 會讀入『字串』資料, 由於在宣告陣列及變數時沒有指定型別, 因此輸入的字串會直接存入陣列中並拿來做比較, 而在比較字串時 "50" 會大於 "345", 所以最大值會變成 "50", 而不是 "345"。
陣列的初值設定 • 就像變數可以在宣告時指定初值一樣, 陣列也不例外, 請看以下實例: • 設定的方式是將所有資料以逗號分隔, 然後寫在 { } 裡面。不過請注意, 指定初值時, 不能再指定最大索引值:
陣列的初值設定 • 當指定初值時, VB 會自動計算元素個數, 以上面的 X 陣列來說, 其元素有 3 個, 因此索引範圍是 0~2。另外, 陣列的型別並不受初值的影響, 這一點和變數不同, 例如底下我們用 Typename() 函式來查看型別:
陣列的初值設定 • 陣列的型別名稱後面必須加小括號, 例如『String()』就是指『字串陣列』型別。在 String() 型別的陣列中, 每個元素均為 String 型別。
陣列的初值設定 • 顯示春、夏、秋、冬四季的中英文對照表。 • 建立 Windows 應用程式專案 Ch08-03。
陣列的初值設定 • 在表單中加入一 Label 控制項並將其 Font/Size 屬性設為 20:
陣列的初值設定 • 在表單空白處雙按滑鼠, 建立表單的 Load 事件程序:
陣列的初值設定 • 按[F5] 鍵執行程式, 即可顯示四季的中英文對照表。
陣列的初值設定 • 因為中文季節及英文季節的陣列索引範圍是 0~3。那為什麼要將3 改成 Ubound(中文季節) 呢?因為 UBound() 會自動算出陣列後一個元素的索引值! • 以中文季節為例, 最後一個元素的索引是3, 所以 Ubound(中文季節) 就等於 3;使用 UBound 的優點是不用自己計算陣列示素的個數, 以避免不必要的錯誤。
陣列的初值設定 • 某公司有 5 個員工, 請建立一登入程式, 員工必須輸入正確的『帳號』及『密碼』才能登入。
陣列的初值設定 • 建立 Windows Form 應用程式專案 Ch08-04。 • 在表單中加入控制項並設定如下:
陣列的初值設定 • 雙按 Button1 按鈕, 撰寫程式如下:
陣列的初值設定 • 按[F5]鍵實地測試看看。
陣列的初值設定 • 建立一主控台程式, 可讓使用者輸入 1~7 的數值, 然後顯示該數值對應到星期幾, 如下圖所示。若輸入 1~7 以外的資料, 則結束程式。
For Each:不需要計數器的 For 迴圈 • For Each 是 For 迴圈的變形, 可以由陣列中一一取出每一個元素來處理, 寫法如下: • 例如底下是將陣列中所有元素加總起來的程式:
For Each:不需要計數器的 For 迴圈 • 變數 n 也可以在 For Each 之前事先宣告好, 若沒事先宣告則在 For Each 中會自動宣告, 並且可以用 As 來指定型別。 • 寫一程式讓使用者輸入一串以逗號分隔的成績資料, 然後顯示所有成績的筆數、總分、及平均, 如下圖所示。
For Each:不需要計數器的 For 迴圈 • 開啟範例專案 Ch08-05, 我們已準備好所需的表單及控制項:
For Each:不需要計數器的 For 迴圈 • 請雙按 Button1, 建立 Button1.Click 事件程序: