Transcript 投影片 1

第三章
Visual Basic .NET 語言
ASP.NET 程式設計實務
台灣微軟特約資深講師 林煌章 著
2-5 動態網頁的製作

資料的輸出
第一個要練習的程式就是印出「Hello
world」。第一個程式是在IE上顯示
「Hello world」,請打開FrontPage 2002
後,在HTML的視窗中輸入以下程式:
<%@Page Language="VB"%>
<html>
<%
Response.Write("Hello world<br>")
Response.Write("The Time is: " & DateTime.Now)
%>
</html>
2-5 動態網頁的製作

接著將程式儲存於C:\Inetpub\wwwroot\CR\CH02
內,選擇檔類型時選擇「所有檔案」後,將檔案命
名為EX01.aspx。打開瀏覽器並輸入下列位址
http://127.0.0.1/cr/CH02/ex01.aspx後(不可直接
使用檔案總管開啟),則可以看到下列結果:
2-5 動態網頁的製作

IIS 動作原理
要正確執行動態網頁並顯示其結
果,必需透過瀏覽器向Web伺服
器提出瀏覽網頁的要求,IIS收到
瀏覽器的要求後再依照網頁的副
檔名來決定如何執行。
2-5 動態網頁的製作
2-5 動態網頁的製作

程式的執行
ASP.NET的程式碼還是以HTML標籤為基礎,
程式執行的目的就是要動態的產生HTML文件。
所植入的程式碼規定必須被「<%%>」標籤或
是「<script>」以及「</script>」標籤區塊所
包圍。 「<%@Page Language=“VB”%>」是
ASP.NET網頁語言的設定,表示所使用的語
言為VB.NET 。 ASP.NET網頁的執行是逐行
執行,IIS在編譯ASP.NET網頁時針對HTML
標籤的部分會一五一十的輸出 ,使用者是無
法看到程式的內容 。所輸出的內容都是可以
被瀏覽器解讀的HTML 標籤或文字等資料 。
2-6 物件與類別




在現實生活中,可以看的到的東西幾乎
都可以說是物件,例如筆、電話、鍵盤、
螢幕、印表機等 。
「類別」(Class)好比是藍圖一樣定義
了物件的特質,物件的特質就是物件的
「屬性」、「方法」及「事件」。
CLR是依照類別的定義來產生物件,一
個類別可以用來產生許多不同的物件。
對於軟體程式設計領域而言,類別就好
像藍圖一樣,就是產生軟體物件的藍圖,
沒有類別就無法產生出物件。
2-6 物件與類別
2-6 物件與類別
屬性
屬性代表一個物件的狀態、資料
或是設定值。
 例如的藍色短蠟筆稱為A、黑色長
鉛筆稱為B,實際上這就是他們的
ID。這樣一來就算兩種筆都是藍
色短蠟筆,也可以利用ID屬性來
分別兩個不同的個體,達到控制
特定物件的目的。

2-6 物件與類別
2-6 物件與類別

VB.NET語言的物件命名規則為:

要以英文字母或底線(_)為開頭

中間可包含數字及底線

但是不可以有空格或標點符號

物件ID.屬性 = 敘述

「敘述」的內容可以是數學運算式或是直
接所要設定的值等,在指定運算子右邊的
敘述VB.NET會先做處理,處理完畢後再將
結果存入指定運算子左邊的物件屬性或是
變數中。
2-6 物件與類別
2-6 物件與類別




方法(Method)
方法就是 物件可以執行的動作或工作。
VB.NET語言使用物件方法的語法
物件ID.方法(參數)
和指定屬性一樣,在物件ID後面加上
連結運算子「.」後,並指明要使用的
方法名稱,而且規定所有方法的後面
要加一個小括號「()」。
倘若這個資料是文字型別,則必須用
雙引號「"」包圍起來。
2-6 物件與類別

方法
由於物件的屬性設定不同,所
以會影響方法的執行結果。如
上述的藍色短蠟筆以及黑色長
鉛筆,在執行寫方法時由於這
兩個物件的材質以及顏色屬性
的不同,故執行寫方法後的結
果所寫出來的字顏色不同外,
線條質感也不同。
2-6 物件與類別
2-6 物件與類別


事件(Event)
如果我們希望物件的某些狀況有所改變時,可以
發出訊息通知程式來執行一些因應動作時,就可
以利用「事件」(Event)來達到這個目的。
事件就是物件所認識的動作。
3-1 變數


變數的基本概念
 作為暫時存放物件屬性值的地方
 作為一個計數器,用來計算某程序或某程
式碼區塊的執行次數
 作為保留從函數(Function)傳回資料的
地方
 作為存放資料夾名稱或是檔案名稱的地方
變數的宣告方式
 變數名稱:有意義的文字代碼來取代16進
制的記憶位置
 資料型態:決定變數可佔的記憶體大小和
可存放的內容
3-1 變數
3-1 變數

變數的資料型態
資料型別 儲 存 大 小
Char
2Bytes
10Bytes加上
(2乘以字串
String
長度)
Short
2Bytes
說
字元
Integer
4Bytes
整數
Long
8Bytes
長整數
Single
4Bytes
明 可 儲 存 的 資 料 範 圍
0到65535
字串
0到大約2百萬個雙位元字元
(Unicode)
精簡整數
-32,768到32,767
-2,147,483,648 到
2,147,483,647
-,223,372,036,854,775,808
到
9,223,372,036,854,775,807
單精浮點數
負數部分為-3.402823E38
到-1.401298E-45
正數部分為1.401298E-45
到3.402823E38
3-1 變數

變數的資料型態
資料型別 儲存大小 說
明 可
儲
存
的
資
料
範
圍
Double
8Bytes
負數部分為-1.79769313486231E308
到-4.94065645841247E-324,正數部
雙精浮點數
分為4.94065645841247E-323到
1.79769313486232E308
Boolean
4Bytes
布林
Object
4Bytes
物件
True或False
任何型別的物件其記憶體位址都可以
被物件型別的變數儲存
Decimal
16Bytes
數值
+/79,228,162,514,264,337,593,543,950
,335
以上未帶小數,若帶小數可存28位,
為+/7.9228162514264337593543950335
最小為+/0.0000000000000000000000000001
Date
Byte
8Bytes
1Byte
日期
位元
西元1年1月1號至9999年12月31日
0到255
3-1 變數

選擇變數的資料型別
要使用變數之前一定要明確的宣告變數名
稱及資料型別。宣告正確的變數型別不但
可以讓程式的執行更有效率,並且可以減
少記憶體空間的浪費。

為變數命名
變數的命名不但要考慮容易理解,而且還
要考慮變數名稱的一慣性,尤其是當你或
別人日後可能會再閱讀或維護程式的時候。
3-1 變數

命名法則
變數的命名法則為:
 必須以英文字母或底線(_)為開頭。
 其中不可包含空格,但可包含數字。
 必須在同一範圍內是獨一無二的。
 不可以包含標點或型別宣告字元,但可
以包含底線。
 不可以和VB.NET的保留字,或系統物
件名稱一樣。
3-1 變數

匈牙利命名法
所謂匈牙利命名法那就是將變數資料型別
的縮寫放在變數名稱前面,緊接著才是變
數名,而且變數名的第一個字母要大寫。
這種命名法則可以讓程式碼易於閱讀及維
護。
資 料 型 別 字
Char
String
Short
Integer
Long
Single
chr
str
sht
int
lng
sng
首 範
例
chrLetter
strFirstName
shtPrice
intPayment
lngReward
sngPi
資料型別 字
首 範
例
Double
dbl
dblRate
Boolean
Object
Decimal
Date
Byte
bln
obj
dcm
dt
byt
blnQuit
objDisc
dcmTax
dtBirthday
bytAge
3-1 變數

命名建議
 將名稱中每個字的第一個字母大寫,
例如:dtOrderTime、strEmployeeName。

對於方法與函式以動詞開頭來命名,

對於屬性或類別以名詞開頭來命名,

對於布林型別可以使用Is開頭,
例如: AddOrder、DeleteCustomer。
例如: CustomerName、CompanyAsset。
例如: IsOpened、IsRegister。
3-1 變數

宣告變數
VB.NET 是以「Dim」 關鍵字來宣告變數,
並且在 AS 關鍵字後面指定所要使用的變數
型別。倘若不指定變數的型別,VB.NET 則
預設為 Object 型別。

宣告變數的語法
 Dim 變數名稱 [As 資料型別]
 Dim strUserName As String
 Dim shtPrice As Short
 Dim objPen As Object
 Dim objPen
3-1 變數

變數的初值化
宣告變數時也可以指定一個值作為變數的初始
值 ,用法為:Dim 變數名稱 As 型別 = 初始值
<html>
<%
Dim strUserName As String = "Charles"
Dim shtAge As Short = 30
Response.Write(strUserName)
Response.Write(" 你好, 你的年齡是: ")
Response.Write(shtAge)
%>
</html>
3-1 變數

型別宣告字元
VB.NET的變數不分大小寫 。 VB.NET
為了讓我們使用方便,可以利用型別宣
告字元來宣告變數
資料型別

例如:
Dim intIncome%
型別宣告字元
Single
!
Double
#
Integer
%
Long
&
String
$
Dim intPayment As Integer
Dim intIncome%, shtAge As Short
3-1 變數

使用範例 – 計算身高173公分的男生體重
<html>
<%
Dim bytHeight As Byte
Dim bytWeight As Byte
bytHeight=173
bytWeight=(bytHeight-80)*0.7
Response.Write(bytWeight)
%>
</html>
3-1 變數

共用型別系統
在任何Microsoft.NET語言中所宣告的變數,
最終都會轉成.NET Framework共用型別。
所以在VB.NET中也可以同時混用.NET
Framework共用型別來宣告變數。

Dim A As Int32 等於 Dim B As Integer
3-1 變數

對應的共用型別:
VB.NET型別
Byte
Short
Integer
Long
Single
Double
Boolean
Char
Decimal
Date
Object
String
.NET Framework共用型別
Byte
Int16
Int32
Int64
Single
Double
Boolean
Char
Decimal
DateTime
Object
String
3-1 變數
運算子的優先順序

優先順序 運算子
高
低
名
稱
範
例
結
()
括號
A=(10+5)*3
A=45
^
平方
B=3^2+10
B=19
*/
乘除
C=12+3*2
C=18
\
整數除法
D=11\3+5
D=8
Mod
餘數
E=11 Mod 3
E=2
+-
加減法
F=18+4-10
F=12
果
3-1 變數

VB.NET新增的運算子
運 算 子 範
例 說
+=
bytA + = 1
等於bytA = bytA + 1
-=
bytB - = 1
等於bytB = bytB - 1
*=
bytC * = 2
等於bytC = bytC * 2
/=
bytD / = 2
等於bytD = bytD / 2
\=
bytE \ = 3
等於bytE = bytE \ 3
^=
bytF ^ = 2
等於bytF = bytF ^ 2
&=
strG & = strH
等於strG = strG & strH
明
3-1 變數

字串的結合
「&」符號為字串連結運算子,可以將「&」
符號左右兩邊的字串作結合。以下程式的
執行結果顯示「Hello, Charles」。
Dim strName As String = "Charles"
Dim strMsg = "Hello, " & strName
Response.Write(strMsg)
3-1 變數

常數
變數是用來暫時存放資料的地方,裡面的資料
隨時可以改變。而常數則是以有意義的名稱來
代替特定的值,並且不允許改變常數內的資料
內容。如果我們的程式中常常使用相同的數值
3.14159時,我們就可以考慮用常數了。
<html>
<%
Const PI=3.14159
Dim shtR As Short=10
Response.Write("Round:")
Response.Write(2 * PI * shtR)
Response.Write("<br>Area:")
Response.Write(2 * PI * (shtR^2))
%>
</html>
3-1 變數

陣列
陣列是一種可以用同一個變數名稱記載許
多相同型別資料的一種資料結構,這個結
構裡面是由相同資料型別的元素所組合而
成。

陣列的宣告語法
Dim 陣列名稱(元素上界限) [AS 資料型
別]
Dim shtAge(5) As Short
3-1 變數

之前的敘述宣告了一個名為shtAge的精簡整
數型別陣列,這個陣列可以記錄六個元素。
這個陣列宣告後在記憶體中被產生,六個
元素分別都填入了初始值0,並且將每個元
素分配了一個索引值(index)。陣列的索
引值一律從0開始,而一直到所宣告的上界
限為止。若要存取指定元素中的資料,則
要利用這個索引值。
3-1 變數

將數值20至25分別填入陣列中:
shtAge(0) = 20
shtAge(1) = 21
shtAge(2) = 22
shtAge(3) = 23
shtAge(4) = 24
shtAge(5) = 25
3-1 變數

宣告的時候順便指定陣列內元素的初始值
Dim 陣列名稱() [AS 資料型別] = {值1, 值2, 值3,…}
Dim shtAge() As Short = {20,21,22,23,24,25}

VB.NET陣列元素的數量最多可以宣告為
264-1個元素(即是Long型別的範圍)。
陣列雖然方便使用,可是它不是不用付出
代價的;這個代價就是越大的陣列越佔記
憶體空間。故對於陣列,使用多少就宣告
多少。
3-1 變數

多維陣列
想要利用陣列來管理及群組資料,可以用多
維陣列。
Dim shtStudent(5,1) As Short

上面敘述宣告了一個名為shtStudent精簡整
數型別的二維陣列,這個陣列為6×2的陣列,
可以記錄12個元素。
3-1 變數

我們可以將這個二維陣列的第一維想像成X
座標,第二維想像成Y座標。
shtStudent(0,0) = 20
shtStudent(1,0) = 21
shtStudent(0,1) = 170
shtStudent(1,1) = 171
3-1 變數

多維陣列的初始
多維陣列也可以在宣告的時後初值化陣列內容。
Dim 陣列名稱(,[…,]) [AS 資料型別] = {{值1值,N…}, {值1,值N…}[,…{}]}
Dim shtStudent(,) As Short = {{1,2,3,4,5,6},{7,8,9,10,11,12}}
3-1 變數

動態陣列
當無法精確的確定陣列所要使用的大
小時,在宣告陣列的時候空出元素的
數目即可。
Dim shtStudent() As Short
ReDim shtStudent(5)

ReDim敘述也可以用來重新配置陣列
的大小。注意,ReDim是敘述不是宣
告,故必須要先宣告任意一陣列後,
才可以使用ReDim敘述。
3-1 變數

下列範例是將shtStudent這個陣列擴張1
個元素,並保留其值:
Dim shtStudent() As Short = {20,21,22,23,24,25}
ReDim Preserve shtStudent(6)

針對多維陣列也可改變其元素的數目,
但是陣列的維度不可被改變,而且只有
最後一維的元素數量可以被改變,若是
你改變了陣列的維度或是其他維的元素
數目,則會導致錯誤。
3-1 變數

物件型別的陣列
 陣列裡面的資料型別,必須要和我們在宣告
陣列時所指定的資料型別一樣。
 如果這個陣列的資料型別為物件(Object)
型別。

可以存放四個元素的範例:
Dim objStudent(3) As Object
objStudent (0) = "Charles Lin“
objStudent (1) = "100 Civil Blvd“
objStudent (2) = 29
objStudent (3) = #10/03/1973#
3-1 變數

可記錄6個人資料的二維陣列:
Dim objStudent(5,3) As Object
objStudent (0,0) = "Charles Lin“
objStudent (0,1) = "100 Civil Blvd“
objStudent (0,2) = 29
objStudent (0,3) = #10/03/1973#
objStudent (1,0) = "Kevin Chen“
objStudent (1,1) = "377 Jin-An Rd“
objStudent (1,2) = 27
objStudent (1,3) = #02/24/1975#
3-1 變數

陣列常用的屬性:
屬
性 說
IsFixedSize
(唯讀)傳回陣列是否為固定大小
IsReadOnly
(唯讀)傳回陣列是否為唯讀
IsSynchronized
(唯讀)傳回是否同步存取陣列
Length
(唯讀)傳回陣列所有維度的元素總計
Rank
(唯讀)傳回陣列維度數
SyncRoot
(唯讀)傳回對陣列進行同步存取的物件
明
3-1 變數

陣列常用的方法:
方
法 說
BinarySearch
利用二進位搜尋法搜尋一維陣列內第一個符合指
定資料的元素
Clear
設定陣列內指定範圍的元素,並依陣列型別設定
指定範圍的元素其資料為0、False或Nothing
Clone
複製整個陣列
Copy
複製陣列內指定範圍的元素至另一個陣列
CopyTo
複製一維陣列所有的元素到指定的一維陣列
CreateInstance
產生一個新的陣列實體
GetLength
傳回陣列中指定維度的元素數目
明
3-1 變數

陣列常用的方法:
方
法 說
明
GetLowerBound
傳回陣列的下界限
GetUpperBound
傳回陣列的上界限
GetValue
傳回陣列中指定元素的值
IndexOf
搜尋一維陣列或陣列內指定範圍的元素內容,並傳
回第一個符合條件的元素索引
LastIndexOf
搜尋一維陣列或陣列內指定範圍的元素內容,並傳
回最後一個符合條件的元素索引
Reverse
反轉一維陣列全部的元素或某部分範圍元素的順序
SetValue
設定指定元素的內容為指定的值
Sort
排序一維陣列內的元素
3-1 變數

資料的輸入
 欲取得使用者輸入的資料,要使用
Request物件。
 變數 = Request("參數名稱")
<html>
<%
Dim strName As String
strName=Request("MyName")
Response.Write("Hello, ")
Response.Write(strName)
%>
</html>
3-1 變數

客戶端要傳送資料給網頁伺服器,只要在網址
後面加上問號,並將資料名稱以及指定的值填
入即可,這個輸入的資料稱為「參數」,如下
敘述所示:
http://127.0.0.1/cr/ch03/EX07.aspx?MyName=Charles
3-1 變數

參數上傳的實際情形:
3-1 變數

參數也可以傳遞多個,只要在呼叫這
個網頁時以「&」符號來連接第二個參
數即可。
<html>
<%
Dim strName, strCity As String
strName=Request("MyName")
strCity=Request("MyCity")
Response.Write("Hello, " & strName & ", You live in " & strCity)
%>
</html>
http://127.0.0.1/cr/ch03/EX08.aspx?MyName=Charles&MyCity=Taipei
3-1 變數

設定IIS的編碼及解碼語系
剛才的ASP.NET網頁所輸入的參數值都
為英文,若將參數值改為輸入中文
http://127.0.0.1/cr/ch03/EX08.aspx?MyName=林煌章&MyCity=台北
3-1 變數

這是因為要設定IIS伺服器對於接收及傳送資料
的編碼語系,才能正確的顯示中文,這個設定
檔案名稱為「web. config」。
<!--web.config Configuration File-->
<configuration>
<system.web>
<globalization requestEncoding="big5"
responseEncoding="big5"/>
</system.web>
</configuration>
3-2 資料型別的轉換

型別轉換函式
VB.NET會自動處理兩個不同型別的資料操作,
自動將兩種資料型別轉換成一樣後再執行操作。
Dim strA As char = "100"
Dim strB As short = 10
shtB=shtB+strA ‘shtB的結果將會是110

自動轉換型別的缺點
讓VB.NET自動執行型別轉換可能會發生一些不
可預期的結果,例如執行敘述「shtB = "100" +
"10"」所的到的結果為10010而不是預期110。
3-2 資料型別的轉換

處理不同型別的建議


VB.NET 對於不同的資料型態要處
理時,預設會將不同資料型別自動
轉換成一致的型別再處理。
自動型別轉換有時雖然方便,但是
由於要自動判斷,所以會導致效能
較差。
3-2 資料型別的轉換

型別轉換的函式:
函
CBool
CByte
CChar
CDate
CDbl
CDec

式
轉換型別
Boolean
Byte
Char
Date
Double
Decimal
函 式
CInt
CLng
CObj
CShort
CSng
CStr
轉換型別
Integer
Long
Object
Short
Single
String
這些函式很好記,C是Convert轉換的意
思,然後除了轉Short型別外都是加上要
轉換的型別簡寫。
3-2 資料型別的轉換

下列範例為輸入英呎及英吋,並轉換成
公制單位後輸出:
<html>
<%
Dim sngFeet, sngInches, sngCentimeters As Single
sngFeet=CSng(Request("Feet"))
sngInches=CSng(Request("Inches"))
sngCentimeters=((sngFeet*12)+sngInches)*2.54
Response.Write(CStr(sngFeet) & " 英呎 ")
Response.Write(CStr(sngInches) & " 英吋等於 ")
Response.Write(CStr(sngCentimeters) & " 公分")
%>
</html>
3-2 資料型別的轉換


Convert物件
 除了型別轉換含式外,.NET基底物件庫也
提供了Convert類別可以將基礎型別轉換成
所指定的其它基礎型別。
 變數=Convert.To型別(欲轉換的值/變數)
Convert支援的基礎型別如下表所示:
方法名稱
ToBoolean
ToChar
ToSByte
ToByte
ToInt16
ToInt32
轉換後的VB型別
Boolean
Char
(非VB內建型別)
Byte
Short
Integer
說
明
轉布林型別
轉字元型別
轉8位元帶號整數型別
轉8位元未帶號整數型別
轉精簡整數型別
轉整數型別
3-2 資料型別的轉換

Convert支援的基礎型別如下表所示:
方法名稱
轉換後的VB型別
說明
ToInt64
Long
轉長整數型別
ToUInt16
(非VB內建型別)
轉未帶號精簡整數型別
ToUInt32
(非VB內建型別)
轉未帶號整數型別
ToUInt64
(非VB內建型別)
轉未帶號長整數型別
ToSingle
Single
轉單精數型別
ToDouble
Double
轉雙精數型別
ToDecimal
Decimal
轉數值型別
ToDateTime
Date
轉日期型別
ToString
String
轉字串型別
3-2 資料型別的轉換

下列範例將先前的程式改寫為利用Convert
物件的方法來轉換:
<html>
<%
Dim sngFeet, sngInches, sngCentimeters As Single
sngFeet=Convert.ToSingle(Request("Feet"))
sngInches=Convert.ToSingle(Request("Inches"))
sngCentimeters=((sngFeet*12)+sngInches)*2.54
Response.Write(Convert.ToString(sngFeet) & " 英呎 ")
Response.Write(Convert.ToString(sngInches) & " 英吋等於 ")
Response.Write(Convert.ToString(sngCentimeters) & " 公分")
%>
</html>
3-2 資料型別的轉換

使用物件的基礎方法
方
法 說
Equals
檢查兩個物件的內容是否為相等。
GetHashCode
取回物件的雜湊碼。
GetType
取回物件的型別。
明
ReferenceEquals 檢查兩個物件的所指向的參照是否為相等。
ToString

將該類別轉換為字串。
範例:
Dim shtNum As Short
shtNum=12345
Response.Write("shtNum變數中的值是: " + shtNum.ToString())
Response.Write("this is a string. ".ToUpper())
Response.Write("計算結果為: " + (shtNum+123).ToString())
3-2 資料型別的轉換

雜湊碼(Hash Code)是將物件運用演
算法所產生的一個整數值,用來代表定
的一個物件,並被儲存到雜湊表(Hash
Table)內。
‘將英制單位轉成公制單位
sngCentimeters=((sngFeet*12)+sngInches)*2.54
REM 這是註解
REM 以上為將英制單位轉成公制單位
sngCentimeters=((sngFeet*12)+sngInches)*2.54
Response.Write(CStr(sngFeet) & " 英呎 " & _ ‘在這裡註解是錯的
CStr(sngInches) & " 英吋等於 " & _ ‘或是在這裡註解皆錯誤
CStr(sngCentimeters) & " 公分")
3-3 程式的斷行及註解

斷行字元
VB.NET使用底線「_」作為斷行字元,利用斷
行字元可以將太長的程式碼拆成較易閱讀的方
式。斷行時必須在完整敘述的前面或後面空一
個空格後,再加上斷行字元,才可以將程式敘
述折到下一行。
Response.Write(CStr(sngFeet) & " 英呎 " & CStr(sngInches) & " 英
吋等於 " & CStr(sngCentimeters) & " 公分")
Response.Write(CStr(sngFeet) & " 英呎 " & _
CStr(sngInches) & " 英吋等於 " & _
CStr(sngCentimeters) & " 公分")
Response.Write("在斷行時,必須在完整的" & _
"敘述前面或後面空一個空格。")
3-3 程式的斷行及註解

註解
 註解是給程式設計師看的程式碼說明,VB.NET
遇到註解會予以忽略跳過,在註解符號後面的
資料全部視為註解。
 VB.NET有兩種標籤的方式,一是使用單引號
「‘」,另外一種則是使用REM關鍵字。
sngCentimeters=((sngFeet*12)+sngInches)*2.54 ‘將英制單位轉成公制單位
sngCentimeters=((sngFeet*12)+sngInches)*2.54 REM 這是註解
REM 以上為將英制單位轉成公制單位
Response.Write(CStr(sngFeet) & " 英呎 " & _
CStr(sngInches) & " 英吋等於 " & _
CStr(sngCentimeters) & " 公分")
3-4 程序

了解程序的種類
 「一般程序」(General Procedure)
 「事件程序」(Event Procedure)
 「屬性程序」(Property Procedure)

一般程序
一般程序有兩種,分別為Sub(副程式)
以及Function(函式)。
3-4 程序

Sub
 以Sub方式寫成的程序稱為副程式,其執行
完畢後沒有傳回值 , 也就是不會傳回執行
的結果。
 宣告為Public表示所有的程式都可以使用,
而宣告為Private則表示只有這個網頁中的
程式可以使用該程序,若沒有宣告則預設
為Public。
[Public | Private] Sub 程序名稱(參數1 As 型別, …參數N)
程式碼…
End Sub
3-4 程序


被script標籤所圍起來的部分表示為程序,不管
是一般程序或是事件程序都必須被script標籤所
圍起來,程序只有被呼叫或是發生一件事件的
時候才會被執行。
執行程序的時候,只要直接輸入程序的名稱並
且要加上小括號即可,這個使用程序的動作為
「呼叫」(Call)。
<script language="VB" runat="server">
Private Sub 程序一()
程式碼…
End Sub
Private Sub 程序二()
程式碼…
End Sub
</script>
3-4 程序

下列範例顯示程式遇到程序時的執行流程:
<html>
<%
Response.Write("程序呼叫前<br>")
SayHello()
Response.Write("程序呼叫後")
%>
<script language="VB" runat="server">
Private Sub SayHello()
Response.Write("Hello<br>")
End Sub
</script>
</html>
3-4 程序

程序可以重複呼叫使用,這樣不但好管理而且
可以讓程式比較簡潔
3-4 程序

程序階層的變數
在某個程序中宣告的變數,只能在該程
序中被使用。當程序開始並遇到Dim敘
述時變數才會被產生,而且該變數也只
能在所宣告的程序中被使用,當程序執
行完畢後變數隨即被毀滅,故在程序中
宣告的變數稱為「程序階層」
(Procedure level)的變數。所以在程
序A中叫用程序B時,若在程序B中要使
用在程序A中宣告的變數,則要在程序A
中將該變數當作參數傳遞過去才可以在
程序B中使用。
3-4 程序

參數的傳遞
若有要一併傳送的參數,則可以在小括號內輸入。
若參數為一個以上,則使用逗號來做分隔。
<html>
<%
SayHello("煌章")
%>
<script language="VB" runat="server">
Private Sub SayHello(strName As String)
Response.Write("Hello, " & strName)
End Sub
</script>
</html>
3-4 程序

主程式執行「SayHello("煌章")」時,即將
參數"煌章"傳遞給程序中的變數strName來
接收。在小括號內宣告變數不需要加Dim關
鍵字,直接指定變數名稱及資料型別即可。
3-4 程序

下面範例將英制單位轉公制單位的程式改成以
呼叫程序的方式執行:
<html>
<%
Dim sngFeet, sngInches, sngCentimeters As Single
sngFeet=CSng(Request("Feet"))
sngInches=CSng(Request("Inches"))
MyConvert(sngFeet,sngInches)
%>
<script language="VB" runat="Server">
Private Sub MyConvert(sngF as Single,sngI as Single)
Dim sngCM As Single
sngCM=((sngF*12)+sngI)*2.54
Response.Write(CStr(sngF) & " 英呎 " & CStr(sngI) & " 英吋等於 ")
Response.Write(CStr(sngCM) & " 公分")
End Sub
</script>
</html>
3-4 程序
3-4 程序

Function程序
Function程序有「傳回值」(Return Value),
也就是執行完畢後有執行結果可以接收,所以
在使用Function程序時可以使用變數、物件的
屬性來接收,甚至可以直接將Function程序直
接拿來作為其他方法或其他Function程序的參
數值。在VB.NET中不接收傳回值是被允許的。
[Public | Private] Function 程序名稱(參數1 As 型別, …) [As 傳回
值資料型別]
程式碼…
Return 傳回值 | 程序名稱 = 傳回值
End Function
3-4 程序




Function程序也是一樣必須被Script標籤所括
起來。
Function程序一樣可以接收參數,Function程
序執行後的結果可以利用Return關鍵字傳回
(Return 傳回值)
使用Return以及將傳回值指定給程序名稱這
兩種傳回資料方式的差異,在於使用Return
會立即跳出Function程序;而使用指定傳回值
給程序名稱的方式則會繼續將Function程序執
行完畢。
Function在宣告時的敘述「[As 傳回值資料型
別]」即為明確宣告其傳回值的資料型別。
3-4 程序

下列範例在同一個Functuin中測試兩種傳回資料
的方法:
<html>
<%
Response.Write(Test())
%>
<script language="VB" runat="Server">
Private Function Test() As String
Test = "Step 1<br>"
Response.Write("Step 2<br>")
Return "Step 4<br>"
Response.Write("Step5<br>")
End Function
</script>
</html>
3-4 程序

下列範例為將攝氏溫度轉換成華氏溫度,其轉換:
<%
Dim sngC, sngF As Single
sngC=CSng(Request("C"))
sngF=CtoF(sngC)
Response.Write("您輸入的攝氏溫度為:" & CStr(sngC) & "<br>")
Response.Write("轉換後的華氏溫度為:" & CStr(sngF) & "<br>")
%>
<script language="VB" runat="Server">
Private Function CtoF(sngTC As Single) As Single
Dim sngTempF As Single
sngTempF=(sngTC*9/5)+32
Return sngTempF
End Function
</script>
3-4 程序
3-4 程序

強迫跳出程序


在Sub以及Function程序中可以分
別使用Exit Sub以及Exit Function
敘述強迫跳出程序。
使用Exit敘述最主要是配合條件敘
述式,可以在某個狀況下不繼續執
行程序的內容,以避免程序在某個
不恰當的狀況下執行而浪費系統的
效能。
3-4 程序

下列範例顯示如何強迫跳出Sub以及Function程序:
<%
TestSub()
Response.Write(TestFunction())
%>
<script language="VB" runat="Server">
Private Sub TestSub()
Response.Write("Sub Step 1<br>")
Exit Sub '強迫跳出 Sub
Response.Write("Sub Step 2<br>")
End Sub
Private Function TestFunction() As String
Response.Write("Function Step 1<br>")
Exit Function '強迫跳出 Function
Response.Write("Function Step 2<br>")
End Function
</script>
3-4 程序

傳值及傳址
 參數的傳遞有兩種情形:一種是傳遞
變數的值,另一種是傳遞變數所在的
記憶體位址,上述兩種情形分別稱為
傳值(By Value)以及傳址(By
Reference)。

VB.NET的程序對於參數的傳遞預設是
以傳值的方式執行,所以如果要以傳
值的方式傳遞參數,則ByVal關鍵字可
以省略。
3-4 程序

以SUB使用傳值以及傳址的方式來傳遞參數:
<%
Dim shtA As Short
shtA=100
MyProcA(shtA)
Response.Write("傳值後的shtA變數值:" & CStr(shtA) & "<br>")
MyProcB(shtA)
Response.Write("傳址後的shtA變數值:" & CStr(shtA))
%>
<script language="VB" runat="Server">
Private Sub MyProcA(ByVal shtB As Short)
shtB=10
End Sub
Private Sub MyProcB(ByRef shtB As Short)
shtB=10
End Sub
</script>
3-4 程序
3-4 程序
3-4 程序

程序的覆載
「覆載」(Overload,也可稱為多載)
程序就是可以宣告許多名稱一樣的程序,
但是接收不同數目或型別的參數,執行
時則依使用者使用的情形決定執行哪個
程序。
[Public | Private] 【Overloads】 Sub 程序名稱(參數1 As 型別, …)
敘述…
End Sub
[Public | Private] 【Overloads】 Function 程序名稱(參數1 As 型別, …)
[As 傳回值資料型別]
敘述…
End Function
3-4 程序

下列範例中覆載了四個Test程序(1)。
<html>
<%
Dim strRev As String
Test("字串一")
'輸入一個字串資料, 執行第一個對應的程式
Test(12345)
'輸入一個數值資料, 執行第二個對應的程式
Test(12345,12345)
'輸入兩個數值資料, 執行第三個對應的程式
Test("字串一","字串二")
'輸入兩個字串資料, 執行第四個對應的程式
strRev=Test("字串一","字串二") '輸入兩個字串資料, 並用指定運算子將執行
'結果存入指定變數, 執行第四個對應的程式
%>
<script language="VB" runat="Server">
'輸入一個字串時啟動下列程序
Private Overloads Sub Test(ByVal strA As String)
Response.Write("這是第一個程序: 您傳來的資料是字串<br>")
End Sub
3-4 程序

下列範例中覆載了四個Test程序(2)。
'輸入一個數值時啟動下列程序
Private Overloads Sub Test(ByVal decA As Decimal)
Response.Write("這是第二個程序: 您傳來的資料是數值" & "<br>")
End Sub
'輸入兩個字串時啟動下列程序
Private Overloads Sub Test(ByVal decA As Decimal, ByVal decB As
Decimal)
Response.Write("這是第三個程序: 您傳來的資料是兩個數值<br>")
End Sub
'輸入兩個數值, 並用指定運算子接收執行結果時啟動下列程序
Private Overloads Function Test(ByVal strA As String, ByVal strB As String)
Response.Write("這是第四個程序: 您傳來的資料是兩個字串" & "<br>")
Return strA & strB '將字串連結後傳回
End Function
</script>
</html>
3-4 程序

事件程序




事件(Event)是物件所認識的動作。對動態網頁來說,
一頁動態網頁就是一個Page物件。
網頁每次在載入時會先發生Page_Init事件,然後再發
生Page_Load事件,最後網頁內容全部下載完畢時則
發生Page_Unload事件。
Page_Init事件通常在Page物件被重新執行時,被
ASP.NET網頁用來取得網頁的狀態。
Page_Load事件由開發人員使用,用來初值網頁上的
物件,或是使用者重新執行網頁時用來回復物件的狀
態用。
[Public | Private] Sub 物件名稱_事件名(sender As Object, e As EventArgs)
程式碼…
End Sub
3-4 程序

下列範例為回應網頁執行時所觸發的Page_Load
事件:
<html>
<%
Response.Write("事件發生後")
%>
<script language="VB" runat="Server">
Private Sub Page_Load(sender As Object, e As EventArgs)
Response.Write("網頁在載入時發生Load事件, 即自動執行本程序<br>")
End Sub
</script>
</html>
3-4 程序
3-5 時間及日期的操作

基本函式
 日期及時間是以數值的資料型別儲存,日期
可以表示的範圍為西元1年1月1日到9999年
12月31日,時間的部分為0:00:00到
23:59:59。
 要將日期存入日期型別的變數中,該日期必
須用井號「#」圍起來,其格式為「#月/日/
年#」。
<html>
<%
Dim dtMyBday As date=#10/03/1973#
Response.Write("我的生日是" & Cstr(dtMyBday))
%>
</html>
3-5 時間及日期的操作

時間及日期的函式及物件
函式名稱
說
明
範
例
傳
回
值
Now()
傳回今天的時間及日期
Now()
2002/6/1 上午 09:10:11
Year()
傳回年的部分
Year(Now())
2002
Month()
傳回月的部分
Month(Now())
6
Day()
傳回日的部分
Day(Now())
1
Weekday() 傳回一週的第幾天
Weekday(Now(
2(星期天為1)
))
Hour()
傳回時的部分
Hour(Now())
9
Minute()
傳回分的部分
Minute(Now())
10
Second()
傳回秒的部分
Second(Now)
11
3-5 時間及日期的操作

西元年份轉換成民國的年份顯示:
<html>
<%
Dim dtMyBday As date
dtMyBday=#10/03/1973#
Response.Write("我的生日是民國" & CStr(Year(dtMyBday)1911) & "年")
%>
</html>
3-5 時間及日期的操作

DateTime物件
DateTime物件提供了許多屬性及方法
來處理時間及日期,其中Now屬性可以
傳回系統現在的日期及時間,Today則
是傳系統現在的日期。
Response.Write(DateTime.Now)
Response.Write(DateTime.Today)
3-5 時間及日期的操作
 DateTime物件的屬性及方法(1)
語
法 說
明 備
DateTime.Today.Year()
傳回系統現在的年
DateTime.Today.Month()
傳回系統現在的月
DateTime.Today.Day()
傳回系統現在的日
DateTime.Now.DayOfWeek()
傳回系統現在星期幾
DateTime.Now.DayOfYear()
傳回現在是一年的第幾天
DateTime.Now.Hour()
傳回系統現在的時
DateTime.Now.Minute()
傳回系統現在的分
DateTime.Now.Second()
傳回系統現在的秒
註
星期一為1
3-5 時間及日期的操作
 DateTime物件的屬性及方法(2)
語
法 說
明 備
註
DateTime.Now.AddDays()
傳回現在日期加上指定天數 加上指定的天
DateTime.Now.AddMonths()
傳回現在日期加上指定月數 加上指定的月
DateTime.Now.AddYears()
傳回現在日期加上指定年數 加上指定的年
DateTime.Now.AddSeconds()
傳回現在日期加上指定秒數 加上指定的秒
DateTime.Now.AddMinutes()
傳回現在日期加上指定分鐘 加上指定的分鐘
DateTime.Now.AddHours()
傳回現在日期加上指定小時 加上指定的小時
3-5 時間及日期的操作

DateSerial函式
DateSerial函式可以傳回指定的日期。

下列範例為取回一個月的最後一天後:
<html>
<%
Dim dtLastDay As date
dtLastDay=DateSerial(Year(Now()),Month(Now)+1,1-1)
Response.Write("這個月的最後一天是:" & Cstr(dtLastDay))
%>
</html>
3-5 時間及日期的操作


DateDiff
DateDiff函式可以取得兩個日期的間隔,並且可以
指定以年、月、日等單位傳回兩個日期的差距:
日期相差的單位,必須使用下列表格的參數:
間
隔
DateInterval.Year
DateInterval.Quarter
DateInterval.Month
DateInterval.Day
DateInterval.Week
DateInterval.Hour
DateInterval.Minute
DateInterval.Second
參
數 單
位
年
季
月
日
週
時
分
秒
3-5 時間及日期的操作


DateDiff(間隔參數, 日期一, 日期二)
下列範例由使用者輸入一日期,並和今
天比較相差幾天:
<html>
<%
Dim dtDate As date,intDiffDay as Integer
dtDate=Cdate(Request("Date"))
intDiffDay=DateDiff(DateInterval.Day,Now(),dtDate)
Response.Write("今天的日期是:" & CStr(Now()))
Response.Write("<br>您所輸入的日期和今天相差:")
Response.Write(CStr(intDiffDay))
%>
</html>
3-5 時間及日期的操作

Format函式
Format函式可以修飾日期、數值以及字串型
別的資料,其傳回值的資料型別為字串。
Format(要修飾的資料[,要修飾的格式[,一週的第一天[,一年的第一週]]])

參數「要修飾的格式」是一些有意義的符號,
這些符號的意義如下表所示:
符
號
0
#
.
,
-_$()與空白字元
意
義
數值配置符號,如果所指定的位置沒有數值
則印出0
數值配置符號,如果本符號前面為0則不印出
小數點配置符號
千分符號
文字字元則一五一十的印出
3-5 時間及日期的操作

下列範例將數值50000格式化成$50,000.00:
<html>
<%
Response.Write("應付帳款為" & Format(50000,"$##,###.00"))
%>
</html>
3-5 時間及日期的操作

列印指定的時間及日期格式
Format函式也可以用來修飾時間及日期
語
法
結
果
Format(Now(), "M/d/yy")
6/1/02
Format(Now(),"MM月dd日,dddd,yyyy年")
06月01日,星期一,2002年
Format(Now(),"MMM-d")
六月-1
Format(Now(),"h:m:s")
9:10:11
Format(Now(),"hh:mm:ss")
09:10:11
3-5 時間及日期的操作

字串處理
開發程式時經常需要將字串做一些處理,
例如計算字串的長度、轉換字串的大小
寫,或是從字串的某個位址取出指定長
度的字串等,此時就可以使用字串操作
函式來處理字串。

UCase、LCase以及ToUpper、
ToLowe 、UCase、ToUpper是將字串
全部轉成大寫,而LCase、ToLower則
是全部轉成小寫。
3-5 時間及日期的操作

下列範例顯示如何將字串轉換大小寫:
<html>
<%
Response.Write(UCase("this is a text") & "<br>")
Response.Write(LCase("THIS IS A TEXT") & "<br>")
Response.Write(UCase("this is a text").ToUpper() & "<br>")
Response.Write(LCase("THIS IS A TEXT").ToLower())
%>
</html>
3-5 時間及日期的操作

StrComp
想要比較兩個字串,可以使用StrComp函式。
若不指定比較方式則預設為0
StrComp(字串一, 字串二[, 比較方式])
比
較
方
式 參
以二進位內容比較(分大小寫)
0
以文字內容比較(不分大小寫)
1
傳
回
值 說
-1
字串一小於字串二
0
字串一等於字串二
1
字串一大於字串二
數
值
明
3-5 時間及日期的操作

下列範例比較字串「test」以及字串
「TEST」:
<html>
<%
Response.Write(StrComp("test","TEST",0) & "<br>")
Response.Write(StrComp("test","TEST",1))
%>
</html>
3-5 時間及日期的操作

Len、Left、Right、Mid、Trim




Len函式可以傳回字串的長度。
Left、Right函式可以分別從左邊及右
邊取回指定長度的字串。
Mid函式可以指定從字串的第幾個字
元取回指定長度的字串。
Trim函式可以去掉字串左右兩邊的空
白字元。
3-5 時間及日期的操作

字串處理函式Len、Left、Right、Mid以及
Trim的綜合範例:
<html>
<%
Dim strA As String="Hello, ASP.NET!"
Dim strB As String="你好, 新一代的動態網頁!"
Response.Write("英文字串的長度為:" & Len(strA))
Response.Write("<br>中文字串的長度為:" & Len(strB))
Response.Write("<br>從英文字串左邊取五個字元:" & Left(strA,5))
Response.Write("<br>從英文字串右邊取八個字元:" & Right(strA,8))
Response.Write("<br>從英文字串第八個開始取三個字元:" & Mid(strA,8,3))
Response.Write("<br>去掉字串左右的空白:" & "X" & Trim(" Y ") & "Z")
%>
</html>
3-6 流程控制

流程控制
控制程式控制程式的流程,首先要了
解兩種運算子,這兩種運算子為「比
較運算子」以及「邏輯運算子」。這
兩種運算子的傳回值都是為布林型別,
不是代表「真」的True就是代表「偽」
的False。

比較運算子
要比較數值、字串或日期,可以利用
比較運算子,來比較是否符合執行程
式的條件。 。
3-6 流程控制
VB.NET提供了六種用來測試資料的比較
運算子:

運算子
說
明
範
例
結 果
<
小於
A=8<7
A=False
<=
小於等於
B=5<=5
B=True
>
大於
C=6>5
C=True
>=
大於等於
D=7>=3
D=True
=
等於
E=4=5
E=False
<>
不等於
F=8<>9
F=True
3-6 流程控制

邏輯運算子
除了比較運算子外,還有邏輯運算子。最
常用到的邏輯運算子是And、Or及Not。
And
Or
Not
3-6 流程控制

If…Then敘述
If 條件判斷 Then 程式敘述
If 條件判斷 Then
程式敘述一
程式敘述二
程式敘述N…
End If
3-6 流程控制

用If判斷使用者所應繳之稅額,若大於99
萬才計算並顯示:
<html>
<%
Dim intIncome As Integer
intIncome=CInt(Request("Income"))
If intIncome>990000 Then
Response.Write("您的年收入超過99萬,應該繳的稅為:")
Response.Write(Format((intIncome*0.21)-105100,"$##,###,###.00"))
End If
%>
</html>
3-6 流程控制

If…Then…Else敘述
If 條件判斷 Then
程式區塊一
Else
程式區塊二
End If
3-6 流程控制

用If…Then…Else判斷使用者所應繳之稅額,
並顯示小於等於99萬以及大於99萬的結果:
<html>
<%
Dim intIncome As integer
intIncome=CInt(Request("Income"))
If intIncome>990000 Then
Response.Write("您的年收入超過99萬, 您應該繳的稅為:")
Response.Write(Format((intIncome*0.21)-105100,"$##,###,###.00"))
Else
Response.Write("您的年收入沒超過99萬, 您應該繳的稅為:")
Response.Write(Format((intIncome*0.13)-25900,"$##,###,###.00"))
End If
%>
</html>
3-6 流程控制

If…Then…ElseIf敘述
If 條件判斷一 Then
程式區塊一
ElseIf 條件判斷二
程式區塊二
[Else
程式區塊三]
End If
3-6 流程控制

下列範例將學生的成績轉換成A、B、C、D的
等級,大於等於80分為A、大於等於70分為B、
大於等於60分為C,而其它則為D:
<Html>
<%
Dim bytGrade As Byte=CByte(Request("Grade"))
If bytGrade>=80 Then
Response.Write("您的等級為A")
ElseIf bytGrade>=70 Then
Response.Write("您的等級為B")
ElseIf bytGrade>=60 Then
Response.Write("您的等級為C")
Else
Response.Write("您的等級為D")
End If
%>
</Html>
3-6 流程控制

巢狀結構


如果If條件判斷式所要執行的程式區塊裡還
有If條件判斷式,這種樣式的迴圈我們稱為
巢狀結構。
透過巢狀結構的運用,程式的撰寫就可以更
靈活更有彈性。
If 條件判斷 Then
【If 條件判斷 Then
程式區塊
Else
程式區塊
End If】
Else
程式區塊
End If
3-6 流程控制

下列範例將之前的多加個巢狀迴圈If判斷,額外判斷六十
分以下除了印出等級為D外,倘若不低於五十分則印出可
以補考,低於五十分則印出不能補考:
<%
Dim bytGrade As Byte=CByte(Request("Grade"))
If bytGrade>=80 Then
Response.Write("您的等級為A")
ElseIf bytGrade>=70 Then
Response.Write("您的等級為B")
ElseIf bytGrade>=60 Then
Response.Write("您的等級為C")
Else
Response.Write("您的等級為D")
If bytGrade>=50 Then
Response.Write("可以補考")
Else
Response.Write("不能補考")
End If
End If
%>
3-6 流程控制

And邏輯運算子用於想要多個條件條件都
成立時,才執行某段程式碼時使用。
<html>
<%
Dim strID As String=CStr(Request("ID"))
Dim strPWD As String=CStr(Request("PWD"))
If strID="Charles" And strPWD="1234" Then
Response.Write("使用者名稱及密碼正確!")
Else
Response.Write("使用者名稱及密碼錯誤!")
End If
%>
</html>
3-6 流程控制

Or邏輯運算子則是用在多個條件中,左用兩邊只
要有一個條件成立時,最後的結果就傳回True。
<html>
<%
Dim bytAge As Byte=CByte(Request("Age"))
Dim sngDiscount As Single
Const cnTicketPrice=200
If bytAge<6 Or bytAge>60 Then
sngDiscount=0.5
Else
sngDiscount=0.8
End If
Response.Write("您的票價為:" & CStr(cnTicketPrice * sngDiscount) & "元")
%>
</html>
3-6 流程控制

AndAlso邏輯運算子主要還是執行And邏輯運算,
不過由於對於可預先判斷其執行結果不需要執行全
部的程式,所以可以加強程式執行效能。
<%
If IsTrue(False,"1") AndAlso IsTrue(True,"2") Then
Response.Write("條件成立")
Else
Response.Write("條件不成立")
End If
%>
<script language="VB" runat="Server">
Private Function IsTrue(IsT As Boolean, strStep As String)As Boolean
Response.Write("步驟:" & strStep & ",傳回值是" & IsT.ToString() & "<br>")
Return IsT
End Function
</script>
3-6 流程控制

OrElse
若想在左邊確定為True時即放棄對右邊敘述的運
算,直接取得Or的運算結果Ture,則可以使用
OrElse邏輯運算子。
<%
If IsTrue(True,"1") OrElse IsTrue(True,"2") Then
Response.Write("條件成立")
Else
Response.Write("條件不成立")
End If
%>
<script language="VB" runat="Server">
Private Function IsTrue(IsT As Boolean, strStep As String)As Boolean
Response.Write("步驟:" & strStep & ",傳回值是" & IsT.ToString() & "<br>")
Return IsT
End Function
</script>
3-6 流程控制


Not
Not邏輯運算子可以將布林值做倒置,也就是
將False變成True,將True變成False。
下列範例只要使用者的年齡不小於18即印出
歡迎語,否則印出請離開:
<html>
<%
Dim shtAge As Short=CShort(Request("Age"))
If Not shtAge<18 Then
Response.Write("歡迎您的瀏覽")
Else
Response.Write("本站不接受未成年之青少年瀏覽, 請離開")
End If
%>
</html>
3-6 流程控制

Select Case敘述
Select Case和If…Then…ElseIf的結構很相似,
都是讓程式檢查敘述值後,再決定所要執行的程
式碼區塊。不過Select Case執行起來比
If…Then…ElseIf更有效率而且容易閱讀,這是因
為Select Case只需將要做比較的變數取出一次。
Select Case 測試敘述
Case 條件敘述一
程式區塊一
Case 條件敘述二
程式區塊二
Case 條件敘述N
程式區塊N
[Case Else
Else程式區塊]
End Select
3-6 流程控制
3-6 流程控制

下列範例為輸入使用者帳號,並依帳號列出不同的
歡迎詞:
<html>
<%
Dim strUserName As String=CStr(Request("UserName"))
Dim strMSG As String
Select Case strUserName
Case "Administrator"
strMSG="Hello, Administrator."
Case "User"
strMSG="Hello, User."
Case Else
strMSG="Hello, Guest."
End Select
Response.Write(strMSG)
%>
</html>
3-6 流程控制

Select Case結構用於範圍的測試非常理想,例如
下列範例:
<html>
<%
Dim shtAns As Short=CShort(Request("Ans"))
Dim shtGrade As Short
Select Case shtAns
Case 1 '等於1
shtGrade=1
Case 2 to 4 '2到4(包含)
shtGrade=2
Case 5,6 '5以及6
shtGrade=3
Case Is >= 7 '大於等於七
shtGrade=4
End Select
Response.Write("您得到的積分為:" & CStr(shtGrade))
%>
</html>
3-7 迴圈

Do…Loop迴圈
Do…Loop迴圈結構可以讓程式依據某個條件
的傳回值為False或True,決定是否要反覆執
行某段程式碼區塊。

Do…Loop While迴圈
這種Do…Loop While結構的迴圈,不管條件判
斷式是否成立,至少執行一次。Loop While則
表示如果While後面的條件判斷式成立的話,
即跳回Do繼續執行迴圈。
Do
程式敘述
Loop While 條件判斷式
3-7 迴圈
3-6 流程控制

下列範例可以指定迴圈所執行的次數:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtX As Short=1
Do
Response.Write("迴圈執行了:" & CStr(shtX) & "次<br>")
shtX+=1
Loop While shtX<=shtLoop
%>
</html>
3-6 流程控制

Do…Loop Until迴圈
不管條件判斷式是否成立,至少會執行一
次。Loop Until則表示若Until後面的條件
判斷式估算結果為False,即跳回Do繼續
執行迴圈,一直執行到Until後的條件判斷
式估算結果為True為止 。
Do
程式敘述
Loop Until 條件判斷式
3-7 迴圈
3-6 流程控制

下列範例以Do…Loop Until的方式撰寫:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtX As Short=1
Do
Response.Write("迴圈執行了:" & CStr(shtX) & "次<br>")
shtX+=1
Loop Until shtX>shtLoop
%>
</html>
3-7 迴圈

Do While…Loop迴圈
這種迴圈則是先判斷條件判斷式是否成立,才
會跳入迴圈內執行。
Do While 條件判斷式
程式敘述
Loop
3-6 流程控制

下列範例使用Do While…Loop迴圈執行
使用者所指定的次數:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtX As Short=1
Do While shtX<=shtLoop
Response.Write("迴圈執行了:" & CStr(shtX) & "次<br>")
shtX+=1
Loop
%>
</html>
3-6 流程控制

上述程式碼範例可以改成 While…End
While的寫法:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtX As Short=1
While shtX<=shtLoop
Response.Write("迴圈執行了:" & CStr(shtX) & "次<br>")
shtX+=1
End While
%>
</html>
3-7 迴圈

Do Until…Loop迴圈
這種結構則是先判斷條件判斷式是否滿足,才
會跳入迴圈內執行。
Do Until 條件判斷式
程式敘述
Loop
3-6 流程控制

下列範例使用Do Until…Loop迴圈執行使用者
所指定的次數:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtX As Short=1
Do Until shtX>shtLoop
Response.Write("迴圈執行了:" & CStr(shtX) & "次<br>")
shtX+=1
Loop
%>
</html>
3-6 流程控制

無窮迴圈
在使用迴圈結構時,要撰寫可以讓程式跳
出迴圈的程式敘述。也就是說要可以讓迴
圈判斷式的估算結果核定為不繼續執行迴
圈。倘若迴圈中沒有可以改變條件敘述之
估算結果的程式,則永遠無法跳出迴圈,
這樣的迴圈稱為「無窮迴圈」。
If 條件敘述式 Then
Exit Do
End If
3-6 流程控制

For…Next迴圈
當知道一段程式碼所要執行的條件以及次
數時,就可以使用For…Next迴圈。
For…Next迴圈比Do…Loop迴圈容易使
用及維護 。
For 計數器=起始值 to 結束值 [Step 遞增值]
程式敘述
Next [計數器]
3-7 迴圈
3-6 流程控制

下列範例為使用For…Next迴圈指定程式區塊的
執行次數:
<html>
<%
Dim shtLoop As Short=CShort(Request("Loop"))
Dim shtCount As Short
For shtCount=1 to shtLoop Step 1
Response.Write("迴圈執行" & CStr(shtCount) & "次<br>")
Next shtCount
Response.Write("迴圈結束後計數器的值為" & CStr(shtCount))
%>
</html>
3-6 流程控制

巢狀For…Next迴圈
種巢狀的For…Next迴圈執行時先設定外層的條
件,然後跳進內層迴圈內執行內層迴圈。待內
層迴圈執行超過結束值後,便跳至外層迴圈的
Next敘述,將外層的計數器遞增。外層迴圈計
數器遞增後若沒超過結束值,則再從新進入迴
圈內重新執行內層迴圈。此時內層迴圈的計數
器會重新以初始值設定,重頭執行。這樣執行
的次數要等外層迴圈結束後才會結束。
For 計數器1=起始值 to 結束值 [Step 遞增值]
For 計數器2=起始值 to 結束值 [Step 遞增值]
程式敘述
Next [計數器1]
Next [計數器2]
3-6 流程控制

下列範例利用巢狀迴圈畫出九九乘法表:
<html>
<table border="1">
<%
Dim shtX,shtY As Short
For shtX=1 To 9 Step 1
If shtX=1 OR shtX=4 OR shtX=7 Then Response.Write("<tr>")
Response.Write("<td>")
For shtY =1 To 9 Step 1
Response.Write(CStr(shtX) & "X" & CStr(shtY) & "=" & _
CStr(shtX * shtY) & "<br>")
Next shtY
Response.Write("</td>")
If shtX=3 OR shtX=6 OR shtX=9 Then Response.Write("</tr>")
Next shtX
%>
</table>
</html>
習題
1. 解釋何謂變數以及其功能。
2. 解釋何謂共用型別系統。
3. 試寫一程式,輸入圓面積,求圓週長。(提示:數
值N的根號開法為N^0.5)
4. 試寫一程式,輸入公分,轉換成英呎及英吋。
5. 試將習題4改寫成Sub程序,並接收公分為參數,並
顯示英呎及英吋。
6. 試將習題3改寫成Function程序,並接收圓面積為參
數,並傳回圓週長。
習題
7. 解釋何謂傳值、傳址,以及其對呼叫者的影響。
8. 試寫一Sub程序,利用傳址的方式傳入華氏溫度,
並將傳入的華氏參數改為攝氏溫度。(提示:F=(C32)*5/9)
9. 試寫一程式,計算書籍版稅,輸入書籍售價以及銷
售數量,並輸出版稅金額。假設每賣出一本書,需
付作者書籍售價15%之版稅。
10. 試寫一程式,計算信用卡循環利息,輸入欠款金額
及滯納月數,輸出連本帶利所需繳納之金額。假設
每月循環利息之利率為1.6%。