1.07k likes | 1.27k Views
ASP.NET 網頁製作教本 – 從基本語法學起. 第4章 VB.NET 程式與 網頁製作的應用. 4-1 陣列 ( Array). 陣列 ( Array). 陣列的宣告與使用(1). 陣列必須先宣告才能使用,其宣告格式與變數的宣告很像 最簡單的陣列宣告格式是:. Dim 陣列名稱 ( N). 陣列的宣告與使用(2). 其中 N 代表陣列中最後一項資料的順序,例如:. 陣列的宣告與使用(3). 一旦宣告了陣列,我們就可以存取陣列中各單項的資料,存取的方法是在陣列名稱之後加上 " (資料順序) " ,例如:.
E N D
ASP.NET 網頁製作教本 –從基本語法學起 第4章 VB.NET 程式與網頁製作的應用
陣列的宣告與使用(1) • 陣列必須先宣告才能使用,其宣告格式與變數的宣告很像 • 最簡單的陣列宣告格式是: Dim 陣列名稱(N)
陣列的宣告與使用(2) • 其中N 代表陣列中最後一項資料的順序,例如:
陣列的宣告與使用(3) • 一旦宣告了陣列,我們就可以存取陣列中各單項的資料,存取的方法是在陣列名稱之後加上 "(資料順序)",例如: X(0) = 168 ‘ 將 168 存到陣列X 的第 0 項資料中X(1) = 350 ’ 將 350 存到陣列X 的第 1 項資料中X(2) = X(0) + X(1) ‘ 分別取出陣列X 的第 0 項及第 1 項資料, ' 相加後,存到第 2 項資料中
陣列的宣告與使用(4) • 在術語上,陣列中的每一項資料叫做一個元素(element),而用來指定某一個元素的 0、1、2、…順序叫做註標(subscript),如下:
陣列的初值設定 • 實例: • 所有資料以逗號(,)分隔,然後撰寫在 { } 裡面,不過請注意 ( ) 裡面不可以含有 N,例如以下的宣告式是錯誤的: • 含有初值設定的陣列,VB 會自動計算其元素個數,以上面的 X 陣列為例,含有三個元素,所以有效的註標範圍是 0~2。 Dim A = "我是變數" ' 變數的初值設定Dim X() = { "Word", "Excel", "Access" } ' 陣列的初值設定 Dim X(2) = { "Word", "Excel", "Access" } ' 錯誤
設定陣列的資料型別 Dim 陣列名稱(N) As 資料型別 • 「As 資料型別」其作用是設定陣列元素的資料型別,例如: Dim Y(10) As Integer ‘ 宣告一個含有11個元素的陣列而每 ' 一個陣列元素的資料型別都是整數
陣列的優點 (1) • 例如我們把 5 項資料放在 5 個變數裡面 : Dim A, B, C, D, EA = "Word"B = "Excel"C = "PowerPoint"D = "Access"E = "Outlook"
陣列的優點(2) • 將它們逐行輸出,必須使用 5 個敘述: Response.Write( A & "<P>" )Response.Write( B & "<P>")Response.Write( C & "<P>")Response.Write( D & "<P>" )Response.Write( E & "<P>" )
陣列的優點 (3) • 如果我們把這 5 項資料放在陣列裡面,則只需三行敘述就可以將它們全部輸出,如下: Dim IDim X() = {"Word", "Excel", "PowerPoint", "Access", "Outlook"}' 輸出X的5個元素,只需以下三行敘述For I = 0 To 4 Response.Write( X(I) & "<P>" )Next
陣列的優點 (4) • 即使資料的項數多達 100項,也只要將上述程式 For 敘述中的 4 改成 99,就可以輸出全部資料,不像輸出 100個變數需要撰寫 100 個敘述。
Ubound 函數(1) • Ubound 是 VB 所提供的函數,用途是讀取陣列中最大的註標,使用時須傳入陣列的名稱。 For I = 0 To UBound(X) Response.Write( X(I) & "<P>" )Next
Ubound 函數(2) • 例如 UBound(X) 表示讀取 X 陣列中最大的註標,假設 X 陣列的元素包含 X(0)~X(4),則 UBound(X) 等於 4,如果 X 陣列的元素包含 X(0)~X(2),則 UBound(X) 等於 2,因為 Ubound 具有此一特性,所以不管 X 陣列有何變動,以上的 For 迴圈都不必跟著修改。
重新設定陣列的大小 (1) • 用 Dim 宣告一個陣列之後,其大小就確定下來了,例如: Dim X(5) As Integer ' X陣列的大小 = 6Dim Y() = {1, 2, 3 } ' Y陣列的大小 = 3Dim Z() ' Z陣列的大小 = 0, 空陣列
重新設定陣列的大小 (2) • 動態改變陣列的大小,必須使用 ReDim敘述,假設原有一陣列 A,而我們想將其大小改變成 11,則敘述如下: ReDim A(10)' 將A陣列的大小改成11, 內容全部歸零或ReDim Preserve A(10)' 將A陣列的大小改成11, 但保留原內容
重新設定陣列的大小 (3) • Preserve 保留字的使用: 程式一、Dim A() = { "Word", "Excel", "Access" }ReDim A(5)Response.Write( A(0) ) ' 輸出: (無資料) 程式二、Dim A() = { "Word", "Excel", "Access" }ReDim Preserve A(5)Response.Write( A(0) ) ' 輸出: Word
重新設定陣列的大小 (4) • 程式一在執行 ReDim 敘述之後,原本 A(0)、A(1)、A(2) 所含有的 "Word", "Excel", "Access" 資料都會消失,而程式二則會保留A(0)、A(1)、A(2) 原有的資料。
練習(1) • 有三個陣列如下: Dim Book() = {"F8308", "F8315", "F8316", "F8317"} Dim Name() = {"VB6 與 Windows API 講座", "新觀念的 VB6 教本", _ "VB6 實戰講座", "VB6 資料庫程式設計"} Dim Title() = {"VB專業人員最不可或缺的一本書", _ "一本為完全初學者所寫的書", _ "一本實用的‧技術的‧資訊完整的書", _ "從實務經驗中整理出來的資料庫設計寶典"}
練習(2) • 將它們輸出成為下圖:(提示:須使用 <DL>、<DT>、<DD>、及 <BR> 標示)
陣列與排序 (1) • 排序(Sort)是指將一連串資料從小排到大,例如 { 3, 9, 15, 8, 4 }排序後就成為 { 3, 4, 8, 9, 15 },只要呼叫 Array.Sort 這個方法,就可以完成陣列資料的排序,請看以下例子: Dim X() As Integer = { 3, 9, 15, 8, 4 }Array.Sort( X ) ' 呼叫Array.Sort之後, X 變成{ 3, 4, 8, 9, 15 }
陣列與搜尋(1) • 搜尋陣列中是否含有某一種資料,舉例來說,有一「姓名」陣列如下: • 如何找到 "Peter" 在「姓名」陣列中的註標(位置)呢? Dim 姓名() = { "Adam", "Alan", "Peter", "Jhon", "Tom" }
陣列與搜尋 (2) • 如果用 For 迴圈搜尋資料: Dim I As IntegerFor I = 0 To UBound(姓名)If 姓名(I) = "Peter" Then ' 表示已經搜尋到資料Response.Write( "Peter 的註標是 " & I ) Exit For ' 離開 For 迴圈End IfNextIf I > UBound(姓名)Then Response.Write( "Peter 不存在於「姓名」陣列" )End If
陣列與搜尋 (3) • 呼叫 Array.IndexOf 方法才是更高明的方法,同樣是搜尋「姓名」陣列中是否含有 “Peter”,改用 Array.IndexOf 方法的程式如下: I = Array.IndexOf(姓名, "Peter")If I >= 0 Then Response.Write("Peter 的註標是 " & I)Else Response.Write("Peter 不存在於「姓名」陣列")End If
陣列與搜尋 (4) • 有關 Array.IndexOf 的用法是: • 傳回值表示搜尋的結果,當傳回值<0時,表示沒有搜尋到資料;當傳回值≧0時,表示已經搜尋到資料,而傳回值等於欲搜尋的資料在陣列中的位置,以上面的例子為例,“Peter” 在「姓名」陣列的位置等於 2,所以傳回值等於2。
應用實例(1) • 陣列經常用在對照表的查詢,一個陣列存放著某些名詞,而第二個陣列存放著名詞的解釋,例如: Dim 名詞 () = {“HTML”, “ASP”, “ADO”, “RDS” }Dim 解釋 () = {“HyperText Markup Language, 超文字標示語言”, _ “Active Server Pages, 動態伺服端網頁”, _“ActiveX Data Object, 資料存取物件”, _“Remote Data Service, 遠端資料存取服務"}
應用實例(2) • 那麼讓上網者輸入名詞,然後查詢該名詞的解釋,所撰寫的程式將如下: Dim data = Request("Name") ' 讀取上網者所輸入的名詞 Dim I = Array.IndexOf( 名詞, data ) If I >= 0 Then Response.Write( "<DL>" ) Response.Write( "<DT>" & 名詞(I) ) Response.Write( "<DD>" & 解釋(I) ) Response.Write( "</DL>" ) Else Response.Write( data & " 沒有對應的名詞解釋" ) End If
應用實例(3) • 輸入以下網址,以檢驗程式執行的情況: • (1)Name=VBScript:I 值 < 0,會顯示「VBScript 沒有對應的名詞解釋」。(2) Name=ASP:由於「名詞(1)」等於 “ASP”,所以 I 值將等於 1,而顯示: (1) http://localhost/kjaspx/ch04/NameExp.aspx?Name=VBScript(2) http://localhost/kjaspx/ch04/NameExp.aspx?Name=ASP
練習 • 河狸國小三年甲班有 20 位同學,老師想要將第一次期中考的 ASP 成績公布於score.aspx 網頁,讓同學自行上網查詢,查詢的方法是「score.aspx?Num=學號」,請幫這位老師完成此一網頁。(註:三年甲班 20 位同學的學號是 3101~3120,而分數就讓您來決定吧) (提示:將學號 "3101"~"3120" 存放在第一個陣列,而每一位學生的成績則存放在第二個陣列)
搜尋多筆資料(1) • 有時陣列中會有一些相同的資料,例如我們想找出陣列中所有 100 分的同學,該怎麼找呢?假設資料存放成以下兩個陣列: Dim 同學() = {"陳桶一", "黃光權", "胡生妙", "王為全", _ "李日正", "劉德菖", "方正一", "劉康寶", _ "謝掬花", "王美蘭", "徐小噹", "葉小毛"} Dim 數學() = {90, 58, 41, 100, 59, 28, 100, 0, 100, 41, 91, 0}
搜尋多筆資料(2) • 那麼所撰寫的搜尋程式將如下: Dim I = Array.IndexOf(數學, 100) While I >= 0 ' 表示搜尋到資料 Response.Write ( 同學(I) & "<P>" ) I = Array.IndexOf(數學, 100, I + 1) End While
搜尋多筆資料(3) • 以上程式出現了兩個 Array.IndexOf,而第二個 Array.IndexOf 比第一個Array.IndexOf 多了一個參數:
二維陣列 (1) • 陣列也可以存放表格式的資料,例如:
二維陣列 (2) • 以這個表格為例,計有 5 列、4 行,所以共有 5×4 項資料,如果使用陣列來儲存,則陣列寫成:
二維陣列 (3) • 像這樣含有兩個註標的陣列,稱為二維陣列,而存取二維陣列的資料也會使用到兩個註標,例如: X(1, 2) = 0.42 ' 將第 1 列、第 2 行的資料指定成 0.42Response.Write(X(3, 2)) ' 輸出第 3 列、第 2 行的資料
二維陣列 (4) • 如果我們將整個陣列的註標標示出來,則是:
二維陣列資料的輸出(1) • 如果要對整個二維陣列的資料進行輸出,通常要使用 For-Next 巢狀迴圈,例如: Dim I, JDim X(4,3)For I = 0 To 4 Response.Write( "<BR>輸出第 " & I & "列資料<BR>" ) For J = 0 To 3 Response.Write( "(" & I & "," & J & ") = " ) Response.Write( X(I, J) & "<BR>" ) Next Next
二維陣列資料的輸出 (2) • 程式以「列」為外迴圈,所以外迴圈每執行一次,便輸出一橫列的資料。如果以「行」為外迴圈,則外迴圈每執行一次,便輸出一直行,程式如下: Dim I, JDim X(4,3)For J = 0 To 3 Response.Write( "<BR>輸出第 " & J & " 行資料<BR>" ) For I = 0 To 4 Response.Write( "(" & I & "," & J & ") = " ) Response.Write( X(I, J) & "<BR>" ) Next Next
練習 • 修改剛才的 2D1.aspx,使其二維陣列輸出成:
多維陣列 • 除了一維跟二維陣列之外,我們也可以建立一個多維陣列,如下: • 例如: Dim Z(3, 4, 5, 6, 9) ‘ 宣告一個五維陣列, 可儲存的資料數 ' 共有 (3+1)(4+1)(5+1)(6+1)(9+1)=8400
<script> 標示 • 副程式與函數必須放在 <script> 與 </script> 標示之間,例如: • 在 <script> 標示中,Language 參數設定成“VB”,表示其中的程式語言為 VB,runat 參數設定成“server”,表示其中的程式將會在 server 端執行。 <script Language="VB" runat="server"> Sub 副程式X ‘ 在此撰寫副程式X的程式碼 End Sub </script>
從「敘述區塊」到「副程式」(1) • 將敘述區塊轉換成副程式,先看以下程式: <%Dim Name As StringDim score As IntegerName = "張無忌"score = 51Response.Write( Name & ", " )If score >= 60 Then Response.Write( "你及格了!" )ElseIf score >= 50 Then Response.Write( "你可以補考!" )Else Response.Write( "你被當掉了!" )End If Response.Write( "<HR>" )%>
從「敘述區塊」到「副程式」(2) <% Name = "張無忌" score = 51 Call IsScorePassed Response.Write( "<HR>" ) %> <script Language="VB" runat="server"> Dim Name As String Dim score As Integer Sub IsScorePassed Response.Write( Name & ", " ) If score >= 60 Then Response.Write( "你及格了!" ) ElseIf score >= 50 Then Response.Write( "你可以補考!" ) Else Response.Write( "你被當掉了!" ) End If End Sub </script>
練習 • 將「If week = 1 Then」與「End If」之間的敘述改成名稱為 OutputWeekColor 的副程式: <HTML> <BODY> 今天是: <% Dim Week Week = DatePart( DateInterval.Weekday, Now() ) If Week = 1 Then ' 星期日 Response.Write( "<FONT COLOR=Red>" ) ElseIf Week = 7 Then ' 星期六 Response.Write( "<FONT COLOR=Green>" ) Else Response.Write( "<FONT COLOR=Blue>" ) End If Response.Write( WeekdayName(Week) ) Response.Write( "</FONT>" ) %> </BODY> </HTML>
帶有參數的副程式(1) • 會決定副程式執行結果的變數,通常把它設定成副程式的參數,如下:
帶有參數的副程式(2) <% Dim Name As String Dim score As Integer Name = "張無忌" score = 51 IsScorePassed( Name, score ) Response.Write( "<HR>" ) %> <script Language="VB" runat="server"> Sub IsScorePassed( Name, score ) Response.Write(Name & ", ") If score >= 60 Then Response.Write( "你及格了!" ) ElseIf score >= 50 Then Response.Write( "你可以補考!" ) Else Response.Write( "你被當掉了!" ) End If End Sub </script>
帶有參數的副程式(3) • 修改的過程是: 1. 副程式的修改部分:將關鍵性的變數取出,將其放在 ( ) 裡面,然後擺在副程式名稱之後。 2. 呼叫端的修改部分:將呼叫之前所需設定的變數(本例是 Name 及 score )串在副程式名稱之後。