Ch05 VB.NET的程序與函數 網頁程式設計
大綱 模組化程式設計 VB.NET的程序與函數 程序與函數的變數範圍 VB.NET常用的內建函數
模組化的基礎 模組化就是把一件大型的工作切割成無數的小工作,切割工作屬於一種結構化分析的範疇,我們最常使用的是由上而下的設計方法,這也是我們常用的程式設計方法。 由上而下的設計方法是當我們面對問題時,先考慮整個問題將它分解成數個大模組,再對於這每一個大模組,一一分割成數個小模組,如此一直細分,最後等這些細分的小問題被一一解決後,再將它們組合起來,如此一層層的向上爬,完成整個設計。
程序 ... ... ... MySub() 程序呼叫 Sub MySub() End Sub 程序 每次呼叫均執行相同的程式碼
程序(續) 優點: 缺點: 程序具有重複使用性 程序可使程式更精簡 加上程序後,程式的可讀性會增加 將程式拆成數個程序後,程式較好偵錯、修改、維護 缺點: 程序使得程式的執行速度減慢,因為多了一道呼叫的手續
程序(續) VB2005提供了下列幾種程序: Sub程序(副程式):執行某些動作但沒有傳回值 Function程序(函式):執行某些動作而且有傳回值 Property程序:取得或設定物件的屬性 Operator程序:針對使用者自訂的類別或結構重新定義標準運算子的動作 Generic程序:定義一個或多個型別參數,每次呼叫Generic程序時可以傳遞不同型別的引數給它 事件程序:為了回應使用者或系統所觸發的事件時才會被呼叫
VB.NET的Sub程序與函數 Sub程序和函數可以將程式中一些常用的共同程式碼獨立成一個區塊,以便建立模組化程式設計,以便在程式中重複呼叫程序和函數,函數和Sub程序的差別在於函數有傳回值,而Sub程序沒有。 在ASP.NET Sub程序和函數一定需要使用<script>標籤的寫法,雖然可以置於任何位置,但是,通常都是置於程式檔案的開頭。 <Script Language = “VB” Runat=“Server”> … </Script>
建立Sub程序-建立 Sub程序是VB.NET程式區塊,使用Sub和End Sub包圍,程序沒有傳回值,例如:PrintTitle()程序,其程式碼如下所示: Sub PrintTitle() Response.Write(“<center><h2>建立程序Sub</h2></center>") Response.Write("<hr>") End sub 而PrintTitle()程序放在<head>區
建立程序Sub-呼叫 因為沒有傳回值,當呼叫Sub程序時,我們是使用Call指令,然後加上程序名稱進行呼叫,如下所示: Call PrintTitle Sub程序呼叫因為程序並沒有參數,所以不使用Call指令也可以,如下所示: PrintTitle() 也是呼叫程序PrintTitle(),因為沒有參數,程序的括號有沒有都一樣。
範例1 <%@ Page Language="VB" %> <html> <head> <title>建立程序Sub</title> <script language="VB" runat="Server"> ' 建立程序顯示標題文字 Sub PrintTitle() ' 顯示標題文字 Response.Write("<center><h3>建立程序Sub</h3></center>") Response.Write("<hr>") End Sub ' 顯示註腳文字 Sub PrintFooter() Response.Write("<hr>(c)Copyright by 陳會安<br>") </script> </head> <body> <% ' 呼叫程序 Call PrintTitle %> <p>這個ASP.NET程式使用程序建立文件的標題文字</p> PrintFooter() </body> </html>
建立函數Function-建立 Function函數改為使用Function和End Function包圍,不過函數擁有傳回值,傳回方式是使用Return指令傳回函數值,如下所示: Function One2Ten() Dim i, total As Integer total = 0 For i = 1 To 10 Step 1 total = total + i Next i Return total End Function
建立函數Function-傳回值 傳回值是使用Return指令,如下所示: 程式碼Return指令後,就是函數傳回值的變數或常數。 Return total 程式碼Return指令後,就是函數傳回值的變數或常數。
建立函數Function-呼叫 因為函數擁有傳回值,所以通常是使用指定敘述進行呼叫,且位在指定敘述的右邊,如下所示: total = One2Ten() 變數total可以取得函數的傳回值。
範例2 <%@ Page Language="VB" %> <html> <head> <title>建立函數Function</title> <script language="VB" runat="Server"> ' 建立程序顯示標題文字 Sub PrintTitle() ' 顯示標題文字 Response.Write("<center><h3>建立函數Function</h3></center>") Response.Write("<hr>") End Sub ' 1加到10 Function One2Ten() Dim i, total As Integer total = 0 For i = 1 To 10 Step 1 total = total + i Next i Return total End Function </script> </head> <body> <% Dim total As Integer ' 呼叫程序 Call PrintTitle ' 呼叫函數 total = One2Ten() %> <p>1加到10為<%=total%></p> </body> </html>
擁有參數的程序與函數-單參數 Sub程序和函數可以傳入參數值,在呼叫時就可以指定不同的參數,以便顯示或取得不同的執行結果,擁有參數的程序寫法,如下所示: Sub PrintTitle(title As String) Response.Write("<center><h3>" & title & "</h3></center>") Response.Write("<hr>") End Sub Sub程序擁有1個參數title字串。
擁有參數的Sub程序與函數-多參數 如果參數不只一個,請使用「,」符號分隔。擁有參數的函數寫法,如下所示: Function N2N(n1 As Integer, n2 As Integer) Dim i, total As Integer total = 0 For i = n1 To n2 Step 1 total = total + i Next i Return total End Function
擁有參數的Sub程序與函數-呼叫 如果Sub程序或函數擁有參數時,在呼叫時需要指定參數值,擁有參數的Sub程序呼叫,如下所示: Call PrintTitle("擁有參數的程序與函數") 程式碼在呼叫時傳入一個字串,這也就是Sub程序參數title的值。 同樣的,如果參數不只一個,在呼叫時也需要使用「,」符號分隔,擁有多個參數的函數呼叫,如下所示: N2N(1,10)
範例3:不同色彩日期 <body> <% Dim tmTime As Date Dim i, j as Integer <html> <head> <title>第五章 範例3:日期 </title> <Script Language = "VB" Runat = "Server"> Sub showDate(dtDay As Date, c As String) Response.Write("<font color = " & c & ">") Response.Write(Year(dtDay) & "年" & Month(dtDay) & "月" & Day(dtDay) & "日") Response.Write("<br>") Response.Write("</font>") End Sub </Script> </head> <body> <% Dim tmTime As Date Dim i, j as Integer For i = 1 to 10 tmTime = TimeOfDay If (i mod 2 = 1) Then showDate(Today, "red") Else showDate(Today, "green") End If Next i %> </body> </html>
範例4:從1加到N的和 <html> <head> <title>第五章 範例4:呼叫函數來計算總和</title> <Script Language="VB" Runat="Server"> Function sumOfn(n As Integer) Dim total, i As Integer total = 0 For i = 1 to n total += i Next i Return total End Function </Script> </head> <body> <% Dim i As Integer Dim sum As Integer For i = 1 to 10 sum = sumOfn(i) Response.Write("1+...+" & i & "=" & sum & "<br>") %> </body> </html>
練習一 建立Min()和Max()函數,函數傳入3個整數參數,傳回值分別是參數中的最小值和最大值 建立Sum()和Average()函數,分別計算下列成績的總分與平均值 78, 87,57,86,92
強迫跳出程序 如果在執行Sub程序時需要中斷程序的執行,可以使用跳出程序指令,如下所示: Exit Sub 當執行Sub程序時,執行到上述指令就會馬上離開程序,如同結束程序的執行。
強迫跳出函數 如果在執行函數時需要中斷函數的執行,跳出函數使用的指令,如下所示: Exit Function 當執行函數時,執行到上述指令就馬上離開函數,如同結束函數的執行,因為函數擁有傳回值,所以在執行此指令前需要傳回函數值。
範例5 <%@ Page Language="VB" %> <html> <head> <title>強迫跳出函數</title> <script language="VB" runat="Server"> ' One加到N Function One2N(stopFunc As Integer) Dim i, total As Integer total = 0 For i = 1 To 10000 Step 1 total = total + i ' 是否結束函數 If i = stopFunc Then Return total ' 傳回值 Exit Function End If Next i End Function </script> </head> <body> <center> <h2>測試Exit Function結束函數</h2> </center><hr> 1加到10為<%=One2N(10)%><br> 1加到100為<%=One2N(100)%><br> </body>
傳值或傳址呼叫程序與函數-說明 Sub程序和函數的參數依據不同的參數傳遞方式,將影響傳入參數的值,VB.NET提供2種參數傳遞方式,如下表所示:
傳值或傳址呼叫程序與函數-範例 VB.NET程序與函數預設使用傳值呼叫,所以並不用在參數前加上Byval指令,如下所示: Sub SubA(C As Integer) ….. End Sub 只有使用傳址的程序或函數才需要特別指名Byref指令,如下所示: Sub SubB(Byref C As Integer) ….
範例6:call by value <html> <head> <title>第五章 範例6:call by value</title> <Script Language="VB" Runat="Server"> Sub visitme(n As Integer) Response.Write("這是你第" & n & "次拜訪我<br>") n += 1 End Sub </Script> </head> <body> <% Dim i As Integer For i = 1 to 5 Response.Write("第" & i & "次呼叫visitme <br>") visitme(i) Next i %> </body> </html>
範例7:call by reference <html> <head> <title>第五章 範例6:call by reference</title> <Script Language="VB" Runat="Server"> Sub visitme(Byref n As Integer) Response.Write("這是你第" & n & "次拜訪我<br>") n += 1 End Sub </Script> </head> <body> <% Dim i As Integer For i = 1 to 5 Response.Write("第" & i & "次呼叫visitme <br>") visitme(i) Next i %> </body> </html
程序與函數的變數範圍 VB.NET語法的ASP.NET程式能夠擁有多個程序或函數,而且在ASP.NET程式宣告的每個變數都擁有其有效範圍,也就是當程式執行時,變數可以讓程序或函數內或其它程式碼存取的範圍。如下所示: 區域變數(Local Variables):在程序和函數內宣告的變數,變數只能在程序或函數內使用,程序或函數外的程式碼無法存取此變數。 全域變數(Global Variables):如果變數是在程序和函數外宣告,整個ASP.NET程式的程序和函數和其它程式碼都可以存取此變數。
範例8:整體變數 <html> <head> <title>第五章 範例8:整體變數</title> <Script Language="VB" Runat="Server"> Dim i As Integer Sub visitme() Response.Write("這是你第" & i & "次拜訪我<br>") i += 1 End Sub </Script> </head> <body> <% For i = 1 to 5 Response.Write("第" & i & "次呼叫visitme <br>") visitme() Next i %> </body> </html>
範例9 <%@ Page Language="VB" %> <html> <head> <title>程序與函數的變數範圍</title> <script language="VB" runat="Server"> ' 宣告全域變數 Dim A, B As Integer ' 程序A Sub SubA() ' 宣告區域變數 A = 3 ' 設定區域變數 B = 4 ' 設定區域變數 End Sub ' 程序B Sub SubB() A = 3 ' 設定全域變數 B = 4 ' 設定全域變數 </script> </head> <body> <center><h2>測試程序函數的變數範圍</h2></center> <hr> ASP.NET程式宣告全域變數A, B<br> SubA宣告區域變數A, B<br> SubB沒有宣告任何的區域變數<br><br> <table border=1> <% A = 1 ' 設定初始值 B = 2 Response.Write("<tr><td>執行過程</td><td>全域變數A值</td>") Response.Write("<td>全域變數B值</td></tr>") Response.Write("<tr><td>初始值</td><td>" & A & "</td>") Response.Write("<td>" & B & "</td></tr>") Call SubA() ' 呼叫SubA Response.Write("<tr><td>呼叫SubA後</td><td>" & A & "</td>") Call SubB() ' 呼叫SubA Response.Write("<tr><td>呼叫SubB後</td><td>" & A & "</td>") %> </body> </html>
VB.NET常用的內建函數 日期與時間函數 字串處理函數 資料型態檢查函數 資料轉換函數 亂數與四捨五入函數
日期與時間函數-說明
日期與時間函數-時間差 VB.NET還提供函數可以取得時間差和增減日期/時間,DateDiff()函數可以計算時間差,如下所示: DateDiff(單位字串, Date1, Date2) DateDiff()函數傳回後2個參數的時間差 單位字串設定後2個參數比較單位:秒(“s”)、分(“n”) 、小時(“H”) 、日(“D”)、或月(“m”)來比較。 VB.NET的DateAdd()函數可以加減日期/時間,如下所示: DateAdd(單位字串, Number, Date) DateAdd()函數使用與DateDiff()函數相同的單位字串,將第3個參數的日期時間加減參數Number的值後傳回。
字串處理函數-1
字串處理函數-2
字串處理函數-3
資料型態檢查函數
資料轉換函數
亂數與四捨五入函數-說明
亂數與四捨五入函數-產生亂數 亂數是隨機產生的數值序列,每個序列值屬於單精浮點數值,其值介於0到1之間,為了每次執行時都能產生不同的亂數序列,需要使用Randomize()函數初始亂數產生器,如下所示: Randomize() 在使用上述函數初始後,就可以使用Rnd()函數取得亂數值,如下所示: Value = Int(Rnd(10) * 100) 函數因為乘以100,配合Int()函數取得整數的亂數值,所以值是在0~100之間。
亂數與四捨五入函數-Rnd()函數的參數
範例10: 擲骰子 <html> <head> <title>第五章 範例1:擲骰子</title> </head> <body> <img src = "point1_6.gif" width=300 height=300 align="left"> <img src = "point1_6.gif" width=300 height=300 align="center"> <% Dim i As Integer Dim va1, va2 As Integer Dim P(6) As String P(1) = "p1.gif" P(2) = "p2.gif" P(3) = "p3.gif" P(4) = "p4.gif" P(5) = "p5.gif" P(6) = "p6.gif" Randomize() va1 = Int(Rnd()*6)+1 Response.Write("<img src = " & P(va1) & " width=300 height=300 align=""left"">") va2 = Int(Rnd()*6) + 1 Response.Write("<img src = " & P(va2) & " width=300 height=300 align=""center"">") Response.Write("<br>") Response.Write("<h2>共 " & (va1+va2) & "點</h2>") %> </body> </html>
範例11: 花式數字 Dim y, m, d, hr, minu, sec As Integer Dim i, j As Integer Dim nowDate As Date Dim temps As String Dim A(10) As String A(0) = "0.gif" A(1) = "1.gif" A(2) = "2.gif" A(3) = "3.gif" A(4) = "4.gif" A(5) = "5.gif" A(6) = "6.gif" A(7) = "7.gif" A(8) = "8.gif" A(9) = "9.gif" nowDate = Now Response.Write("<h2> 進站時刻: <h2>") y = Year(nowDate) temps = Str(y) For i = 2 to Len(temps) j = Val(Mid(temps, i,1)) Response.Write("<img src = " & A(j) & " width=50 height=100>") Next i Response.Write("年")
Response.Write("<img src = " & A(j) & " width=50 height=100>") temps = Str(hr) For i = 2 to Len(temps) j = Val(Mid(temps, i,1)) Response.Write("<img src = " & A(j) & " width=50 height=100>") Next i Response.Write(":") minu = Minute(nowDate) temps = Str(minu) sec = Second(nowDate) temps = Str(sec) m = Month(nowDate) temps = Str(m) For i = 1 to Len(temps) j = Val(Mid(temps, i,1)) Response.Write("<img src = " & A(j) & " width=50 height=100>") Next i Response.Write("月") d = Day(nowDate) temps = Str(d) For i = 2 to Len(temps) Response.Write("日") Response.Write("<br>") hr = Hour(nowDate)
練習1 將測試字串的字以隨機亂排 測試字串=“我愛網頁程式設計” 字要變成花式 共有8個字, 每一個字只可以出現一次! Ex05_08.aspx