官术网_书友最值得收藏!

第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ù)平均值的計算。

主站蜘蛛池模板: 永安市| 泸水县| 九龙县| 丰顺县| 宁晋县| 舒城县| 永安市| 万载县| 凤凰县| 高陵县| 馆陶县| 桐庐县| 邵武市| 建宁县| 方山县| 沧州市| 辽源市| 社旗县| 卢氏县| 商城县| 克东县| 宝清县| 汽车| 吉林市| 如皋市| 新巴尔虎左旗| 吕梁市| 红河县| 灯塔市| 屯昌县| 嘉鱼县| 磴口县| 永泰县| 泽库县| 海阳市| 府谷县| 黑河市| 湛江市| 正定县| 黎城县| 张家界市|