ASP.NET 網頁製作教本 -- 從基本語法學起 第4章 VB.NET 程式

Download Report

Transcript ASP.NET 網頁製作教本 -- 從基本語法學起 第4章 VB.NET 程式

ASP.NET 網頁製作教本 –
從基本語法學起
第4章 VB.NET 程式與
網頁製作的應用
4-1 陣列(Array)
陣列(Array)
變數
168
350
每一個變數只能儲存一項資料,
而幾個變數之間是個別獨立的。
799
陣列
168
350
799
0
1
2
陣列能夠儲存多項資料,而
資料之間是依序排列的。
順序是 0、1、2…
陣列的宣告與使用(1)

陣列必須先宣告才能使用,其宣告格式
與變數的宣告很像
Dim A
Dim X(3)
' 宣告一個變數 A
' 宣告一個陣列 X
比變數多出的部份

最簡單的陣列宣告格式是:
Dim 陣列名稱(N)
陣列的宣告與使用(2)

其中 N 代表陣列中最後一項資料的順序,
例如:
宣告一個名稱為 X 的陣列,其
資料排列順序是 0~4,共 5 項
Dim X(4)
0
1
2
3
4
排列順序
陣列的宣告與使用(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),如下:
名稱 資料順序
X
0
1
2
3
4
陣列元素 X(0)~X(4)
資料內容
X(0)
X(1)
X(2)
X(3)
X(4)
陣列 X
陣列註標 0~4
陣列的初值設定

實例:
Dim A = "我是變數" ' 變數的初值設定
Dim X() = { "Word", "Excel", "Access" } ' 陣列的初值設定

所有資料以逗號(,)分隔,然後撰寫在 { } 裡面,
不過請注意 ( ) 裡面不可以含有 N,例如以下
的宣告式是錯誤的:
Dim X(2) = { "Word", "Excel", "Access" }

' 錯誤
含有初值設定的陣列,VB 會自動計算其元素
個數,以上面的 X 陣列為例,含有三個元素,
所以有效的註標範圍是 0~2。
設定陣列的資料型別
Dim 陣列名稱(N)
As 資料型別
 「As 資料型別」其作用是設定陣列
元素的資料型別,例如:
Dim Y(10) As Integer
‘ 宣告一個含有11個元素的陣列而每
' 一個陣列元素的資料型別都是整數
陣列的優點 (1)

例如我們把 5 項資料放在 5 個變數裡面 :
Dim A, B, C, D, E
A = "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 I
Dim 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
Dim Y() = {1, 2, 3 }
Dim Z()
' X陣列的大小 = 6
' Y陣列的大小 = 3
' 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)

搜尋陣列中是否含有某一種資料,舉例
來說,有一「姓名」陣列如下:
Dim 姓名() = { "Adam", "Alan", "Peter", "Jhon", "Tom" }

如何找到 "Peter" 在「姓名」陣列中的註
標(位置)呢?
陣列與搜尋 (2)

如果用 For 迴圈搜尋資料 :
Dim I As Integer
For I = 0 To UBound(姓名)
If 姓名(I) = "Peter" Then ' 表示已經搜尋到資料
Response.Write( "Peter 的註標是 " & I )
Exit For ' 離開 For 迴圈
End If
Next
If 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 的用法是:
陣列
I = Array.IndexOf(姓名, "Peter")
傳回值:搜尋的結果

欲搜尋的資料
傳回值表示搜尋的結果,當傳回值<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)
http://localhost/kjaspx/ch04/NameExp.aspx?Name=VBScrip
t
(1)Name=VBScript:I 值 < 0,會顯示
(2)http://localhost/kjaspx/ch04/NameExp.aspx?Name=ASP
「VBScript 沒有對應的名詞解釋」。
(2) Name=ASP:由於「名詞(1)」等於
“ASP”,所以 I 值將等於 1,而顯示:
練習

河狸國小三年甲班有 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 多了一個參數:
I = Array.IndexOf(數學, 100)
I = Array.IndexOf(數學, 100, I + 1)
多了一個參數
二維陣列 (1)

陣列也可以存放表格式的資料,例如:
第0列
第1列
第2列
第3列
第4列
第0行
第1行
第2行
第3行
打擊者
Bill
David
Norman
Walter
長打率
0.5
0.453
0.36
0.42
上壘率
0.42
0.39
0.42
0.392
打擊率
0.387
0.333
0.34
0.32
二維陣列 (2)

以這個表格為例,計有 5 列、4 行,所
以共有 5×4 項資料,如果使用陣列來儲
存,則陣列寫成:
列
行
Dim X(4, 3)
註標範圍:0~4
註標範圍:0~3
二維陣列 (3)

像這樣含有兩個註標的陣列,稱為二維
陣列,而存取二維陣列的資料也會使用
到兩個註標,例如:
X(1, 2) = 0.42
' 將第 1 列、第 2 行的資料指定成 0.42
Response.Write(X(3, 2))
' 輸出第 3 列、第 2 行的資料
二維陣列 (4)

如果我們將整個陣列的註標標示出來,
則是:
第0列
第0行
(0,0)
第1行
(0,1)
第2行
(0,2)
第3行
(0,3)
第1列
第2列
第3列
第4列
(1,0)
(2,0)
(3,0)
(4,0)
(1,1)
(2,1)
(3,1)
(4,1)
(1,2)
(2,2)
(3,2)
(4,2)
(1,3)
(2,3)
(3,3)
(4,3)
二維陣列資料的輸出(1)

如果要對整個二維陣列的資料進行輸出,
通常要使用 For-Next 巢狀迴圈,例如:
Dim I, J
Dim 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, J
Dim 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 陣列名稱(M, N, L, ¡K)
維數就看這裡有幾個註標

例如:
Dim Z(3, 4, 5, 6, 9)
‘ 宣告一個五維陣列, 可儲存的資料數
' 共有 (3+1)(4+1)(5+1)(6+1)(9+1)=8400
4-2 副程式與函數
<script> 標示

副程式與函數必須放在 <script> 與 </script> 標
示之間,例如:
<script Language="VB" runat="server">
Sub 副程式X
‘ 在此撰寫副程式X的程式碼
End Sub
</script>

在 < script> 標 示 中 , Language 參 數 設 定 成
“VB”,表示其中的程式語言為 VB,runat 參
數設定成 “server”,表示其中的程式將會在
server 端執行。
從「敘述區塊」到「副程式」(1)

將敘述區塊轉換成副程式,先看以下程式:
<%
Dim Name As String
Dim score As Integer
Name = "張無忌"
score = 51
Response.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>
副程式的呼叫與返回(1)
<%
Name = "張無忌"
score = 51
IsScorePassed
' 呼叫 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)

會決定副程式執行結果的變數,通常把
它設定成副程式的參數,如下:
副程式所做的修改
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
呼叫程式所做的修改
Name = "張無忌"
score = 51
IsScorePassed(Name, score )
帶有參數的副程式(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 )串在副
程式名稱之後。

帶有參數的副程式(4)
<%
IsScorePassed( "張無忌", 51 )
Response.Write( "<HR>" )
IsScorePassed( "王國榮", 80 )
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>
實例 (1)

有兩個陣列如下:
Dim 姓名() = { “陳桶一”, “黃光權”, “胡生妙”, “王
為全”, _
“李日正”, “劉德菖”, “方正一”, “劉
康寶”, _
"謝掬花", "王美蘭", "徐小噹", "葉小毛"}
{90,著
58,三
41,年
95,甲
59,班
28, 同
98, 學
0, 95,
Dim
分 分數()
別 記=錄
的41,姓91,名0 }及
ASP.NET 的學期分數:
實例 (2)

請逐一讀取每一位同學的姓名及分數,
然後呼叫 IsScorePassed 副程式,顯示出
以下網頁:
實例 (3)

所撰寫的程式如下:
Dim I
For I = 0 To UBound(姓名)
IsScorePassed( 姓名(I), 分數(I) )
Response.Write( "<BR>" )
Next
練習(1)

三年甲班同學的「姓名、BCC 學期成績、
ASP 學期成績、VB 學期成績」的陣列分
別如下:
Dim NameList() = { “陳桶一”, “黃光權”, “胡生妙”, “王為
全”, _
“李日正”, “劉德菖”, “方正一”, “劉
康寶”, _
"謝掬花", "王美蘭", "徐小噹", "葉小毛" }
Dim BCCList() = { 90, 58, 41, 95, 59, 28, 98, 0, 95, 41, 91, 0 }
Dim ASPList() = { 76, 77, 14, 97, 66, 11, 100, 0, 74, 46, 99, 10 }
Dim VBList() = { 98, 75, 33, 87, 57, 33, 100, 10, 89, 49, 84, 0 }
練習(2)

寫一含有四個參數的 CalcScore 副程式,所
傳入之參數分別為 Name(姓名)、 BCC(BCC
學期成績)、ASP (ASP 學期成績)及 VB(VB
學期成績),而副程式在接收到這四個參數
之後,須輸出以下的 HTML 格式:
<TR>
<TD>Name</TD>
<TD>BCC</TD>
<TD>ASP</TD>
<TD>VB</TD>
<TD>總成績</TD>
<TD>平均分數</TD>
</TR>
練習(3)

最後再呼叫此一副程式,輸出以下表格:
函數(Function)

函數是另一種特殊形式的副程式,這種
副程式有的存在於 VB 的語言系統裡,
稱為內建函數,我們曾經使用過的 Now、
DatePart、WeekdayName、Cint 都是 VB
的內建函數,而另一種函數則可以像副
程式一樣由我們自己定義,稱為自定函
數。
從副程式到函數

唯一的差別只是將 Sub 保留字改成
Function 保留字,其他地方都沒有改變。
Function IsScorePassed(Name, score)
Response.Write( Name & ", " )
If score >= 60 Then
Response.Write( "你及格了!" )
ElseIf score >= 50 Then
Response.Write( "你可以補考!" )
Else
Response.Write( "你被當掉了!" )
End If
End Function
傳回值
T = Now
' Now函數的傳回值為系統時間
ASP = Request("ASP")
V = CInt(ASP)
' CInt函數的傳回值是一個整數

以上的 Now 及 Cint 都是 VB 的內建函
數,其特色都是在被呼叫之後,會傳回
某一份資料(例如 Now 函數傳回系統時
間),這份被傳回的資料就稱傳回值。
設定傳回值的語法

如何讓函數真的能傳回值呢?方法是在
函數結束執行之前,執行以下敘述:
Return 欲傳回的值
實例一(1)

寫一 f(X) = X^2 + 2*X + 1 的函數
Function f(X)
Return X^2 + 2*X + 1
End Function

由於我們希望函數能夠傳回
X^2 + 2*X + 1 運算式的結果,所以便撰
寫 Return X^2 + 2*X + 1」將
X^2 + 2*X + 1 運算的結果指定成函數 f
的傳回值。
實例一(2)

呼叫 f 函數的例子:(Fun1.aspx)
Dim A = f(3) ' 呼叫f, 傳入3為參數, 結果傳回3^2 + 2*3 + 1
Response.Write( "A = " & A & "<P>" ) ' 輸出結果: 16
Dim V = 2
Dim B = f(V) ' 呼叫f, 傳入變數V為參數, 結果傳回V^2 + 2*V + 1
Response.Write( "B = " & B & "<P>" ) ' 輸出結果: 9
實例二(1)

寫一 Sum(N) = 1+2+…+N 的函數。
實例二(2)

Fun2.aspx
<%
Dim N = Val( Request("N") )
Response.Write( "您輸入的 N=" & N & "<P>")
Response.Write( "Sum(N)=" & Sum(N) )
%>
<script Language="VB" runat="server">
Function Sum(N)
Dim I, Total
For I = 1 To N
Total = Total + I
' 逐一將 1, 2, … 加到 Total
Next
Return Total
End Function
</script>
練習
 寫一函數傳入
1~12,然後傳回對
應的中文月份,例如傳入 8 即傳回
"八月"。
4-3 VB 內建函數的實際應用
字串類型函數
用 UCase/LCase 函數避免大小寫問題。
 用 Trim 函數除去不必要的空白字元。
 用 Join 函數簡化陣列資料的輸出
 Split 函數與重複性資料的輸入。 。
 Replace 函數與字串的取代。

UCase/Lcase (1)
用 UCase/LCase 函數避免大小寫問題 。
 將字串轉成大寫及小寫的函數分別是
Ucase 及 Case,使用例如下:

Name = Request("Name") ' 假設Name參數值等於 "Asp"
Response.Write(UCase(Name)) ' 輸出: ASP
Response.Write(LCase(Name)) ' 輸出: asp
UCase/Lcase (2)

NameExp2.asp
<%
Dim 名詞() = {"HTML", "ASP", "ADO", "RDS" }
Dim 解釋() = {"HyperText Markup Language, 超文字標示語言", _
"Active Server Pages, 動態伺服端網頁", _
"ActiveX Data Object, 資料存取物件", _
"Remote Data Service, 遠端資料存取服務"}
Dim data = Request("Name") ' 讀取上網者所輸入的名詞
Dim I = Array.IndexOf( 名詞, UCase(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
%>
Trim (1)

用 Trim 函數除去不必要的空白字元。

們在撰寫程式時,要主動除去不必要的
空白字元,此時須使用 Trim 函數,用法
如下:
X = Trim(" ASP")

' 結果 X = "ASP"
而 NameExp2.aspx 經修改之後成為:
Dim data = Request("Name")
data = Trim(data)
' 新增此一敘述
Dim I = Array.IndexOf( 名詞, UCase(data) )
Trim (2)

NameExp3.aspx:
<%
Dim 名詞() = {"HTML", "ASP", "ADO", "RDS" }
Dim 解釋() = {"HyperText Markup Language, 超文字標示語言", _
"Active Server Pages, 動態伺服端網頁", _
"ActiveX Data Object, 資料存取物件", _
"Remote Data Service, 遠端資料存取服務"}
Dim data = Request("Name") ' 讀取上網者所輸入的名詞
data = Trim(data)
Dim I = Array.IndexOf( 名詞, UCase(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
%>
Join
用 Join 函數簡化陣列資料的輸出。
 Join 函數的特色是可以將陣列的所有元
素串在一起,並且在陣列元素之間插入
某一特定字串或字元,例如:

Dim Arr() = {"F8308", "F8315", "F8316", "F8317"}
Dim X = Join(Arr, "<P>")

結果 X 等於
"F8308<P>F8315<P>F8316<P>F8317" 。
Join 實例 (1)

有一陣列如下:
Dim Books() = { _
"F8308 VB6 與 Windows API 講座", "F8315 新觀念的 VB6 教本", _
"F8316 VB6 實戰講座", "F8317 VB6 資料庫程式設計" }

希望將此一陣列輸出成:
Join 實例 (2)

如果不使用 Join 函數,而使用 For 迴圈,
則此一 ASP 程式如下:(Books01.aspx)
<%
Dim Books() = { _
"F8308 VB6 與 Windows API 講座", "F8315 新觀念的 VB6 教本", _
"F8316 VB6 實戰講座", "F8317 VB6 資料庫程式設計" }
Response.Write( "學 VB 找王國榮系列叢書<HR>" )
Response.Write( "<UL>" )
Dim I
For I = 0 To UBound(Books)
Response.Write( "<LI>" & Books(I) )
Next
Response.Write( "</UL>" )
%>
Join 實例 (3)

如果使用 Join 函數,則程式將更簡單,
以上粗體字的程式可修改成 :
Response.Write( "<UL><LI>" & Join(Books, "<LI>") & "</UL>" )
Join 實例 (4)

Books02.asp
<%
Dim Books() = { _
"F8308 VB6 與 Windows API 講座", "F8315 新觀念的 VB6 教本", _
"F8316 VB6 實戰講座", "F8317 VB6 資料庫程式設計" }
Response.Write( "學 VB 找王國榮系列叢書<HR>" )
Response.Write( "<UL><LI>" & Join(Books, "<LI>") & "</UL>" )
%>
Split (1)

Split 函數與重複性資料的輸入 。
http://localhost/kjaspx/ch04/SplitEx.aspx?Book=F8308&Book=F8315
其意義是輸入兩份資料,而兩份資料都
是以 Book 為參數,另一方面讀取資料
的方法還是使用 Request物件。
 資料之間以 “,” 分隔,使用 Split 函數
最為簡便,例如:

Dim Book = Request("Book")
Dim BookList = Split(Book, ",")
' BookList 變成陣列, BookList(0) = "F8308", BookList(1) = "F8315"
Split (2)

假設我們想把網頁輸出成:

SplitEx.aspx
<%
Dim Book = Request( "Book" )
Dim BookList = Split(Book, ",")
Response.Write( "您想購買的書有:" )
Response.Write( "<UL><LI>" & Join(BookList, "<LI>") & "</UL>" )
%>
Replace(1)

Replace 函數與字串的取代 。
Dim BookList = Split(Book, ",")
Response.Write( "<UL><LI>" & Join(BookList, "<LI>") & "</UL>" )

使用 Split 及 Join 兩個函數,其實使用
一個 Replace 函數就可以完成。
Response.Write( "<UL><LI>" & Replace(Book, ",", "<LI>") & "</UL>" )
Replace(2)

Replace.aspx
<%
Dim Book = Request( "Book" )
Response.Write( "您想購買的書有:" )
Response.Write( "<UL><LI>" & Replace(Book, ",", "<LI>") & "</UL>" )
%>
數值類型函數
FormatNumber 函數與數值的輸出。
 利用 Val 轉換數值資料。
 Rnd 函數與亂數遊戲。

FormatNumber (1)
FormatNumber 函數與數值的輸出 。
 將下圖(左)改成下圖(右),「平均」欄位
採四捨五入方式取小數點兩位,如何撰
寫呢?

FormatNumber(2)

要採四捨五入方式取固定位數的小數須
使用 FormatNumber 函數,使用方法如下:
X = FormatNumber(數值, 所取之小數點位數)

例如:
Dim X = FormatNumber(60.6666666666667, 2)
Response.Write( X )
' 輸出: 60.67
FormatNumber(3)

SubTab02.aspx Part I
<%
Dim NameList() = { "陳桶一", "黃光權", "胡生妙", "王為全", _
"李日正", "劉德菖", "方正一", "劉康寶", _
"謝掬花", "王美蘭", "徐小噹", "葉小毛" }
Dim BCCList() = { 90, 58, 41, 95, 59, 28, 98, 0, 95, 41, 91, 0 }
Dim ASPList() = { 76, 77, 14, 97, 66, 11, 100, 0, 74, 46, 99, 10 }
Dim VBList() = { 98, 75, 33, 87, 57, 33, 100, 10, 89, 49, 84, 0 }
Response.Write( "<TABLE Border=1>" )
FormatNumber(4)

SubTab02.aspx Part II
' 輸出第一列的標題
Response.Write( "<TR BgColor=Cyan><TD>姓名</TD>" )
Response.Write( "<TD>BCC</TD><TD>ASP</TD><TD>VB</TD>" )
Response.Write( "<TD>總分</TD><TD>平均</TD></TR>" )
' 輸出陣列中的資料
Dim I
For I = 0 To UBound(NameList)
CalcScore( NameList(I), BCCList(I), ASPList(I), VBList(I) )
Next
Response.Write( "</TABLE>" )
%>
FormatNumber(5)

SubTab02.aspx Part III
<script Language="VB" runat="server">
Sub CalcScore( Name, BCC, ASP, VB )
Response.Write( "<TR>" )
Response.Write( "<TD>" & Name & "</TD>" )
Response.Write( "<TD>" & BCC & "</TD>" )
Response.Write( "<TD>" & ASP & "</TD>" )
Response.Write( "<TD>" & VB & "</TD>" )
Dim Total = CInt(BCC) + CInt(ASP) + CInt(VB)
Response.Write( "<TD>" & Total & "</TD>" )
Response.Write( "<TD>" & FormatNumber((Total / 3), 2) & "</TD>" )
Response.Write( "</TR>" )
End Sub
</script>
Val
利用 Val 轉換數值資料 。
 試著輸入以下的參數:(BCC、ASP、及
VB的成績都輸入為59.5)

Total = Val(BCC) + Val(VB) + Val(ASP)

Val 的用途是將資料轉換成「實數」,例
如 "59.5" 經轉換之後,會變成 59.5,不
會四捨五入。
Rnd(1)
Rnd 函數與亂數遊戲。
 利用 Rnd 產生亂數,只能產生 0≦且<
1 的亂數,但可利用以下方法,讓它產
生 0~N-1 之間的整數:

Rnd(2)
為什麼 Fix(Rnd*N) 可以產生 0~N-1 之間的
整數呢?
 假設 N 等於 3,則 0≦Rnd*3<3,而 Fix 函
數的作用是去掉小數留下整數,所以:
若 0≦Rnd*3<1,則經 Fix 轉換後會變成 0。
若 1≦Rnd*3<2,則經 Fix 轉換後會變成 1。
1. 若 2≦Rnd*3<3,則經 Fix 轉換後會變成 2。
 Fix(Rnd*3) 可能產生的值為 0、1、或 2(等於
3-1 = N-1)。依此推論,Fix(Rnd*N) 會產生 0、
1…N-1 之中的一個亂數。

Rnd 實例 P.192 (1)

寫一個可以擲出三個骰子的網頁。
Rnd 實例 P.192 (2)

dice.aspx
<%
Dim D1 = Fix(Rnd * 6) + 1
Dim D2 = Fix(Rnd * 6) + 1
Dim D3 = Fix(Rnd * 6) + 1
Response.Write( "<IMG SRC=dice" & D1 &
Response.Write( "<IMG SRC=dice" & D2 &
Response.Write( "<IMG SRC=dice" & D3 &
Response.Write( "<HR>您所擲出的點數是:
%>
<p><A HREF=dice.aspx>重擲骰子</A>
".gif>" )
".gif>" )
".gif><P>" )
" & D1 + D2 + D3 )
Rnd 實例 P.193 (1)

寫一個樂透彩的電腦選號網頁。
Rnd 實例 P.193 (2)

#01
#02
#03
#04
#05
#06
#07
#08
#09
#10
#11
#12
lotto.aspx Part I
<H2>樂透彩 -- 電腦選號<HR></H2>
<%
Dim Num() = { "01", "02", "03", "04",
"08", "09", "10", "11",
"15", "16", "17", "18",
"22", "23", "24", "25",
"29", "30", "31", "32",
"36", "37", "38", "39",
Dim Selected(5)
Dim I, K, D
"05",
"12",
"19",
"26",
"33",
"40",
"06",
"13",
"20",
"27",
"34",
"41",
"07", _
"14", _
"21", _
"28", _
"35", _
"42" }
Rnd 實例 P.193 (3)

#13
#14
#15
#16
#17
#18
#19
#20
#21
#22
lotto.aspx Part II
For I = 0 To 5
D = Fix(Rnd * (42-I))
Selected(I) = Num(D)
Num(D) = "9999"
Array.Sort( Num )
Next
Array.Sort( Selected )
Response.Write( "<UL><LI>" & Join(Selected, "<LI>") & "</UL>"
%>
<p><A HREF=lotto.aspx>重新選號</A>
日期時間類型函數
用 Year、Month 及 Day 函數自設日期格
式。
 用 Hour、Minute 及 Second 函數自設時
間格式。
 用 DateAdd 函數計算使用期限。
 用 DateDiff 函數計算時間差。

用 Year、Month 及 Day 函數自
設日期格式 (1)
用 Year、Month 及 Day 函數自
設日期格式 (2)
<%
Dim D = Now()
Response.Write( "現在是: " & ChineseDate(D) & "<HR>" )
%>
<script Language="VB" runat="server">
Function ChineseDate( D )
Dim ChineseYear
Dim Y = Year(D)
If Y > 1911 Then
ChineseYear = "民國" & Y-1911 & "年"
Else
ChineseYear = "民國前" & (1911-Y+1) & "年"
End If
Return ChineseYear & Month(D) & "月" & Day(D) & "日"
End Function
</script>
用 Hour、Minute 及 Second 函
數自設時間格式 (1)
用 Hour、Minute 及 Second 函
數自設時間格式 (2)
<%
Dim T = Now()
Response.Write( "現在是: " & ChineseTime(T) & "<HR>" )
%>
<script Language="VB" runat="server">
Function ChineseTime( T )
Dim ChTime
Dim H = Hour(T)
If H < 12 Then
ChTime = "上午" & H & "時"
Else
ChTime = "下午" & (H-12) & "時"
End If
Return ChTime & Minute(T) & "分" & Second(T) & "秒"
End Function
</script>
用 DateAdd 函數計算使用期限(1)
如果您經營一個收費網站,而提供給試
用者的試用期為 60 天,那麼如何在試用
者申請時,告訴他可以使用到哪一天呢?
 方法是讀取當時的系統日期(呼叫 Now
函數),然後利用 DateAdd 函數加上 60
天:

Dim D = DateAdd( "d", +60, Now )
Response.Write("謝謝您, 您可以試用到 " & ChineseDate(D))
用 DateAdd 函數計算使用期限(2)
用 DateAdd 函數計算使用期限(3)

如果您想改以 “月” 為使用的單位,則
是將 DateAdd 函數的前兩個參數改成:
"m" 及 +2,如下:
Dim D = DateAdd( "m", +2, Date )
Response.Write("謝謝您, 您可以試用到 " & ChineseDate(D))
用 DateDiff 函數計算時間差 (1)
用 DateDiff 函數計算時間差 (2)

如果我們想製作含有「距離公元2010年
還有 ?????? 秒」的網頁,大概非使用
DateDiff 函數不可,過程是讀取目前的系
統日期時間,然後與 #01/01/2010
00:00:00# 進行秒數差的計算,所撰寫的
程式如下:
S = DateDiff( "s", Now, #01/01/2010 00:00:00# )
用 DateDiff 函數計算時間差 (3)

如果要計算 ‘天’ 數,則是將 DateDiff
的第一個參數由 "s" 改成 "d":
S = DateDiff( "d", Now, #01/01/2010 00:00:00# )
用 DateDiff 函數計算時間差 (4)

Y2010.aspx 完整範例如下:
<%
Response.Write( "距離公元2010年還有: <UL>" )
Dim S = DateDiff( "s", Now, #01/01/2010 00:00:00# )
Response.Write( "<LI>" & S & " 秒" )
S = DateDiff( "d", Now, #01/01/2010 00:00:00# )
Response.Write( "<LI>" & S & " 天" )
Response.Write( "</UL>" )
%>