Download presentation
Presentation is loading. Please wait.
Published by诲 穆 Modified 8年之前
1
Visual Basic 2010 程式設計經典 第 4 章 陣列與自定程序
2
4.1 陣列 一個變數只能存放一個資料,程式中需要使用大量且 同一性質資料時,若宣告大量的變數將顯得非常麻煩。 例如,輸入 1,000 位學生的計概成績,就必須使用 1,000 個不同的變數名稱來存放,如此將增加程式的複 雜度和命名上的困擾,且維護及偵錯程式的困難度也 會提高。 因此在 VB 中我們可使用「陣列」解決這個問題。
3
4.1.1 陣列的宣告與建立 「陣列」是一群資料性質和資料型別相同的變數集合, 而且陣列中所有資料在記憶體中佔有連續位址空間。 陣列中每一個變數稱為「陣列元素」,每個陣列元素 在程式中都以陣列名稱接大括號來表示,大括號內所 存放的是該陣列元素中位於陣列中由 0 開始算起的第幾 個位置,大括號內的數值我們稱之為「索引」 (Index) 或稱「註標」 (Subscript) 。 陣列中的元素都是由 0 開始算起,因此陣列中的第一個 資料稱為「第零個元素」 (Zeroth Element) 其索引值為 0 ,其它以此類推。
4
例如:欲記錄五位學生的計概成績,本來需要使用五 個不同變數名稱來存放成績,由於這些成績都是屬於 同性質的資料,就可以宣告一個陣列名稱為 score 的整 數陣列,共含有五個陣列元素,其寫法為: Dim score(4) As Integer 此時 VB 會如下圖產生 score(0)~score(4) 共五個陣列元 素,而且每個陣列元素內所存放的都是整數。
6
使用 Dim 宣告陣列時,若陣列名稱後面只接一 個索引,則稱為一維 (One Dimension) 陣列; 若接兩個索引,則稱為二維 (Two Dimension) 陣列以此類推, VB 最多允許使用 32 維陣列。 每一維的長度都不為 0 ,而且每一維的索引 ( 或 稱註標 ) 是由零開始算起。 索引必須為數值常數、數值變數或是數值運算 式。 宣告陣列同時未設定初值,若是數值陣列各陣 列元素的預設值為 0 ,字串陣列其元素的預設 值為 ""( 空字串 ) ,陣列的宣告語法如下:
9
4.1.2 陣列的初值設定 陣列元素可視為一個變數,因此宣告陣列後,可 使用「 = 」指定運算子來直接設定每個陣列元素的 初值。 譬如先建立 score 整數陣列,共有 score(0)~score(4) 五個陣列元素,接著再逐一指 定 score(0)~score(4) 五個陣列元素的初值。其寫 法如下: Dim score(4) As Integer score(0)=50: score(1)=70 : score(2)=65 : score(3)=99 :score(4)=78
10
VB 亦允許將上面宣告陣列和設定陣列元素初值兩 行敘述合併書寫成一行敘述。其做法如下。
12
4.1.3 陣列常用的屬性與方法
15
4.1.4 foreach… 敘述
18
4.1.5 陣列的排序與搜尋
23
4.2 不規則陣列 在上節所建立的二維陣列,由於每一列 (Row) 的長度 都相同,可用來製作一般表格。 VB 另外提供一個建立特殊的二維陣列,陣列中的每 一列的長度可以不相同,稱為「不規則陣列」。 所謂的不規則陣列就是陣列中還可以存放陣列,每 一列的長度不相同,可以用來建立每列不同長度的 表格。不規則陣列的語法如下: Dim 陣列名稱 ( 陣列大小 )() As 資料型別
29
4.3 自定程序 方案中可能有些具有小功能的程式區段需多次重 複出現,我們可將該敘述區段寫成一個小單元, 稱為「自定程序」簡稱「程序」,以供本方案多 次呼叫使用或供其它方案套用。 程式中有了程序,除可縮短程式的長度外且程序 有錯誤 (Bug) 需要修改時,可侷限在程序本身而不 必修改多處,當然也可將程序隨時抽換成具有更 強功能的程序。 在撰寫一個大型的方案程式,方案可以功能為導 向,將程式切割成多個小功能,每個功能都必須 能夠單獨寫成一個程序,除了能在本方案中重複 呼叫外,而且能套用到其他方案程式呼叫使用。
30
1. 可重複使用,縮短程式的長度,方便除錯和 維護。 2. 由於程序邏輯簡單明確,可使整個程式變得 精簡且可讀性高。 3. 可套用或稍加修改給其他方案使用。 4. 程序具有模組化,可以將大程式切割成數個 程序,由多人來撰寫,不但可縮短程式開發 的時間,且集眾人之智慧,使得程式達到盡 善盡美的技術境界。
31
VB 所提供的自定程序可分成下列四大類: 1.Sub 自定程序: 此種程序本身不會傳回值,只能透過引數傳回値。 2.Function 自定程序: 此種程序本身可傳回值,也可透過引數傳回値。 Function 自定程序亦稱為 Function 自定函式。 3.Event 自定程序: 此種程序本身不會傳回值。 4.Property 自定程序: 此種程序本身用來傳回和設定物件的屬性。 ( 參考第 六章 )
32
4.4 自定程序的使用 當您使用 VB 來撰寫較複雜的程式時,可應程式的需求, 將程式中具有特定功能的部份獨立出來成為較小的邏 輯單元,並個別編輯成 Sub 程序或 Function 程序,以供 「事件處理程序」或其它程序呼叫使用。 獨立出來的邏輯單元並非系統所提供的,而是程式設 計者應程式需求而產生的自定程序,我們將這些邏輯 單元稱為「使用者自定程序」或稱「一般程序」。 一般程序可寫在模組或類別中。 一般程序必須在程式中先定義後才可呼叫使用。
33
4.4.1 如何定義 Sub 自定程序
35
4.4.2 如何呼叫 Sub 自定程序
38
4.4.3 如何定義 Function 自定程序 Sub 程序和 Function 程序兩者都可以做引數傳遞,可以由 呼叫敘述所傳遞過來的常數、變數、或運算式代入 Sub 程 序和 Function 自定程序內引數, Function 自定程序亦稱 Funcytion 自定函式也可簡稱為函式。 兩者使用上主要差異是, Function 自定程序可使用 Return 敘述傳回值 。 Sub 程序本身則沒有傳回值。但 Function 由於有傳回值, 因此必須將傳回值指定給一個變數,而 Sub 則不必。 Function 的定義語法如下: Function
39
4.4.4 如何呼叫 Function 自定程序
42
4.5 引數的傳遞方式 當您使用 Return 敘述或 函式名稱 = 運算式 時,一 次只能傳回一個值再返回到原呼叫處。 若程序 A 某個敘述呼叫另一個程序 B 時,需要一次 能傳回兩個以上的值時,使用 Return 敘述 或 函式名稱 = 運算式 便無法做到,此時就必須使用 參考呼叫來達成。 程序中引數的傳遞方式有下面二種: 1. 傳值呼叫 (Call By Value) 2. 參考呼叫 (Call By Reference)
43
4.5.1 傳值呼叫 被呼叫程序中的虛引數使用 ByVal 來宣告,當呼叫程序時, 此時呼叫程序的實引數會複製一份給被呼叫程序的虛引 數,因此實引數與虛引數兩者佔用不同的記憶體位址。 被呼叫程序內的虛引數被修改時,結果並不會影響對應 的實引數而產生副作用。此種程序的引數傳遞方式稱為 「傳值呼叫」。 若省略不寫 ByVal ,則 VB 預設為傳值呼叫。 適用於希望程序內的結果不影響該程序外的變數時使用, 具有保護變數不被修改的特性。傳值呼叫中,實引數可 為變數、常數或運算式。
47
4.5.2 參考呼叫 自定程序 A 呼叫自定程序 B 時,若希望將自定程序 B 的 執行結果回傳給自定程序 A ,使用傳值呼叫是無法做到 的。 若能將實引數和虛引數彼此對應的引數設成佔用相同 的記憶體位址,此時虛引數一有改變,對應的實引數 亦跟著改變,便可將自定程序 B 執行的結果回傳給自定 程序 A ,此種程序引數的傳遞方式稱為「參考呼叫」。 其操作方式只要將虛引數的引數宣告為 ByRef ,即成 為參考呼叫。 注意「參考呼叫」的實引數一定要使用變數,不可為 常數或運算式,而且變數必須給予初值才能使用。
51
4.6 如何在方法間傳遞陣列 在「一般程序」中虛引數若為陣列,只要在陣列 名稱後加 ( ) 號即可,內部不要寫陣列大小值。 而在呼叫程序中,實引數用陣列名稱即可,因為 陣列名稱所存的即是此陣列的起始位址。 使用整個陣列當引數傳遞即視為參考呼叫。整個 陣列傳遞方式寫法如下:
55
4.7 陣列元素可彈性 呼叫自定程序時是傳遞整個陣列,若只要傳遞部分陣 列元素時只要在程序中虛引數的陣列名稱後加一對小 括號 ( ) ,並在陣列名稱前面加 ParamArray ,此時即可 在呼叫敘述的實引數內直接置放陣列元素的值,而且 元素個數不受限制。其語法如下:
59
4.8 程序多載 自定程序 (Sub 與 Function) 的多載是指程式中可建 立多個相同名稱的自定程序。 執行時視其自定程序內虛引數的引數個數或引數 資料型別的不同來呼叫對應的自定程序,如此可 讓使用者減少自定程序命名的困擾。 譬如下面 sum() 自定函式有四個程序多載:
60
sum(2,3) sum(2,3,4) sum("a", "b") sum("a", "b", "c")
63
4.9 變數的生命週期 變數在不同層級中宣告,有其不同的生命期與使用範圍。 一般變數層級由高而低可分為模組 ( 或類別 ) 、程序和程式 區段三種。 在模組等級所宣告變數,可適用於程序或程式區段中。 在程式區段內 ( 在 For 、 Do 、 If) 所宣告的變數,若其名稱與 模組中所宣告的變數名稱相同,兩者在主記憶體中是佔用 不同的位置,因此,彼此獨立不相關。 至於在程式區段內使用到該變數,是拿到程式區段內所宣 告的變數而非模組所宣告的變數。
64
譬如下面範例 (FileName:ConsoleVarLife1.sln) 即是模組 和 If 區段內都有變數 n 宣告:
65
譬如 Module1 和 t1 為不同的模組,若 Module1 希望參用 t1 的變 數,可在 t1 中宣告公用變數前加上 Public , Module1 即可參用 到該變數,至於 Module1 在 For 、 Do 、 If 區段內所宣告的變數有 效範圍只在該區段內,一離開即失效,其完整寫法如下 (FileName:ConsoleVarLife2.sln) :
Similar presentations