- Visual Basic從入門到精通(第2版)
- 龍馬高新教育策劃 國家863中部軟件孵化器編著
- 72字
- 2019-01-02 05:00:35
第5章 應(yīng)用程序提升的法寶—內(nèi)置函數(shù)與過程
本章視頻教學(xué)錄像:1小時13分鐘
使用Visual Basic中的內(nèi)置函數(shù),程序員在實(shí)現(xiàn)許多功能的同時可以減少大量代碼的編寫,而巧妙地使用過程則可使計算機(jī)完成特定的功能。本章主要介紹Visual Basic中常用的內(nèi)置函數(shù)、Sub過程和Function過程。
本章要點(diǎn)(已掌握的在方框中打鉤)
□ 了解數(shù)學(xué)函數(shù)
□ 了解字符串函數(shù)
□ 了解轉(zhuǎn)換函數(shù)
□ 了解時間日期函數(shù)
□ 了解隨機(jī)函數(shù)
□ 了解判斷函數(shù)
□ 了解格式化函數(shù)
□ 了解Shell函數(shù)
□ 掌握過程及過程的嵌套與遞歸調(diào)用
□ 了解參數(shù)傳遞
5.1 秘密武器——常用的內(nèi)置函數(shù)
本節(jié)視頻教學(xué)錄像:38分鐘
巧妙地使用內(nèi)置函數(shù),程序員可以減少代碼的編寫量,輕松實(shí)現(xiàn)許多復(fù)雜的功能。本節(jié)介紹一些常用的內(nèi)置函數(shù)。
5.1.1 數(shù)學(xué)函數(shù)
數(shù)學(xué)函數(shù)就是實(shí)現(xiàn)各種數(shù)學(xué)計算的函數(shù),在Visual Basic中包含有豐富的數(shù)學(xué)函數(shù)供用戶使用。常用的數(shù)學(xué)函數(shù)如表所示。

例如,使用Abs函數(shù)來計算“3”和“-3”的絕對值。
01 Private Sub Form_Activate() 02 Print"3的絕對值是:"&Abs(3) '輸入正數(shù)3的絕對值 03 Print"-3的絕對值是:"&Abs(-3) '輸出負(fù)數(shù)3的絕對值 04 End Sub
運(yùn)行窗體后,結(jié)果如圖所示。

5.1.2 字符串函數(shù)
在程序設(shè)計中,將能夠?qū)ψ址幚淼暮瘮?shù)稱為字符串函數(shù)。常用的字符串函數(shù)如表所示。

例如,使用Left()函數(shù)獲取某字符串中最左邊的6個字符。
01 Private Sub Form_Activate() 02 Dim str As String '定義字符串變量 03 str="Congratulations" '為字符串變量賦初值 04 Print"字符串最左邊的6個字符是:"&Left(str,6) '輸出字符串最左邊6位 05 End Sub
運(yùn)行窗體后,結(jié)果如圖所示。

5.1.3 轉(zhuǎn)換函數(shù)
在編程處理數(shù)據(jù)的時候,有時需要在各種數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換,Visual Basic中提供有很多數(shù)據(jù)類型轉(zhuǎn)換的函數(shù),特別是各種進(jìn)制數(shù)據(jù)的轉(zhuǎn)換以及字符串和數(shù)字的轉(zhuǎn)換函數(shù)。
1. 進(jìn)制轉(zhuǎn)換函數(shù)
常見數(shù)據(jù)進(jìn)制有十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制等。十進(jìn)制是我們最為常見和常用的數(shù)據(jù)進(jìn)制,二進(jìn)制是計算機(jī)的基礎(chǔ)進(jìn)制,八進(jìn)制和十六進(jìn)制因?yàn)楹投M(jìn)制有著天然的親密關(guān)系,并且表示比二進(jìn)制更方便,因此也成為計算機(jī)的常用表示方法。
在Visual Basic中進(jìn)行數(shù)據(jù)進(jìn)制轉(zhuǎn)換的函數(shù)中,常用的有以下幾種。
⑴ Hex()函數(shù)
求出參數(shù)的十六進(jìn)制形式。
語法:
Hex(number)
number參數(shù)為任何有效的數(shù)值表達(dá)式或字符串表達(dá)式,不同取值情況下的函數(shù)返回結(jié)果如表所示。

例如輸入一個十進(jìn)制數(shù),將其轉(zhuǎn)換成十六進(jìn)制,并將轉(zhuǎn)換后的結(jié)果輸出在窗體上。
01 Private Sub Command1_Click() 02 Print"您輸入的十進(jìn)制數(shù)是"&Text1.Text '輸出獲得的十進(jìn)制數(shù) 03 Print"轉(zhuǎn)成十六進(jìn)制后為:"&Hex(Val(Text1.Text)) '輸出轉(zhuǎn)換后的結(jié)果 04 End Sub
輸入一個十進(jìn)制數(shù)“15”,單擊【轉(zhuǎn)換】按鈕,結(jié)果如圖所示。

⑵ Oct()函數(shù)
求出參數(shù)的八進(jìn)制形式。
語法:
Oct(number)
number參數(shù)為任何有效的數(shù)值表達(dá)式或字符串表達(dá)式,不同取值情況下的函數(shù)返回結(jié)果如表所示。

例如輸入一個十進(jìn)制數(shù),將其轉(zhuǎn)換成八進(jìn)制,并將轉(zhuǎn)換后的結(jié)果輸出在窗體上。
01 Private Sub Command1_Click() 02 Print"您輸入的十進(jìn)制數(shù)是"&Text1.Text '輸出獲得的十進(jìn)制數(shù) 03 Print"轉(zhuǎn)成八進(jìn)制后為:"&Oct(Val(Text1.Text)) '輸出轉(zhuǎn)換后的結(jié)果 04 End Sub
輸入一個十進(jìn)制數(shù)“8”,單擊【轉(zhuǎn)換】按鈕,結(jié)果如圖所示。

⑶ Cint()函數(shù)
用于強(qiáng)制將一個表達(dá)式轉(zhuǎn)換成-32768~327 67的整型。
語法:
Cint(number)
number參數(shù)為任何有效的數(shù)值表達(dá)式或返回值為數(shù)值的字符串表達(dá)式。
例如輸入一個帶小數(shù)的數(shù)值,將其強(qiáng)制轉(zhuǎn)換成整型,并將轉(zhuǎn)換后的結(jié)果輸出在窗體上。
01 Private Sub Command1_Click()
02 Print"您輸入數(shù)值是"&Text1.Text '輸出獲得的十進(jìn)制數(shù) 03 Print"強(qiáng)制轉(zhuǎn)換后為:"&Clnt(Val(Text1.Text)) '輸出轉(zhuǎn)換后的結(jié)果 04 End Sub
輸入任意有效的數(shù)值表達(dá)式或字符串表達(dá)式,單擊【轉(zhuǎn)換】按鈕,結(jié)果如圖所示。

2. 字符串和數(shù)字轉(zhuǎn)換函數(shù)
⑴ Str()函數(shù)
將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)值。
語法:
Str(number)
number參數(shù)為長整型,其中可包含任何有效的數(shù)值表達(dá)式。
例如,將一個數(shù)字轉(zhuǎn)換成字符串。
01 Private Sub Form_Activate() 02 Print str(156.33) '返回" 156.33" 03 Print str(-156.33)'返回" -156.33" 04 End Sub

提示
當(dāng)數(shù)字轉(zhuǎn)換成字符時,字符串的首位是一個空格或是正負(fù)號。
⑵ Val()函數(shù)
返回包含于字符串內(nèi)的數(shù)字。
語法:
Val(string)
string參數(shù)可以是任何有效的字符串表達(dá)式。
例如,返回字符串中包含的數(shù)值。
01 Private Sub Form_Activate() 02 Print Val("111.11") '返回"111.11" 03 Print Val("-111.11") '字符中的空格被除去了,返回"-111.11" 04 End Sub

5.1.4 日期時間函數(shù)
在編寫程序的時候,往往會遇到各種樣式的日期和時間,例如在狀態(tài)欄中顯示當(dāng)前的系統(tǒng)日期等。

下面介紹幾個常用的日期時間函數(shù)和日期時間轉(zhuǎn)換函數(shù)。
1. Date ( )函數(shù)
用于返回系統(tǒng)的當(dāng)前日期。
語法:
Date
例如,在窗體上顯示系統(tǒng)的當(dāng)前日期。
01 Private Sub Form_Activate() 02 Print"今天是:"&Date '返回系統(tǒng)當(dāng)前日期 03 End Sub
結(jié)果如圖所示。

2. Day(date)函數(shù)
用于表示一個月中的某一日,返回值為1~31之間的整數(shù)。
語法:
Day(date)
date參數(shù)可以是任何能夠表示日期的可變類型數(shù)據(jù)、數(shù)值表達(dá)式、字符串表達(dá)式或它們的組合。如果date包含Null,則返回Null;如果不為空,則返回當(dāng)前指定的日期的某一日。
例如,在窗體上顯示系統(tǒng)當(dāng)前是本月的第幾天。
01 Private Sub Form_Activate() 02 Print"今天已是本月的第"&Day(Date)&"天!" '返回系統(tǒng)當(dāng)前是本月第幾天 03 End Sub
結(jié)果如圖所示。

3. Month()函數(shù)
用于返回1到12之間的整數(shù),表示一年中的某月。
語法:
Month(date)
date參數(shù)可以是任何能夠表示日期的可變類型數(shù)據(jù)、數(shù)值表達(dá)式、字符串表達(dá)式或它們的組合。如果date包含Null,則返回Null;如果不為空,則返回當(dāng)前指定的日期的某一月。
例如,在窗體上顯示系統(tǒng)當(dāng)前本年的月份。
01 Private Sub Form_Activate() 02 Print"現(xiàn)在已是本年的"&Month(Date)&"月份了!" '返回系統(tǒng)當(dāng)前月份 03 End Sub
結(jié)果如圖所示。

4. Time()函數(shù)
用于返回當(dāng)前系統(tǒng)時間(不包含日期)。
語法:
Time
例如,在窗體上顯示當(dāng)前的時間。
01 Private Sub Form_Activate() 02 Print"現(xiàn)在是,北京時間:"&Time '返回系統(tǒng)當(dāng)前時間 03 End Sub
結(jié)果如圖所示。

5. Weekday() 函數(shù)
返回某個日期是星期幾。
語法:
Weekday(date,[firstdayofweek])
Weekday函數(shù)語法中參數(shù)的含義如表所示。

firstdayofweek參數(shù)設(shè)置值如表所示。

Weekday函數(shù)的返回值如表所示。

例如,返回當(dāng)前天數(shù)是本周的第幾個工作日。
01 Private Sub Form_Activate() 02 Print"今天已是本周的第"&Weekday(Date)&"個工作日了" '返回系統(tǒng)工作日 03 End Sub
效果如圖所示。

6. Year()函數(shù)
用于返回日期中的年份。
語法:
Year(date)
date參數(shù)可以是任何能夠表示日期的可變類型數(shù)據(jù)、數(shù)值表達(dá)式、字符串表達(dá)式或它們的組合。如果date包含Null,則返回Null;如果不為空,則返回當(dāng)前指定的年份。
例如,在窗體上顯示系統(tǒng)日期是哪一年。
01 Private Sub Form_Activate() 02 Print"時間已經(jīng)到了公元"&Year(Date)&"年!" '返回當(dāng)前年份 03 End Sub
結(jié)果如圖所示。

5.1.5 隨機(jī)函數(shù)
在編程處理數(shù)據(jù)的時候,經(jīng)常會用到隨機(jī)函數(shù),包括Randomize函數(shù)和Rnd函數(shù)。
1. Randomize函數(shù)
Randomize函數(shù)是初始化隨機(jī)數(shù)生成器。
語法:
Randomize[number]
number:可選參數(shù),是Variant類型的值或任何有效的數(shù)值表達(dá)式。
提示
若想得到重復(fù)的隨機(jī)序列,要在使用具有數(shù)值參數(shù)的Randomize之前直接調(diào)用具有負(fù)參數(shù)值的Rnd,使用具有同樣數(shù)值的Randomize是不會得到重復(fù)的隨機(jī)數(shù)序列的。
2. Rnd函數(shù)
Rnd函數(shù)用于返回一個Single類型的隨機(jī)數(shù)值。
語法:
Rnd[(number)]
如果number的值是Rnd生成,則number的值:
小于0:每次都使用number作為隨機(jī)數(shù)種子得到的相同結(jié)果。
大于0:序列中的下一個隨機(jī)數(shù)。
等于0:最近生成的數(shù)。
默認(rèn):序列中的下一個隨機(jī)數(shù)。
注意
Rnd函數(shù)返回小于1但大于或等于0的值。number的值決定了Rnd生成隨機(jī)數(shù)的方式。
對最初給定的種子都會生成相同的數(shù)列,因?yàn)槊恳淮握{(diào)用Rnd函數(shù)都用數(shù)列中的前一個數(shù)作為下一個數(shù)的種子。在調(diào)用Rnd之前,先使用無參數(shù)的Randomize語句初始化隨機(jī)數(shù)生成器,該生成器具有根據(jù)系統(tǒng)計時器得到的種子。
為了生成某個范圍內(nèi)的隨機(jī)整數(shù),可使用以下公式。
lnt((upperbound - lowerbound + 1) * Rnd + lowerbound)
這里,upperbound是隨機(jī)數(shù)范圍的上限,而lowerbound則是隨機(jī)數(shù)范圍的下限。
提示
若想得到重復(fù)的隨機(jī)數(shù)序列,在使用具有數(shù)值參數(shù)的Randomize之前直接調(diào)用具有負(fù)參數(shù)值的Rnd。使用具有同樣number值的Randomize是不會得到重復(fù)的隨機(jī)數(shù)序列的。
5.1.6 判斷函數(shù)
在進(jìn)行數(shù)據(jù)驗(yàn)證的過程中,使用判斷函數(shù)會為編程工作帶來極大的方便,判斷函數(shù)包括IsNull函數(shù)、IsNumeric函數(shù)和IsArray函數(shù)。
1. IsNull函數(shù)
IsNull函數(shù)用于返回一個Boolean類型值,指出表達(dá)式是否不包含任何有效數(shù)據(jù)(Null)。
語法:
lsNull(expression)
expression:必要參數(shù),是一個Variant類型的值,其中包含數(shù)值表達(dá)式或字符串表達(dá)式。
2. IsNumeric函數(shù)
Isnumeric函數(shù)用于返回一個Boolean類型的值,指出表達(dá)式的運(yùn)算結(jié)果是否為數(shù)值。
語法:
lsNumeric(expression)
expression:必要參數(shù),是一個Variant類型的值,包含數(shù)值表達(dá)式或字符串表達(dá)式。
3. IsArray函數(shù)
IsArray函數(shù)用于返回一個Boolean類型的值,指出變量是否為一個數(shù)組。
語法:
lsArray(varname)
Varname:必要參數(shù),是一個指定變量的標(biāo)識符。
5.1.7 格式化函數(shù)
Visual Basic中的格式化函數(shù)也稱Format函數(shù)。
用于返回Variant(String)類型值,其中含有一個表達(dá)式,它是根據(jù)格式表達(dá)式中的指令來格式化數(shù)據(jù)的。
語法:
Format(expression[,format[,firstdayofweek[,firstweekofyear]]])
Format函數(shù)的語法具有下面幾個部分。

1.設(shè)置值
firstdayofweek參數(shù)有下面的設(shè)置。

2.說明
firstweekofyear參數(shù)有下面的設(shè)置。

如果在格式化數(shù)字時沒有指定format,F(xiàn)ormat會提供與Str函數(shù)類似的功能,盡管它是國際化的。然而,以Format作用在正數(shù)上不會保留正負(fù)號空間,而以Str的話則會。
如果要格式化一個沒有本地化的數(shù)值字符串,應(yīng)該使用一個用戶自定義的數(shù)值格式,以保證得到需要的外觀。
注意如果Calendar屬性設(shè)置是Gregorian,并且format指定了日期格式,那么,提供的expression必須是Gregorian。如果Visual BasicCalendar屬性設(shè)置是Hijri,則提供的expression必須是Hijri。
如果日歷是Gregorian,則format表達(dá)式的意義沒有改變。如果日歷是Hijri,則所有的日期格式符號(例如,dddd,mmmm,yyyy)有相同的意義,這些意義只應(yīng)用于Hijri日歷。格式符號保持英文,用于文本顯示的符號(例如,AM和PM)顯示與該符號有關(guān)的字符串(英文或阿拉伯?dāng)?shù)字)。當(dāng)日歷是Hijri時,一些符號的范圍會改變。
5.1.8 Shell函數(shù)
除了以上介紹的幾個函數(shù)外,本小節(jié)介紹Shell函數(shù)。Shell函數(shù)的作用是在Visual Basic應(yīng)用程序的執(zhí)行過程中調(diào)用執(zhí)行其他的應(yīng)用程序,凡是能在DOS下或Windows下運(yùn)行的可執(zhí)行程序,均可通過Shell()函數(shù)在Visual Basic應(yīng)用程序中調(diào)用。
Shell()函數(shù)的語法如下。
Shell(命令字符串[,窗口類型])
命令字符串是要執(zhí)行的應(yīng)用程序名,包括路徑,它必須是可執(zhí)行文件(擴(kuò)展名為.com、.exe或.bat)。
窗口類型是指執(zhí)行應(yīng)用程序的窗口大小,可選擇0~4或6的整型數(shù)值。取1,表示正常窗口狀態(tài)。默認(rèn)值為2,表示窗口被最小化成任務(wù)欄上的一個圖標(biāo)。
5.2 提升法寶——過程
本節(jié)視頻教學(xué)錄像:32分鐘
過程就是一個具有相對獨(dú)立的代碼塊。在一個大型系統(tǒng)中,會有很多獨(dú)立的代碼塊,每個代碼塊將會完成一定的功能,最后把各個代碼塊組合起來就實(shí)現(xiàn)了大型系統(tǒng)的全部功能。
5.2.1 事件過程
當(dāng)用戶對某個窗體或控件等對象發(fā)出了一個動作后,將會產(chǎn)生一個事件。Visual Basic會自動調(diào)用與該事件有關(guān)的過程,該過程就是一個事件過程。
事件過程的語法是:
Private Sub <對象名>_<事件名>([<形式參數(shù)表>]) <代碼段> End Sub
不同的對象所對應(yīng)的事件過程的命名方式有所不同,窗體和控件都有各自的事件過程命名方式。
例如每個窗體都有自己的名稱,但是不論窗體的名稱是什么,在窗體的事件過程中統(tǒng)一用Form表示。在編寫控件的事件過程時,在代碼編輯窗口左側(cè)的對象下拉列表中選擇控件,在代碼編輯窗口右側(cè)的過程下拉列表中選擇相應(yīng)的事件名。

5.2.2 Sub過程(子過程)
Sub過程是指根據(jù)特定的實(shí)際需要而編寫的,用來實(shí)現(xiàn)某種功能的代碼塊。例如,一本《Visual Basic 6.0從入門到精通》的書的出版是一個最終的結(jié)果,在這期間,出版社會找優(yōu)秀的作者去寫這本書,然后再找排版人員對這本書進(jìn)行排版,最后由編輯對書進(jìn)行審校。一本書的出版,對出版社來說并不需要完全由自己親自去寫書、排版和審校,對于寫書和排版來說,只需要調(diào)用相應(yīng)的人員去做即可。
子過程的語法是:
[Private|Public|Static]Sub <過程名>(<形式參數(shù)表>) <代碼段> End Sub
我們創(chuàng)建一個子過程的時候,不需要在某個特定窗體或者模塊內(nèi)編寫,直接在代碼窗口中輸入子過程的代碼即可。下圖建立了一個新的子過程:SubTest。

創(chuàng)建一個通用過程的目的就是為了調(diào)用它。由于子過程是一個獨(dú)立的過程,不能通過語句直接返回值,所以要用以下兩種形式調(diào)用一個子過程。
⑴ 使用Call語句:Call <過程名>([<實(shí)參表>])。
⑵ 直接使用過程名:<過程名>([<實(shí)參表>])。
“實(shí)參表”是可選項(xiàng),“實(shí)參表”中的參數(shù)必須與子過程的形式參數(shù)表中的參數(shù)一一對應(yīng),并且相應(yīng)位置上的參數(shù)類型也要相同。實(shí)參表中的參數(shù)可以為常量、變量或者表達(dá)式,而子過程的形式參數(shù)表對過程傳遞參數(shù)的描述則包括形參變量的名稱和類型。
【范例5-1】 定義一個Sub子過程,主要用于進(jìn)行階乘的運(yùn)算。輸入一個數(shù)值,通過調(diào)用該Sub子過程,計算出該數(shù)值的階乘值。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中。選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在Form1窗體中添加1個命令按鈕控件和1個文本框控件,并將命令按鈕控件的Caption屬性值設(shè)置為“計算”,將文本框控件的Text值設(shè)置為空。

⑶ 在Form1窗體中雙擊【計算】按鈕,打開代碼窗口,輸入以下代碼(代碼5-1-1.txt)。
01 Private Sub Command1_Click() 02 Dim a As lnteger,s As lnteger,total As lnteger,j As lnteger,x As lnteger,str As String 03 x=Val(Text1.Text) '將獲取的文本內(nèi)容轉(zhuǎn)換為數(shù)值型 04 s=0 's用于得到計算的最終結(jié)果 05 str="" '初始化字符串 06 For j=1 To x '開始計數(shù)循環(huán) 07 Call fact(j,total) '調(diào)用階乘計算的子過程,并向子過程傳遞兩個參數(shù) 08 s=s+total '記錄第1次運(yùn)算的結(jié)果 09 str=str&j&"!+" '輸入階乘數(shù) 10 Next j '符合條件,進(jìn)行下一次運(yùn)算 11 str=str+"=" '得到最終計算結(jié)果 12 Print str;s; '輸出最終計算結(jié)果 13 End Sub
⑷ 在代碼窗口中編寫fact子過程的代碼(代碼5-1-2.txt)。
01 Private Sub fact(n As lnteger,t As lnteger) '定義形式參數(shù)表 02 Dim i,s As lnteger 03 s=1 '初始化變量,用于計算階乘的初始值 04 For i=1 To n 05 s=s*i '累積 06 Next i 07 t=s '得到結(jié)果 08 End Sub
提示
子過程是一個獨(dú)立的過程,可以寫在其他過程以外的任何地方,但不可以在已有過程的內(nèi)部編寫。為了讀取程序方便,通常在只有一個子過程的情況下,可以將其放在代碼段的最后面或最前面。
【運(yùn)行結(jié)果】
保存程序,單擊【啟動】按鈕,運(yùn)行程序。在文本框中輸入數(shù)值“7”,單擊【計算】按鈕,結(jié)果如圖所示。

【拓展訓(xùn)練5-1】
在Visual Basic中不僅可以調(diào)用有返回值的函數(shù),同時還可以調(diào)用無返回值的函數(shù)。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在Form1窗體中添加1個命令按鈕控件。

⑶ 在Form1窗體中雙擊【Command1】按鈕,進(jìn)入代碼窗口,輸入以下代碼。
01 Private Sub Command1_Click() 02 Call XS'調(diào)用子函數(shù) 03 End Sub
⑷ 在代碼窗口中編寫XS子過程的代碼。
01 Private Sub XS() 02 Print"我是無參的" '輸出字符串 03 End Sub
⑸ 保存程序,按【F5】快捷鍵運(yùn)行程序,單擊【Commad1】按鈕查看程序效果。

5.2.3 Function過程(函數(shù)過程)
函數(shù)過程也是用來完成具有特定功能的代碼段,其語法是:
[Private|Public|Static]Function <函數(shù)過程名>(<形式參數(shù)表>)[As<返回值類型>] <代碼段> <函數(shù)過程名>=<返回值> End Function
提示
Function過程和Sub子過程有不同的地方,函數(shù)過程可以向調(diào)用過程明確地返回一個值。所以調(diào)用函數(shù)過程比調(diào)用子過程多了一種形式,共有以下3種形式。
⑴ 使用Call語句:Call <函數(shù)名>([<實(shí)參表>])。
⑵ 直接使用過程名:<函數(shù)名>([<實(shí)參表>])。
⑶ 在表達(dá)式中調(diào)用:<返回值變量>=<函數(shù)名>([<實(shí)參表>])。
【范例5-2】 定義一個Function過程,輸入一個數(shù)值,通過調(diào)用Function函數(shù),
計算出該數(shù)值的階乘值。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在Form1窗體中添加1個命令按鈕控件和1個文本框控件,并將命令按鈕控件的Caption屬性值設(shè)置為“計算”,將文本框控件的Text值設(shè)置為空。

⑶ 在Form1窗體中雙擊【計算】按鈕,打開代碼窗口,輸入以下代碼(代碼5-2-1.txt)。
01 Private Sub Command1_Click() 02 Dim a As lnteger,s As lnteger,total As lnteger,j As lnteger,x As lnteger,str As String 03 x=Val(Text1.Text) '將獲取的文本內(nèi)容轉(zhuǎn)換為數(shù)值型 04 s=0 's用于得到計算的最終結(jié)果 05 For j=1 To x '利用計數(shù)循環(huán)開始計數(shù) 06 s=s+fact(j) '調(diào)用過程函數(shù) 07 str=str&j&"!+" '格式化字符輸出形式 08 Next j 09 str=str&"=" '再次格式化字符輸出形式 10 Print str;s; '輸出最終計算結(jié)果 11 End Sub
⑷ 在代碼窗口中編寫fact子過程的代碼(代碼5-2-2.txt)。
01 Private Function fact(n As lnteger) '定義形式參數(shù)表 02 Dim i,s As lnteger 03 s=1 '用于得到結(jié)果 04 For i=1 To n 05 s=s*l '累積 06 Next l '滿足條件進(jìn)行下次循環(huán) 07 fact=s '函數(shù)fact的返回值 08 End Function
【運(yùn)行結(jié)果】
保存程序,單擊【啟動】按鈕,運(yùn)行程序。在文本框中輸入數(shù)值“7”,單擊【計算】按鈕,結(jié)果如圖所示。

【拓展訓(xùn)練5-2】
本實(shí)例主要講解如何使用Visual Basic中提供的可視化圖形窗口來創(chuàng)建一個過程。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 雙擊Form1窗體,進(jìn)入代碼窗口。
技巧
如果當(dāng)前打開的窗口不是代碼窗口,則無法進(jìn)行下面的操作。
⑶ 選擇【工具】【添加過程】菜單命令,打開【添加過程】對話框。
⑷ 在【名稱】文本框中輸入過程名,例如輸入“SubTest”。


⑸ 在【類型】選項(xiàng)組中選中【函數(shù)】單選按鈕。
注意
在【添加過程】對話框中的【類型】選項(xiàng)組中,可以選中【子程序】單選按鈕來創(chuàng)建一個子過程(Sub),或者選中【函數(shù)】單選按鈕來創(chuàng)建一個函數(shù)過程(Function)。

⑹ 在【范圍】選項(xiàng)組中,可以選中【公有的】單選按鈕來創(chuàng)建一個公有過程,或者選中【私有的】單選按鈕來創(chuàng)建一個私有過程。在這里選中【私有的】單選按鈕,然后單擊【確定】按鈕。
⑺ 這樣就完成了一個函數(shù)過程的創(chuàng)建,但該函數(shù)過程并不能實(shí)現(xiàn)任何功能,而需要向函數(shù)過程中添加實(shí)現(xiàn)程序功能的代碼。


5.2.4 參數(shù)的傳遞
我們使用過程的目的就是將一些數(shù)據(jù)傳遞給過程,過程經(jīng)過計算后將結(jié)果傳遞出來。在調(diào)用的過程中,必須考慮調(diào)用過程和被調(diào)用過程之間的數(shù)據(jù)調(diào)用方式。在Visual Basic中,使用參數(shù)來實(shí)現(xiàn)主調(diào)過程和被調(diào)過程間的數(shù)據(jù)傳遞。
1. 形參與實(shí)參
參數(shù)在Visual Basic中根據(jù)功能被分為形式參數(shù)和實(shí)際參數(shù)兩種。在編寫過程的時候,我們并不知道所要計算數(shù)據(jù)的真實(shí)值,因此使用參數(shù)代表這些值,當(dāng)真正的數(shù)值作為參數(shù)傳遞進(jìn)入過程后,再將參數(shù)值替換為實(shí)際值。在過程中代表真正需要計算的值的參數(shù)就是形式參數(shù),之所以稱其為形式參數(shù),是因?yàn)樗鼉H僅是形式上代表真正需要計算的值。
⑴ 形式參數(shù)。形式參數(shù)(簡稱形參)是接收數(shù)據(jù)的變量。形式參數(shù)表中的各個變量之間用逗號分隔。形式參數(shù)表中的變量類型可以是合法的簡單變量,也可以是數(shù)組,但不能是定長字符串。
⑵ 實(shí)際參數(shù)。實(shí)際參數(shù)(簡稱實(shí)參)是指在調(diào)用子過程或函數(shù)過程時,傳遞給子過程或函數(shù)過程的常量、變量或表達(dá)式。實(shí)際參數(shù)表可以由常量、表達(dá)式、合法的變量名、數(shù)組等組成,實(shí)際參數(shù)表中的各參數(shù)用逗號分隔。
2. 按地址傳遞和按值傳遞
知道了形參和實(shí)參之間的關(guān)系,現(xiàn)在需要知道形參和實(shí)參之間是如何傳遞數(shù)據(jù)的。實(shí)參與形參之間的參數(shù)傳遞方式有兩種,即按地址傳遞和按值傳遞。
⑴ 按地址傳遞(By Reference)。所謂按地址傳遞參數(shù),就是將實(shí)參的地址傳遞給相應(yīng)的形參,形參與實(shí)參使用相同的內(nèi)存地址單元,這樣通過調(diào)用被調(diào)程序就可以改變實(shí)參的值。在進(jìn)行地址傳遞時,實(shí)參必須是變量,常量或表達(dá)式無法進(jìn)行地址傳遞。按地址傳遞是Visual Basic中系統(tǒng)默認(rèn)的參數(shù)傳遞方式。
⑵ 按值傳遞(By Value)。所謂按值傳遞,就是當(dāng)實(shí)參是常量時,直接將常量值傳遞給形參變量;當(dāng)實(shí)參是變量時,僅僅將實(shí)參變量的值傳遞給形參變量。然后執(zhí)行被調(diào)過程,在被調(diào)過程中,即使對形參發(fā)生改變也不會影響實(shí)參值的變化。我們可以把按值傳遞給形參的變量看做實(shí)參的一個“副本”或者“鏡像”,就像鏡子中的我們一樣,雖然鏡子中的樣子和真人一模一樣,但是鏡子中的影像消失了并不會導(dǎo)致真人消失。
【范例5-3】 對整型變量進(jìn)行初始化,然后調(diào)用按地址傳遞和按值傳遞的函數(shù),再將變量傳遞后的結(jié)果輸出,比較按地址傳遞和按值傳遞的區(qū)別。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在Form1窗體中添加兩個命令按鈕控件,將Command1命令按鈕的Caption屬性設(shè)置為“按地址傳遞”,將Command2命令按鈕的Caption屬性設(shè)置為“按值傳遞”。

⑶ 在Form1窗體中雙擊【按地址傳遞】按鈕,打開代碼窗口,輸入以下代碼(代碼5-3-1.txt)。
01 Private Sub Command1_Click() 02 Dim a As lnteger,b As lnteger 03 a=20 '為變量a賦初值 04 b=30 '為變量b賦初值 05 Print"按地址傳遞(初始):a=";a,"b=";b '輸出變量a和b的初始值 06 Call dizhisub(a,b) '調(diào)用名稱為dizhisub的子過程 07 Print"調(diào)用子過程結(jié)束以后:a=";a,"b=";b '輸出調(diào)用函數(shù)后的結(jié)果 08 Print"" '輸出空行 09 End Sub
⑷ 在Form1窗體中雙擊【按值傳遞】按鈕,打開代碼窗口,輸入以下代碼(代碼5-3-2.txt)。
01 Private Sub Command2_Click() 02 Dim a As lnteger,b As lnteger 03 a=20 '為變量a賦初值 04 b=30 '為變量b賦初值 05 Print"按值傳遞(初始):a=";a,"b=";b '輸出變量a和b的初始值 06 Call zhisub(a,b)'調(diào)用名稱為zhisub的子過程 07 Print"調(diào)用子過程結(jié)束以后:a=";a,"b=";b '輸出調(diào)用函數(shù)后的結(jié)果 08 Print"" '輸出空行 09 End Sub
⑸ 在代碼窗口中編寫dizhisub的子過程的代碼。
01 Private Sub dizhisub(m As lnteger,n As lnteger) 02 Print"調(diào)用按地址傳遞的子程序(初始):m=";m,"n=";n '輸出形參m和形參n的初始值 03 m=50 '為形參m重新賦值 04 n=100'為形參n重新賦值 05 Print"調(diào)用按地址傳遞的子程序(子程序賦值以后):m=";m,"n=";n '輸出形參的新值 06 End Sub
⑹ 在代碼窗口中編寫zhisub的子過程的代碼。
01 Private Sub zhisub(ByVal m,ByVal n) 02 Print"調(diào)用按值傳遞的子程序(初始):m=";m,"n=";n'輸出形參m和形參n的初始值 03 m=50 '為形參m重新賦值 04 n=100'為形參n重新賦值 05 Print"調(diào)用按值傳遞的子程序(子程序賦值以后):m=";m,"n=";n '輸出形參的新值 06 End Sub
【運(yùn)行結(jié)果】
保存程序,按【F5】快捷鍵,運(yùn)行程序。分別單擊【按地址傳遞】按鈕和【按值傳遞】按鈕,可以看到按地址傳遞和按值傳遞后數(shù)值的變化。

5.2.5 過程的嵌套與遞歸
在Visual Basic中,在一個過程中調(diào)用另外一個或其他若干個過程的方法稱為過程的嵌套調(diào)用,在過程中直接或間接地調(diào)用過程自身的方法則稱為過程的遞歸調(diào)用。
1. 過程的嵌套調(diào)用
在Visual Basic中,過程的定義都是相互平行獨(dú)立的,一個過程內(nèi)不能包含另一個過程,在程序代碼中每一個過程之間都用一條分割線隔開。

雖然不能嵌套定義過程,但在Visual Basic中提供有嵌套調(diào)用過程的方法,也就是主程序可以調(diào)用子過程,在子過程中還可以調(diào)用另外的子過程,這種程序結(jié)構(gòu)稱為過程的嵌套。
2. 過程的遞歸調(diào)用
遞歸調(diào)用的方法有兩種:直接遞歸和間接遞歸。
⑴ 直接遞歸。直接遞歸的實(shí)例代碼是:
Private Sub Sub1() '定義過程Sub1 … Call Sub1 '調(diào)用自身
… End Sub
⑵ 間接遞歸。間接遞歸的實(shí)例代碼是:
Private Sub SubA() '定義過程SubA … Call SubB '調(diào)用SubB … End Sub Private Sub SubB() '定義過程SubB … Call SubA '調(diào)用SubA … End Sub
【范例5-4】 定義一個計算平方根的子過程,并在子過程中調(diào)用自己,以實(shí)現(xiàn)對某個數(shù)進(jìn)行平方根的運(yùn)算。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在窗體中添加兩個命令按鈕控件、兩個標(biāo)簽控件和兩個文本框控件,將兩個文本框的Text屬性值設(shè)置為空,將兩個命令按鈕控件和兩個標(biāo)簽控件的Caption屬性值按下表進(jìn)行設(shè)置。

⑶ 將Form1窗體上的控件排列整齊,如圖所示。

⑷ 在Form1窗體中雙擊【計算】按鈕,打開代碼窗口,輸入以下代碼(代碼5-4-1.txt)。
01 Private Sub Command1_Click() 02 Dim x,x1,x2 As Single
03 x1=1 '為變量x1賦初值 04 x2=Val(Text1.Text) '為變量x2賦初值,并將其轉(zhuǎn)換成數(shù)值型 05 x=x2 '將變量x2的值賦給變量x 06 Call sqrt(x1,x2,x) '調(diào)用計算平方根的子過程 07 Text2.Text=x '將結(jié)果顯示在Text2中 08 End Sub
⑸ 在Form1窗體中雙擊【清除】按鈕,打開代碼窗口,輸入以下代碼。
01 Private Sub Command2_Click() 02 Text1.Text="" '清空文本框1中的內(nèi)容 03 Text2.Text="" '清空文本框2中的內(nèi)容 04 End Sub
⑹ 在代碼窗口中編寫sqrt的子過程(代碼5-4-2.txt)。
01 Private Sub sqrt(y1,y2,y) 02 Dim n As lnteger '定義變量n,用于記錄計算的次數(shù) 03 Dim y3 As Single '定義變量y3,用于接收計算后的值 04 Do While Abs(y1-y2)>0.000001 '判斷是否大于0.000001,小于則退出循環(huán)體 05 y3=(y1+y2)/2 '將傳遞后的y1與y2相加并對2求模 06 lf(y3*y3-y)<=0 Then '判斷平方根值是否小于等于零 07 y1=y3 '小于等于0則將平方根的值賦予y1 08 Else 09 y2=y3 '大于則將平方根的值賦予y2 10 End lf 11 n=n+1 '計算的次數(shù)加1 12 Loop 13 y=y1 '得到結(jié)果,賦值給形參 14 Print"經(jīng)過"&n&"次計算,得到"&Text1.Text&"的平方根"'輸出最終結(jié)果 15 End Sub
【運(yùn)行結(jié)果】
保存程序,按【F5】快捷鍵,運(yùn)行程序。在【請輸入一個大于1的數(shù)】文本框中輸入數(shù)值“3”,單擊【計算】按鈕,結(jié)果如圖所示。

【拓展訓(xùn)練5-3】
階乘運(yùn)算的方法很多,在這里使用遞歸的方法進(jìn)行一次階乘的運(yùn)算。
⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 在Form1窗體上添加一個命令按鈕控件。

⑶ 雙擊From1窗體上名稱為Commad1的命令按鈕控件,打開代碼窗口,輸入以下代碼(拓展代碼5-3-1.txt)。
01 Private Sub Command1_Click() 02 Dim s As Long '定義長整型變量,用于接收7的階乘值 03 Dim i As lnteger '定義整型變量,用于計數(shù)循環(huán) 04 s=0 '為變量s賦初值 05 For i=1 To 7 Step 1 '進(jìn)行階乘運(yùn)算循環(huán) 06 s=s+Factorial(i) '調(diào)用Factorial函數(shù)過程 07 Next i 08 Print"用遞歸方法求得1!+2!+…+7!的和為:";s '輸出最終的結(jié)果 09 End Sub
⑷ 在代碼窗口中編寫Factorial函數(shù)過程(拓展代碼5-3-2.txt)。
01 Public Function Factorial(ByVal n As lnteger)As Long 02 lf n=1 Then '如果接收到的數(shù)為1 03 Factorial=1 '返回1的階乘值 04 Else '否則遞歸調(diào)用函數(shù)過程 05 Factorial=Factorial(n-1)*n '返回值不為1的其他階乘值 06 End lf 07 End Function
⑸ 保存程序,按【F5】快捷鍵運(yùn)行程序,單擊【Command1】命令按鈕,結(jié)果如圖所示。

5.3 高手點(diǎn)撥
本節(jié)視頻教學(xué)錄像:3分鐘
本章中有兩個問題,不但是本章難點(diǎn),也是一些考試中常出現(xiàn)的問題,需要我們格外注意。
1. 確定自定義的過程是子過程還是函數(shù)過程
一般來說,函數(shù)過程名有值,子過程名無值。有一個返回值,則使用函數(shù)過程;有多個返回值或無返回值,一般使用子過程。
2. 實(shí)參與形參結(jié)合時對應(yīng)問題
在使用實(shí)參與形成那對照時,要注意個數(shù)、類型、位置、次序的一一對應(yīng)。
形參是按值傳遞,對應(yīng)實(shí)參可以是表達(dá)式、常量、數(shù)組元素。
形參是按址傳遞,對應(yīng)實(shí)參只能是簡單變量。
數(shù)組、記錄類型、對象只能是按地址傳遞。
5.4 實(shí)戰(zhàn)練習(xí)
一、思考題
1. 簡述調(diào)用Sub子過程與Function函數(shù)過程的區(qū)別是什么。
2. 參數(shù)傳遞有哪幾種,它們的區(qū)別是什么?
二、操作題
使用Function函數(shù)實(shí)現(xiàn)兩數(shù)平均值的計算。
- pytest框架與自動化測試應(yīng)用
- 軟件工程基礎(chǔ)教程
- 敏捷軟件開發(fā)(珍藏版)
- 掌握分布式跟蹤:微服務(wù)和復(fù)雜系統(tǒng)性能分析
- Netty權(quán)威指南
- Scala機(jī)器學(xué)習(xí)
- 經(jīng)·理@互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的進(jìn)階修煉
- Android游戲開發(fā)大全
- Python與數(shù)據(jù)挖掘
- Apache Pulsar原理解析與應(yīng)用實(shí)踐
- 百度SEO一本通
- 解決方案架構(gòu)師修煉之道(原書第2版)
- 敏捷軟件開發(fā):用戶故事實(shí)戰(zhàn)
- 混沌工程:通過可控故障實(shí)驗(yàn)提升軟件系統(tǒng)可靠性
- 軟件質(zhì)量管理指南