版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第八章 自定義函數(shù)與子過程,幾個(gè)概念,一、VB程序的基本構(gòu)成是過程。 二、VB6.0中過程有兩大類:內(nèi)部過程和外部過程。 1、內(nèi)部過程:系統(tǒng)提供的,不需要用戶編寫,如內(nèi)部函數(shù)。 2、外部過程:用戶根據(jù)需要定義的,供調(diào)用的程序段,外部過程分為子過程、函數(shù)過程。,幾個(gè)概念,三、在VB中使用過程編程有兩個(gè)優(yōu)點(diǎn): 1、過程可使程序劃分成離散的邏輯單元,每個(gè)單元都比沒有使用過程的整個(gè)程序容易調(diào)試。 2、一個(gè)程序中的過程,往往不必修改或只需稍作改動(dòng),便可以成為另一個(gè)程序的構(gòu)件。 四、Visual Basic 的兩類過程: 1、Sub 過程(子過程),不返回值或多個(gè)返回值。 2、Function 過程(函數(shù)
2、過程),有一個(gè)返回值。,8.2 自定義函數(shù)過程,例8.1 設(shè)計(jì)程序?qū)?0,100區(qū)間內(nèi)的偶數(shù)拆成兩個(gè)素?cái)?shù)之和 分析:可先將偶數(shù)拆分成兩個(gè)數(shù)之和,在分別對這兩個(gè)數(shù)進(jìn)行素?cái)?shù)判定,若都是素?cái)?shù)就輸出。例如:可將50拆分為:3+47、4+46、. 47+3,然后對每種組合中的兩個(gè)數(shù)分別進(jìn)行素?cái)?shù)判斷。 因此,可以定義一個(gè)專門用于素?cái)?shù)判斷的函數(shù)過程。,8.2 自定義函數(shù)過程,Private Function prime(ByVal x As Integer) As Boolean Dim I% prime = True 函數(shù)賦初值True For I = 2 To Sqr(x) If x Mod I = 0
3、 Then 判斷x是否可被i整除 prime = False 函數(shù)取值False,則x不是素?cái)?shù) Exit Function 函數(shù)結(jié)束 End If Next I End Function,在事件過程中調(diào)用以上定義的函數(shù),得到結(jié)果。 Private Sub Form_Click() Dim I%, N, K% I = 1 計(jì)數(shù) For N = 50 To 100 Step 2 取偶數(shù) For K = 3 To N / 2 第一個(gè)數(shù)的取值區(qū)間折半 If prime(K) And prime(N - K) Then 二次調(diào)用結(jié)果都是素?cái)?shù)輸出 Print I; :; N; =; K; +; N - K
4、 Exit For 退出k循環(huán) End If Next K I = I + 1 Next N End Sub,8.2 自定義函數(shù)過程,8.2.2 函數(shù)過程的定義 函數(shù)過程在被調(diào)用前,一定要先定義,函數(shù)定義的方式一般有兩種: 1利用“添加過程”對話框定義 打開窗體或模塊的代碼窗口,單擊“工具”菜單,選擇“添加過程”命令,即可打開“添加過程”對話框。,8.2 自定義函數(shù)過程,在“添加過程”對話框中輸入并選擇相應(yīng)的內(nèi)容和項(xiàng)目即可。在“名稱”文本框內(nèi)輸入待定義函數(shù)過程的名稱,在“類型”選項(xiàng)組中選擇“函數(shù)”單選按鈕。 單擊確定按鈕,則可建立一個(gè)函數(shù)過程的框架 。,8.2 自定義函數(shù)過程,2直接在代碼窗口
5、定義 進(jìn)入代碼窗口后,在左側(cè)顯示對象名的下拉列表框中選擇“(通用)”,在右側(cè)顯示過程的下拉列表框中選擇“(聲明)”,然后輸入Function及函數(shù)名即可。 自定義函數(shù)過程的格式如下: Public| PrivateStaticFunction()As 函數(shù)名= Exit Function 函數(shù)名= End Function,8.2 自定義函數(shù)過程,1)Public或Private:表示函數(shù)是“公有的”或“私有的”。Public表示該函數(shù)為公有過程,定義后整個(gè)程序范圍內(nèi)均可調(diào)用該函數(shù),但調(diào)用時(shí)必須加上該函數(shù)所在的窗體或標(biāo)準(zhǔn)模塊作為前輟,而Private表示私有子過程,用它定義的函數(shù)只能在本窗體或
6、模塊中被調(diào)用。缺省默認(rèn)是公有的。 2)Static:表示函數(shù)中的局部變量是靜態(tài)變量,在函數(shù)被調(diào)用后,其值仍然被保留;,說明,3)():該項(xiàng)中的參數(shù)為形式參數(shù),又稱啞元,可以是變量名或數(shù)組名,當(dāng)參數(shù)為數(shù)組名時(shí),形參和實(shí)參在參數(shù)聲明時(shí)應(yīng)省略其維數(shù),但括號(hào)()不能省略。當(dāng)參數(shù)有多項(xiàng)時(shí),參數(shù)間要用逗號(hào)分隔開。使用格式為ByVal|ByRefAs 4)ByVal:表示調(diào)用時(shí)參數(shù)為值傳遞方式,實(shí)參的值不隨形參值的變化而變化;,說明,說明,5)ByRef:參數(shù)默認(rèn)選項(xiàng),表示參數(shù)為地址傳遞方式,實(shí)參的值隨形參值的改變而改變,數(shù)組只能以傳地址的方式引用; 6) As 表示函數(shù)返回值的類型,默認(rèn)為變體型。在函數(shù)體
7、內(nèi)至少應(yīng)對對函數(shù)名賦值一次。 7) 函數(shù)名=,用于函數(shù)運(yùn)行后返回一個(gè)值。如在定義中未對函數(shù)名賦值,則將返回一個(gè)默認(rèn)值。其中,數(shù)值型為0,字符型為“”,變量型為Empty。 8) Exit Function用于退出函數(shù)過程,該項(xiàng)一般嵌套在if結(jié)構(gòu)中使用,在滿足if條件時(shí)退出該函數(shù)過程。,例8.2 設(shè)計(jì)一個(gè)程序統(tǒng)計(jì)字符串中西文字符個(gè)數(shù)。 算法:漢字的Asc()函數(shù)的返回值小于0;西文字符的Asc()函數(shù)的返回值大于0。 Function CountXw%(ByVal S$) Dim I%, T%, K%, C$ For I = 1 To Len(S) C = Mid(S, I, 1) 逐個(gè)地取出字
8、符 If Asc(C) 0 Then K = K + 1 字符ASCII碼大于0,則個(gè)數(shù)累加1 Next I CountXw = K 返回函數(shù)值 End Function,例8.2 設(shè)計(jì)一個(gè)程序統(tǒng)計(jì)字符串中西文字符個(gè)數(shù)。 Private Sub Command1_Click() Dim C1% C1 = CountXw(Text1.Text) 調(diào)用CountXw函數(shù) Picture1.Print Text1 在Picture1中顯示統(tǒng)計(jì)的結(jié)果 Picture1.Print 有; C1; 個(gè)西文字符數(shù) End Sub,8.2.3 函數(shù)過程的調(diào)用 1函數(shù)調(diào)用的形式 其調(diào)用形式如下: 變量=函數(shù)過程
9、名(實(shí)參列表) 其中,實(shí)參列表中的實(shí)參是傳遞給被調(diào)用過程的變量或表達(dá)式。 例題8.2中的C1 = CountXw(Text1.Text) 就是一次函數(shù)調(diào)用。 注意:調(diào)用函數(shù)后,函數(shù)過程名將有一個(gè)返回值,函數(shù)是一個(gè)特殊的表達(dá)式。因此,函數(shù)不能作為單獨(dú)的一條語句,而必須要以給變量賦值或與命令一起使用的形式。 例如: If prime(K) And prime(N - K) Then,8.2 自定義函數(shù)過程,8.2 函數(shù)過程的定義和調(diào)用,2函數(shù)過程調(diào)用的執(zhí)行流程 在事件過程調(diào)用一個(gè)函數(shù)過程時(shí),程序在執(zhí)行這兩個(gè)過程時(shí)的流程如下圖所示。,Function Hypotenuse( x%,y%) Hypot
10、enuse = Sqr (x 2 + y 2) End Function Private Sub Command1_Click() s = Hypotenuse(a,b) End Sub,函數(shù)過程調(diào)用的執(zhí)行流程圖,過程調(diào)用時(shí)執(zhí)行順序如下: 1)事件過程Command1_Click()在執(zhí)行到函數(shù)過程調(diào)用語句“s = Hypotenuse(a,b)”時(shí),程序執(zhí)行控制權(quán)轉(zhuǎn)移到Hypotenuse()函數(shù)過程中; 2)執(zhí)行控制權(quán)轉(zhuǎn)移時(shí),實(shí)參a和b的值將分別傳遞給Hypotenuse()函數(shù)中的形參x和y;,3)x和y獲得初值后,即可執(zhí)行函數(shù)過程中的程序代碼并給函數(shù)過程名賦值,該值即為整個(gè)函數(shù)過程的返
11、回值; 4)函數(shù)執(zhí)行結(jié)束后,函數(shù)的返回值將賦給主調(diào)事件過程的變量s; 5)變量s得到賦值后,接著執(zhí)行調(diào)用函數(shù)過程后面的剩余語句。,8.3 子過程的定義和調(diào)用,引例 調(diào)用函數(shù)后,將得到函數(shù)的返回值,但是,在有些問題的中,過程執(zhí)行結(jié)束后不需要返回值,用函數(shù)過程實(shí)現(xiàn)就會(huì)非常困難,而應(yīng)該使用子過程的形式。 例8.3 試編寫一個(gè)將兩個(gè)數(shù)進(jìn)行交換的過程供其它過程多次調(diào)用。 分析:先編寫一個(gè)具有將兩個(gè)數(shù)進(jìn)行交換的子過程,需要進(jìn)行兩數(shù)交換時(shí),調(diào)用該子過程,同時(shí)將待交換的兩個(gè)數(shù)傳送到該子過程中,在子過程實(shí)現(xiàn)兩數(shù)交換。子過程執(zhí)行結(jié)束后,將被交換后的兩個(gè)數(shù)返回到主調(diào)過程中。,Cp()子過程的定義 Private S
12、ub Cp(A As Integer, B As Integer) 形參為傳址方式 If A = 0 Then Exit Sub End If A = A + B A和B的值交換,帶回主調(diào)過程 B = A - B A = A - B Print 在子過程中交換后的值 Print A=; A, B=; B End Sub,主調(diào)程序Cp子過程 Private Sub Command1_Click() Dim Str1$, Va%, Vb% Str1$ = 輸入對話框 Va = InputBox(Va=, Str1$) Vb = InputBox(Vb=, Str1$) Print 在主調(diào)過程中調(diào)用
13、子過程前的值 Print Va=; Va, Vb=; Vb 輸出原始值 Call Cp(Va, Vb) Print 在主調(diào)過程中調(diào)用子過程后的值 輸出經(jīng)子過程處理過后的返回值 Print Va=; Va, Vb=; Vb End Sub,運(yùn)行結(jié)果:,程序運(yùn)行后,單擊窗體以觸發(fā)Form_Click()事件過程,運(yùn)行結(jié)果如下圖所示。 從程序中可以看到,Va和Vb的初值分別是45和23,而在窗體中輸出時(shí)Va和Vb的值分別是23和45,達(dá)到了兩個(gè)數(shù)交換的目的。,8.3 子過程的定義和調(diào)用,8.3.1 子過程的定義 子過程以過程名來標(biāo)識(shí),被其它過程調(diào)用。子過程與事件過程有一定區(qū)別,事件過程可以在該事件觸
14、發(fā)或調(diào)用時(shí)執(zhí)行,而用戶自定義的子過程只有在被其它過程調(diào)用時(shí)才能執(zhí)行。 子過程的定義跟函數(shù)過程的定義相類似,在代碼窗口中輸入Sub及子過程名即可,系統(tǒng)會(huì)自動(dòng)加上End Sub與子過程名后的一對括號(hào)(),然后即可在子過程的框架中輸入程序代碼。,子過程的定義格式: Private|PublicStatic Sub () Exit Sub End Sub 說明: Public|Private與Static:它們的含義和作用與函數(shù)過程中相應(yīng)的這些關(guān)鍵詞相同。 ():該項(xiàng)中參數(shù)的形式和調(diào)用方法也與函數(shù)過程相同。 Exit Sub:退出過程,該項(xiàng)一般嵌套在if結(jié)構(gòu)中使用,在滿足if條件時(shí)退出該過程。,6.2
15、 子過程的定義和調(diào)用,例:分別計(jì)算兩個(gè)數(shù)的和與差,而當(dāng)兩個(gè)數(shù)的值均為0時(shí)則不進(jìn)行任何計(jì)算。 Sub Operation(x As Integer , y As Integer) Dim t1 as Integer, t2 as Integer If x =0 and y=0 Then Exit Sub End If t1=x+y t2=x-y Print “t1=”;t1; “t2=”;t2 End Sub,6.2 子過程的定義和調(diào)用,在Sub 過程與Function 過程之間的區(qū)別: 1)子過程名無類型說明,在子過程中不能對子過程名進(jìn)行賦值。 2) 子過程的形式參數(shù)沒有具體的值,只代表參數(shù)的
16、個(gè)數(shù)、位置、類型。 3)子過程的調(diào)用必須是一條獨(dú)立的語句。,8.3 子過程的定義和調(diào)用,8.3.2 子過程的調(diào)用 1使用Call語句調(diào)用 格式:Call 子過程名(實(shí)參列表) 說明: 實(shí)參的個(gè)數(shù),數(shù)據(jù)類型都應(yīng)與被調(diào)用過程的形參一一對應(yīng)。用Call語句調(diào)用時(shí),若有實(shí)參,括號(hào)不能省略,否則,可以省略括號(hào)。 若子過程要通過實(shí)參向主調(diào)過程中返回值,則實(shí)參只能是簡單變量、數(shù)組名或自定義類型變量。,8.3 子過程的定義和調(diào)用,例如: Private Sub Command1_Click() a=”Visual Basic” b= “6.0” Call Link(a,b) End Sub 此時(shí),將輸入的值a
17、和b作為實(shí)參調(diào)用Link子過程,通過調(diào)用將兩個(gè)實(shí)參傳遞給形參,然后在過程中計(jì)算。,8.3 子過程的定義和調(diào)用,2直接使用過程名調(diào)用 格式:子過程名 實(shí)參列表 說明:此形式調(diào)用子過程時(shí),實(shí)參不用加括號(hào),否則在有的編譯版本中出現(xiàn)編譯錯(cuò)誤,若有多個(gè)實(shí)參,則實(shí)參之間用逗號(hào)分隔。 例如: Private Sub Command1_Click() a=”Visual Basic” b= “6.0” Link a , b End Sub,8.4 參數(shù)傳遞,8.4.1 形參與實(shí)參 1、形參 指出現(xiàn)在Sub 和Function過程形參表中的變量名、數(shù)組名,該過程在被調(diào)用前,沒有為它們分配內(nèi)存,其作用是說明自變量
18、的類型和形態(tài)以及在過程中的作用。形參可以是除定長字符串變量之外的合法變量名,也可以帶括號(hào)的數(shù)組名。 2、實(shí)參 實(shí)參就是在調(diào)用Sub 和Function過程時(shí),從主調(diào)過程傳遞給被調(diào)用過程的參數(shù)值。實(shí)參可以是變量名、數(shù)組名、常數(shù)或表達(dá)式。在過程調(diào)用傳遞參數(shù)時(shí),形參與實(shí)參是按位置結(jié)合的,形參表和實(shí)參表中對應(yīng)的變量名可以不必相同,但它們的數(shù)據(jù)類型、參數(shù)個(gè)數(shù)及位置必須一一對應(yīng)。,8.4 參數(shù)傳遞,3、形參與實(shí)參的關(guān)系 形參如同公式中的符號(hào),實(shí)參就是符號(hào)具體的值,在調(diào)用過程前必須得到賦值;調(diào)用過程就是實(shí)現(xiàn)形參與實(shí)參的結(jié)合,把實(shí)參的值通過調(diào)用傳遞給形參,相當(dāng)于把值代入公式進(jìn)行計(jì)算。,8.4 參數(shù)傳遞,8.4
19、.2 地址傳遞與值傳遞 在Visual Basic中,實(shí)參與形參的結(jié)合有兩種方式,即地址傳遞(ByRef)與值傳遞(ByVal),地址傳遞又稱為引用。,10,10,20,a的地址,地址傳遞,值傳遞,實(shí)參b,形參y,實(shí)參 a,形參 x,8.4 參數(shù)傳遞,1地址傳遞 在VB6.0中,在形參前加ByRef或在缺省該關(guān)鍵字,則實(shí)參與形參的結(jié)合就是地址傳遞方式。 例8.5通過調(diào)用子過程實(shí)現(xiàn)將兩個(gè)字符串進(jìn)行互換。 分析:首先定義一個(gè)能夠?qū)崿F(xiàn)字符串交換的子過程Swap1,該子過程包含兩個(gè)形參。在主調(diào)過程中,分別對兩個(gè)字符變量A和B進(jìn)行賦值,將這兩個(gè)變量作為調(diào)用子過程Swap1的實(shí)參,要使得形參的改變能夠影響
20、實(shí)參的值,應(yīng)該采用地址傳遞的方式。,8.4 參數(shù)傳遞,程序代碼如下: 傳址子過程Swap1 Public Sub Swap1(X As String, Y As String) Dim T As String T = X 下面三行語句用于交換形參的值 X = Y Y = T Print “傳址子過程中互換變量值后:”; “X1=”; X; “ ”; “Y1=”; Y; Print “_ Print End Sub,8.4 參數(shù)傳遞,以下為主調(diào)過程(事件過程) Private Sub Form_Click() Dim A As String, B As String 定義字符串變量A、B Cls
21、 清除窗體文字 A = ABCDE 為變量A賦值 B = 12345 為變量B賦值 Print 主過程在調(diào)用子過程之前:; A1=; A; ; B1=; B Print _ Print Swap1 A, B 調(diào)用子過程Sub1 Print 主過程調(diào)用傳址子過程之后:; A1=; A; ; B1=; B End Sub,8.4 參數(shù)傳遞,程序運(yùn)行結(jié)果如下圖 :從程序的運(yùn)行結(jié)果可以看出,對形參的改變就是對實(shí)參的改變。如果不希望這種改變,則在被調(diào)用過程中不要出現(xiàn)對形參值改變的語句,或使用按值傳送方式傳遞數(shù)據(jù),將不會(huì)引起實(shí)參值的改變。,8.4 參數(shù)傳遞,2值傳遞 傳值就是通過傳送實(shí)參的值而不是傳送地址
22、的方法給被調(diào)用過程中傳遞數(shù)據(jù)。這樣,被調(diào)用的過程并沒有訪問實(shí)參的地址,因而也不會(huì)改變實(shí)參的值。 格式: Private Sub Jc(ByVal a%) End Sub,8.4 參數(shù)傳遞,例8.6將兩個(gè)字符串在子過程中實(shí)現(xiàn)互換,但主調(diào)過程的字符串不互換。 分析:首先定義一個(gè)能夠?qū)崿F(xiàn)字符串交換的子過程Swap1,該子過程包含兩個(gè)形參。在主調(diào)過程中,分別對兩個(gè)字符變量A和B進(jìn)行賦值,將這兩個(gè)變量作為調(diào)用子過程Swap1的實(shí)參,要使得子過程中形參的值進(jìn)行互換而不影響主調(diào)過程的實(shí)參,應(yīng)該采用值傳遞的方式。,8.4 參數(shù)傳遞,代碼如下: 傳值子過程Swap1 Public Sub Swap1(ByVal
23、 X As String, ByVal Y As String) Dim T As String T = X X = Y Y = T Print 傳值子過程中互換變量值后的變量數(shù)據(jù):; X1=; X; ; Y1=; Y End Sub,8.4 參數(shù)傳遞,以下為主調(diào)過程(事件過程) Private Sub Form_Click() Dim A As String, B As String Cls 清除窗體文字 A = ABCDE B = 12345 Print 主過程在調(diào)用子過程之前的原變量數(shù)據(jù):; A1=; A; ; B1=; B Print _ Swap1 A, B Print 主過程調(diào)用傳值子過程之后的變量數(shù)據(jù):; A1=; A; ; B1=; B End Sub,8.4 參數(shù)傳遞,運(yùn)行結(jié)果如下圖所示。從程序的運(yùn)行結(jié)果可以看出,使用按值傳送方式傳遞數(shù)據(jù),將不會(huì)引起實(shí)參值的改變。也就是說,兩個(gè)形參的值雖然進(jìn)行了互換,但沒有影響實(shí)參的值,實(shí)參的值在調(diào)用子過程后仍然保留了初值。,8.4 參數(shù)傳遞,8
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026遼寧文體旅產(chǎn)業(yè)發(fā)展集團(tuán)招聘試題及答案
- 中學(xué)生物課堂教學(xué)中生成式AI驅(qū)動(dòng)的教師教學(xué)決策效果研究與實(shí)踐教學(xué)研究課題報(bào)告
- 高中數(shù)學(xué)線性代數(shù)教育游戲化設(shè)計(jì):AI輔助下的線性代數(shù)學(xué)習(xí)教學(xué)研究課題報(bào)告
- 中小學(xué)生心理健康教育與學(xué)校心理健康教育課程內(nèi)容與方法創(chuàng)新教學(xué)研究課題報(bào)告
- 2026年著名橋梁施工工程的風(fēng)險(xiǎn)啟示
- 人工智能輔助下高中生時(shí)間管理能力培養(yǎng)的實(shí)踐探究教學(xué)研究課題報(bào)告
- 2026年橋梁設(shè)計(jì)中的數(shù)據(jù)分析與應(yīng)用
- 2026年電氣安全管理與檢測的相互促進(jìn)
- 開放性骨折的康復(fù)訓(xùn)練計(jì)劃
- 2026年工程案例橋梁抗震性能評估成功經(jīng)驗(yàn)
- kv高壓線防護(hù)施工方案
- 住建局執(zhí)法證考試題庫及答案2025
- 主管護(hù)師聘任述職報(bào)告
- AI搜索時(shí)代:從GEO到AIBE的品牌新藍(lán)圖
- 產(chǎn)品知識(shí)培訓(xùn)會(huì)議總結(jié)
- 四川省成都市樹德實(shí)驗(yàn)中學(xué)2026屆九年級(jí)數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 與業(yè)主溝通技巧培訓(xùn)
- 專題11 圓(安徽專用)5年(2021-2025)中考1年模擬《數(shù)學(xué)》真題分類匯編
- 工程春節(jié)停復(fù)工方案(3篇)
- 社區(qū)基金使用管理辦法
- WST856-2025安全注射標(biāo)準(zhǔn)解讀
評論
0/150
提交評論