在VB中function 程式如何應用?
函數程序是由使用者定義的獨立的函數過程,與Sub字程式類似。Function 函數過程可讀取參數,修改語句。可作為獨立的基本語句調用,也可以在程式或是函數中嵌套使用。它有傳回值。Vb 中有許多內建的函數,如sin, cos, abs 等。如果過程需要多次用到某一公式或函數時,VB中有沒有可用的參數,此時,Function過程就派上用場了。
函數程序的文法為:
[private | public ] [static] Function (函數名)([形參表]) [as(類型)]
[語句列] [(函數名)= (運算式)]
Exit gunction
[語句列] [(函數名)=(運算式)]
End function
說明: 中括弧內的可省略, Function 函數程式跟Sub 字程式過程類似。只是as (類型)表示Function的傳回值是as 指向的類型。還有一種可以建立函數程序, 在工具 添加過程, 在添加過程中的對話方塊中,名稱由使用者自訂,可以是字母、數字、底線等。 在類型中選擇函數選項,點擊確定。OK! Function 函數過程建立完畢。
函數過程的調用:
1, call 語句。 Call (過程名) [實參表]
2, 直接調用。(過程名) [ 實參表]
3, 無參數直接調用。
舉例:
Function f2
F2=”Flollow me.”
End Function
關於vb function
誰能清楚地介紹vb function過程,闡明它是如何傳回值的? 下面這段代碼錶示什麼意義?
Dim y As Integer Private Sub Command1_Click() Dim x As Integer x=2 Text1.Text=f2(f1(x),y) Text2.Text=f1(x) End Sub Private Function f1(x As Integer)As Integer x=x+y:y=y+x f1=x+y End Function Private Function f2(x As Integer,y As Integer)As Integer f2=2*x+y End Function
以下是我的一個分析過程,由於我對流程圖不是很擅長.就把每一話都分析了一下。
Dim Y As Integer
分析1 這一句定義了一個全域的整形變數y,對於這個y的理解是整個問題的關鍵.因為Y是全域變數,因此Y的值會保留,直到程式結束.又因為沒有給Y賦值,所以系統會自動給Y賦0值.此時Y的值為0
Private Sub Command1_Click() '命令按鈕1的單擊事件
Dim x As Integer
這一句定義了一個程序層級變數X.程序層級變數指的是,該變數的生存期只在過程內,即在Command1_Click()過程內有效.若X在其他過程內出現,那麼系統也會給X賦0值.
分析2 x=2 給X賦值.此時X的值為2
Text1.Text= f2(f1(x),y)
接下來也就到了程式的痛點了.我相信你要的也是這一句的分析過程,當然,我也會詳細的分析.
首先來簡單說一下.這一句中,程式首先調用函數f1,得出f1的值,再調用函數f2,得出f2的值,最後再將f2的值在文字框內顯示.
當程式執行到此處時,程式會首先調用函數f1,執行f1內的語句.也就是說,程式執行到此處時,會首先執行Private Function f1(x As Integer)As Integer 內的語句.
因此,這裡跳到此語句分析.
Private Function f1(x As Integer)As Integer
這一句的意思是,函數f2返回一個整形變數,調用此函數時,必須提供一個參數X,該參數按址傳遞.當程式執行到此處時,程式會自動將調用者f1(參數)中的參數部分賦於X.
分析3 x=x+y
這一句的意思是,將X的值與Y的值相加,再賦於X.因為X=2,Y=0,所以X=2+0=2,即X=2.(關於為什麼X=2,請參看分析2.為什麼Y=0,請參看分析1),此時X=2.
分析4
y=y+x
這一句的意思就是,將Y的值與X想加,再賦於Y.因為X=2(為什麼X=2?參見分析3),Y=0(為什麼Y=0?參見分析1),所以Y=Y+X=0+2=2,此時Y的值為2,即Y=2.
分析5
f1=x+y
將X+Y的結果賦於f1.因為x=2(參看分析3),Y=2(參看分析4),所以f1=X+Y=2+4=4,也即f1=4.
當程式執行到這裡後,由於已經得出f1的值,程式跳會Text1.Text=f2(f1(x),y)這一句執行.因為f1=4(為什麼f1=4?參看分析5),所以此時代碼可簡化為:
Text1.Text=f2(4,y)
這一句的意思是,調用函數f2,再將f2的值賦於文字框,當中調用者提供了兩個參數,即4和Y.
分析6
此時程式會跳到Private Function f2(x As Integer,y As Integer)As Integer 函數過程內執行.這個函數過程的意思是,將第一個參數賦於X,將第二個參數賦於Y.因為f2(4,y)第一個參數為4,因此X=4,第二個參數為Y,因此Y=Y.
分析7
f2=2*x+y
此為數學運算,意思再明顯不過.計算2*X+Y的值,再將結果賦於f2,因此f2=2*x+y=2*4+2=8+2=10(為什麼X等於4?參看分析6)(為什麼Y等於2?參看分析4),所以f2=10.
計算出f2的值以後,回到Text1.Text=f2(4,y)內執行.因為f2=10(為什麼等於10?參見分析7),即Text1.Text=10,所以文字框控制項顯示的是10.
請您自己分析Text2.Text=f1(x)這一句的程式執行結果.當中的要點我都已經進行了詳細的解說,精確到點.如果您仍然不明白,那就應該好好的看一下書了.
vb Function 參數如何定義
一、子過程的定義與調用
1、子過程的種類
(1)在VB中,有兩類子(SUB)過程:事件程序和通用過程
事件程序
事件程序是在響應事件時執行的代碼塊。事件程序一般由VB建立,使用者不能增加或刪除。預設時事件程序是私人的。事件程序是附加在表單和控制項上的。其控制項事件的文法為:
Private Sub <控制項名>_<事件名>([形參表])
[(語句組)]
End SUB
通用過程
通用過程是指必須由其他過程顯示調用的代碼塊。通用過程由使用者自己建立。在一個過程中,通用過程可以被其他程序呼叫,這樣會提高代碼的利用率。通用過程又分為子過程和函數過程。
(2)定義通用過程
通用過程通常完成指定的任務,通用過程不與任何特定的事件相聯絡,只能由別的過程來調用,它可以儲存在表單或標準模組中。
子過程的形式如下:
[ Static][Public | Private ] 子程序名([形參表])
局部變數或常數定義
語句塊
[Exit Sub]
語句塊
End Sub
說明:可以將子過程放入標準模組、類別模組和表單模組中。按預設規定,所有模組中的子過程為PUBLIC(公用的),這意味在應用程式中可隨處調用它們;如果選用PRIVATE,只有該過程所在模組中的程式才能調用該過程。
如果使用STATIC(靜態)關鍵字,則該過程中的所有局部變數的儲存空間只分配一次,且這此致變數的值在整個程式運行期間都存在,即在每次調用該過程時,各局部變數的值一直存在;如果省略STATIC,過程每次被調用時重新為其變數分配儲存空間,當該過程結束時釋放變數的儲存空間。
形參表類似於變數聲明,它聲明了從調用過程傳遞進來的值。指明了傳送過程的變數個數和類型,各變數之間用逗號分隔。形式參數被預設為具有Variant資料類型。
建立通用過程的目的之一就是減少重複代碼,將公用語句放入離開的過程(通用過程)並由事件程序來調用它。
(3)建立新的通用過程
兩種方法:
使用“添加過程”對話方塊
在“代碼編輯器”視窗中輸入
查看過程
查看當前模組中的過程
查看其他模組中的過程
(4)調用過程
形式:(1)CALL 子過程名[(實參列表)]
(2)子過程名[實參列表]
舉例:
(1)在一個視窗中包含3個命令按紐,當使用者單擊其中一個時,要求其他個別按紐不能使用,並且視窗中按紐是相同的,其處理方法一致,用一個過程來實現。
(2)利用子程式的設計方法,先分別計算5!+6!+8!值的程式。
二、函數過程的定義和調用
函數是過程的另一種形式,當子過程的執行返回一個值時,把它作為函數就比較簡單。VB包含了許多內建的或內部的函數,使用者在編寫程式時,只需要寫出一個函數名並給定參數就能得出函數值。當程式中需要多次用到某一公式或要調用它們,這樣的函數稱為使用者定義函數。使用者定義函數與內建函式一樣,可以在程式中或函數嵌中使用。
函數過程的定義
(1)利用“工具”菜單下的“添加過程”命令定義
(2)利用代碼視窗直接定義
自訂函數過程的形式如下:
[ Static][Public | Private ] Function 函數過程名([參數列表])[AS 類型]
局部變數或常數定義
語句塊
函數名=傳回值
[Exit Function]
語句塊
函數名=傳回值
End Function
函數過程的調用
形式:函數過程名([參數列表])
說明:在VB中調用FUNCTION過程的方法和調用任何內建函式的方法是一樣的。還可以像調用SUB過程那樣調用函數過程。
例:已知直角三角形兩直角邊的值,計算第三邊(斜邊)的函數。
Function nuse(a as interger, b as interger ) as single
Nuse=sqr(a^2+b^2)
End Function
在VB中調用FUNCTION過程的方法:strx=nuse(width, Height)
也可以用下面的語句調用了同一個函數過程:call nuse(3,6) 或 nuse 3,6
舉例:
(1)設計計算圓面積的使用者定義函數。
(2)已知長和寬,計算矩形面積的函數。
(3)設計求任意整數N的階乘的函數,然後求3到10的階乘之和。
註:函數與過程的區別
函數以FUNCTION開頭,而過程以SUB開頭
當過程有一個傳回值時,可以使用函數。當過程有多個傳回值時,就當用過程。
函數是通過函數名回送一個結果值。在函數的形式參數表後面要說明函數(即結果)的類型。而過程的結果由參數送回。
函數體中至少要包括一個給函數賦值的語句。而過程不能給過程名賦值。
函數的調用出現在運算式中。而過程的調用必須作為一個單獨的語句。
形參沒有具體的值,只代表了參數的個數、位置、類型;只能上簡單變數,不能是常量、數組元素、運算式。
三、參數傳遞
在調用一個有參數的過程,首先進行的是“形實結合”,即按傳值傳遞或按地址傳遞方式,實現調用程式和被調用的過程之間的資料傳遞。通過參數傳遞,Sub過程或Function過程就能根據不同的變數執行同種任務。為了敘述方便,將形式參數簡稱為形參,實在參數簡稱為實參。
在Visual Basic中傳遞參數有兩種方式,即按值傳遞(Passed by Value)和按地址傳遞(Passed by refecence)。按值傳遞參數時,傳遞的只是實參變數的副本。如果在被調過程中改變了形參值,隻影響副本,而不會影響實參變數本身。即當控制返回調用程式時,實參變數保持調用前的值不變。在定義過程時,若形參名前面沒有關鍵字“ByVal”,即形參名前面預設修飾詞,或有“ByRef”關鍵字時,則指定了它是一個按地址傳遞的參數。按地址傳遞參數時,把實參變數(簡單變數、數組元素、數組以記錄等)的地址傳送給被調過程。因此實參變數的地址和與之結合的形參地址是相同的,也就是說形參和實參共用記憶體的同一“地址”,即共用同一個儲存單元。這樣在被調過程中的形式參數值一旦被改變,相應的實參值也跟隨著被改變了。
形式參數與實際參數
形式參數是指在定義通用過程時,出現在SUB或FUNCTION語句中的變數,是接收傳送子過程的變數。形式參數表的各個變數之間用逗號分隔。實際參數是指在調用SUB或FUNCTION過程時,傳送給SUB或FUNCTION過程的常量、變數或運算式。實參表可由常量、運算式、有效變數名、數組名組成,實參表中各參數用逗號分隔。
按值傳遞和按地址傳遞
傳遞參數的方式有兩種:如果CALL語句中的實際參數是常量或運算式,或者定義過程時選用ByVall關鍵字,就可以按值傳遞。如果CALL語句中的實際參數為變數,或者定義過程時選用ByRef關鍵字,就可以按地址傳遞。否則預設按地址傳遞參數。
(1)按值傳遞參數
按地址傳遞參數時,傳遞的只是變數的副本。如果過程改變了這個值,則所作變數隻影響副本而不會影響變數本身。當要求變數按值傳送時,可以先把變數變成一個運算式,把變數轉換成運算式的最簡單的方法就是把它放在括弧內。或者定義過程時用ByVal關鍵字指出參數是按值來傳遞的。例如:Sub Post (ByVal num as Integer )
例:運行下面給出的程式,理解按值傳遞參數。
Private Sub Form_Click( ) Dim a as intger, b as integer, c as integer A=5: b=3 : c=9ClsPrint a; b; cCall prod( (a), (b), (c) )Print a; b; cEnd SubSub prod (a as intger, b as integer, c as integer ) Print a; b; ca=6 : b=8 : c=a*b print a; b; c
(2)按地址傳遞參數
按地址傳參數,就是讓過程根據變數的記憶體位址去訪問實際變數的內容,即形式參數與實際參數使用相同的記憶體位址單元, 這樣通過子過程就可以改變變數本身的值。系統預設按地址傳遞參數。在傳遞調用時,實際參數必須是變數,常量或運算式無法傳址。
例:運行下面給出的程式,理解按地址傳遞參數。
Private Sub Form_Click( ) Dim a as intger, b as integer, c as integer A=5: b=3 : c=9ClsPrint a; b; cCall prod( a, b, c )Print a; b; cEnd SubSub prod (x as intger, y as integer, z as integer ) Print x; y; zx=6 : y=8 : z=x*y print x; y; z
舉例:
Private Sub Form_Click( ) Dim x as intger, y as integer X=8 : y=3 Call test(5, x, y+1) ‘5傳值,X傳址, Y+1傳值Print “主程式”,5, x, yEnd SubSub test (a as intger, b as integer, c as integer ) Print “子程式”, a, b, c A=2: b=4: c=9End Sub
四、過程的嵌套和遞迴調用
1、過程的嵌套
2、過程的遞迴調用
遞迴調用是指一個過程直接或間接調用自己本身,即自己調用自己。VB的過程具有遞迴調用功能,遞迴調用在處理階乘運算、級數運算、冪指數運算等方面特別有效。
遞迴是一種十分有用的程式設計技術。由於很多的數學模型和演算法設計方法本來就遞迴的。用遞迴流程說明它們比用非遞迴方法簡潔易讀,可理解性好,演算法的正確性證明也比較容易,因此讀者應掌握遞迴程式設方法。遞迴過程是在流程定義中調用(或間接調用)本過程的過程。在遞迴調用中,一個過程執行的某一步要用到它自身的前面一步或前若干步的結果。
五、變數的作用範圍
範圍 定義方式
局部變數
Dim,Static
模組層級變數 Dim,Private
全域變數
Public
變數的定義位置
過程之中
模組的聲明段中
模組的聲明段中
能否被本模組中其它過程訪問
×
√
√
能否被其它模組訪問
×
×
√
變數的作用範圍不同時,變數的名字可以相同。變數的作用範圍還可以出現交叉。一般來說,當變數名稱相同而範圍不同時,局限性大的變數總會用“陰影”遮住局限性不太大的變數(即優先訪問局限性大的變數)。例如,程式中有一個模組層級變數Temp,還有一個名為Temp的程序層級變數,則它的“陰影”會遮住模組層級變數Temp。
在一個過程內部用Dim語句定義的變數是局部變數,只有在定義它們的過程中才能訪問或改變變數的值,這樣的變數成為局部變數;為了使某個變數在整個模組的所有過程中都能使用,在模組的(通用)和(聲明)部分使用Private或Dim語句定義的變數就是模組層級變數,在該模組中任何過程都可以對模組層級變數進行讀、寫操作;在模組的(通用)和(聲明)部分使用Public語句定義的變數就是全域變數,在應用程式的任何部分都可以對全域變數進行讀、寫操作。
使用Dim在過程中定義的變數,在過程結束後變數的值不能被儲存下來。在每一次過程重新執行時,變數的內容將被清除。如果希望在離開該過程後,還能儲存過程中局部變數的值,就應該使用Static關鍵字在過程中定義局部變數,即使過程結束,變數的值仍然保留著。
Visual Basic程式的表單模組、標準模組和類別模組可以定義變數,在過程和函數中也可以定義變數。在不同部分定義的變數在程式中的適用範圍是不同的。Visual Basic中的變數可以分為局部變數(程序層級變數)、模組層級變數和全域變數。
程序層級變數
在一個過程內部聲明變數時,只有該過程內部的代碼才能訪問或改變該變數的值。程序層級變數的作用範圍限制在該過程。在過程內部使用DIM或STATIC關鍵字聲明變數。
如果在過程中未作說明而直接使用某個變數,該變數也被當成程序層級變數。用STATIC說明的變數在應用程式的整個運行過程中都一直存在,而用DIM說明的變數只在過程執行時存在,退出過程後,這類變數就會消失。過程變數通常用於儲存臨時資料。
1、程序層級變數
在模組有聲明中聲明的變數屬於模組層級變數。模組層級變數分為兩種:私人和公有。
(1)私人的模組變數
私人的模組層級變數在說明它的整個模組中的所有過程中都能使用,但其他模組卻不能訪問該變數。說明方法是在模組的聲明中使用PRIVATE或DIM關鍵字聲明變數。
(2)公有的模組層級變數
公有的模組層級變數在所有模組中的所有過程中都能使用。它的作用範圍是整個應用程式,因此公有模組層級變數屬於全域變數。說明方法是在模組的聲明中使用PUBLIC關鍵字聲明。
全程變數是指在所有程式(包括主程式和過程)中都可以使用的記憶體變數。全程變數就像在一個過程中定義的變數一樣,在子過程中可以任意改變和調用,當某子過程執行完後,其值帶回主程式。
2、變數的生存期
(1)動態變數
動態變數是指程式運行後進入變數所在的子程式,才分配該變數的記憶體單元,經過處理退出該過程,該變數佔用的記憶體單元自動釋放,其值消失,其記憶體能被其他變數佔用。
使用DIM關鍵字在過程中聲明的局部變數,在過程執行結束後變數的值不被保留,在每一次重新執行過程時,變數重新聲明。用DIM聲明的變數屬於動態變數。
(2)靜態變數
靜態變數是指程式運行進入該變數所在的子程式,修改變數的值後,退出該子程式,其值仍被保留,即變數所佔記憶體單元沒有釋放。當以後再次進入該子程式,原來變數的值可以繼續使用。
使用STATIC關鍵字在過程中聲明的局部變數,就屬於靜態變數。靜態變數在過程退出後仍然可以保持原來的值。