江蘇省計算機等級考試二級vb過程講解 |
||||||
第 8 章 過程 教學要求 掌握VB的兩種過程:事件過程和通用過程 掌握Sub過程的定義 掌握Function過程的定義 掌握過程的調用 掌握參數的傳遞——按值傳遞和按地址傳遞 掌握遞歸算法 掌握變量的作用域 8.1 Sub過程 當對象識別某事件后,進行的操作處理——以代碼的形式存儲在事件過程中。 分類: 窗體事件過程 控件事件過程 1 定義事件過程 [形式]: Private Sub Form_事件名([參數列表]) [局部變量和常數聲明] 語句塊 End Sub Initialize(初始化)事件——配置窗體時觸發 Load(加載)事件——窗體裝入內存時觸發 Activate(激活)事件——窗體被激活時觸發 Gotfocus事件(得到焦點)事件——窗體成為當前焦點時觸發 窗體上無可視控件時,觸發窗體的Gotfocus事件; 窗體上有可視控件時,觸發控件的Gotfocus事件; 執行次序: Initialize Load Activate Gotfocus 窗體的Initialize、Load事件發生在窗體被顯示之前,其中可放置系統初始化命令,但其中語句有所限制; 窗體加載后,只要不被卸載,就不會再執行Initialize、Load事件,但Activate事件會多次發生; 當訪問另一窗體上的“非可視”數據或調用其中定義的全局過程時,只會觸發該窗體的Initialize事件,而Load事件不觸發; 當訪問另一窗體上的“可視”數據時,會同時觸發該窗體的Initialize和Load事件; 3 定義控件的事件過程 [一般形式]: Private Sub 控件名_事件名([參數列表]) [局部變量和常數聲明] 語句塊 End Sub 完成某一特定功能的程序段 ——通用過程(自定義) 必須顯式調用方可執行; 分為: 公有過程(Public) 私有過程(Private) 1 通用Sub過程的定義 [一般形式]: [Private|Public] [static] Sub <過程名>([<參數列表>]) <過程體> End Sub [說明]: (1) 以Sub開頭,End Sub結束,,中間是過程體——包括變量聲明和語句塊; (2) 以Private為前綴的過程是模塊級的,以Public為前綴的過程是應用程序級的,缺省默認是Public; (3) Static 選項說明過程中的局部變量是靜態變量; (4) 過程名的命名規則和變量名相同,在同一個模塊中,過程名必須是唯一的; (5) 參數列表中的參數稱為形式參數,可以沒有,但無參數時圓括號不能省略;有多個參數時,參數之間用逗號間隔; (6)參數說明格式: [Optional][ByVal|ByRef] <變量名>[()][As <數據類型>] 其中: a) 若參數是數組,則在變量名后面加一對圓括號,但無維界定義 b) ByVal:指明參數傳遞方式是傳值; c) ByRef:指明參數傳遞方式是傳地址,為缺省值; d) 若參數是字符型的,必須是不定長字符串; e)Optional:參數是可選的,必須定義在必選參數后面。 (7) 當過程調用結束,即執行到End Sub語句,系統自動返回調用程序的調用語句處,執行調用語句的下一條語句; (8) 過程不能嵌套定義,但可嵌套調用; (9)Exit Sub語句的功能是提前退出過程調用,返回調用語句。 例: Private Sub Exchange(x As Integer,y As Integer) Dim Temp As Integer Temp=x : x=y : y=Temp End Sub 該通用過程實現交換功能,包含兩個參數,均是ByRef形式的參數。 3 Sub過程調用 必須在事件過程或其它通用過程中顯示調用。 Sub過程調用 [格式一]: Call <過程名>[(<實在參數表>)] [格式二]: <過程名> [<實在參數表>] [功能]:對已定義的過程進行調用。 如: Call Fact(x) Fact x (1)調用的過程必須是已經定義的,否則系統會出現“子程序或函數未定義”的信息提示; (2)實在參數可以是常量、變量或表達式; (3)實在參數的數目及類型要和定義時必選參數保持一致,否則系統會出現“參數不可選”的信息提示,參數之間用逗號間隔; (4)若子程序沒有參數,則格式一中的括號可以省略; (5)格式一和格式二的區別在于:格式二的參數表無須括號,而是和過程名之間用空格隔開; 例8-2 試編寫一個找出任意一個正整數的因子的程序 Option Explicit Private Sub Command1_Click() Dim inta As Integer, st As String inta = Text1 Call factor(inta, st) Text2 = st End Sub Private Sub factor(ByVal n As Integer, s As String) Dim i As Integer For i = 1 To n - 1 If n Mod i = 0 Then s = s & Str(i) Next i End Sub 優點:程序即Sub過程的使用不僅可以縮短程序的長度,還能夠使程序的結構更加清楚。 例:定義一個通用過程用以求一維數組中的最小值 Private Sub value(a() As Integer, min As Integer) Dim i As Integer min = a(1) For i = 2 To UBound(a) If a(i) < min Then min = a(i) Next i End Sub 8 . 2 Function 過程 Function過程的特點是返回一個值,因此我們通常也稱之為自定義函數。通常我們利用Function過程得到一個數值或一個字符串或一個邏輯值。 [格式]: [Private|Public] Function <函數名>([參數列表]) [As <數據類型>] <函數體> End Function (1) 以Function開頭,以End Function結束,中間是函數體; (2)函數名命名規則、參數列表的表示都和Sub過程相同; (3)As 數據類型:函數過程將由函數名返回一個值,值的類型由[As 數據類型]定義; ★ (4) 函數體中一定要有對函數名賦值的語句——函數名=表達式,否則返回相應類型的初值; ★ (5)函數體內可有Exit Function語句——無條件退出函數過程,返回主程序。 (6)Function過程不能嵌套定義,但可嵌套調用。 例:定義函數: Private Function f(ByVal x As Integer) As Integer f = 3*x^3-2*x^2+6*x-1 End Function 例8-1:編寫一個求n!的函數。 Private Function Fact(Byval n As Integer) As Long Dim K As Integer Fact=1 If n=0 Or n=1 Then Exit Function Else For K=1 To N Fact=Fact*K Next K End If End Function 2 調用 Function 過程 [格式]:<函數名>([實在參數表]) [功能]:返回一個函數值。 [說明]: (1)一般情況下,函數的調用出現在賦值語句中,并且在賦值號的右側; (2)若函數沒有參數,函數名后的括號不能省略; (3)雖然VB允許象調用Sub過程那樣調用Function過程,但這樣調用時系統不返回函數值,建議大家不要使用這種調用方法。 Call fact(x) Fact x 這兩種方法均放棄函數的返回值 例:用函數實現求一維數組中的最小值,對比前例(SUB) Private Function min( a( ) As Integer ) As Integer Dim i As Integer min = a(1) For i = 2 To UBound(a) If a(i) < min Then min = a(i) Next i End Sub 例:定義函數用以判斷一個數是否是素數 Private Function Prime(N As Integer) As Boolean Dim i As Integer Prime = False For i = 2 To N-1 If N Mod i = 0 Then Exit For Next i If i =N then Prime = True End Function [例]:S=1!+2!+…+10! Private Sub Form_Click() Dim S As Long, i As Integer For i = 1 To 10 Next i Print ”S="; S End Sub Private Function Fact(n As Integer) As Long Dim i As Integer Fact = 1 For i = 1 To n Fact = Fact * i Next i End Function 例8-3:利用函數過程編寫一個求兩個正整數的最大公約數的程序 Private Sub Form_Click( ) ‘ 主調過程 Dim N As Integer, M As Integer, G As Integer N = InputBox("輸入N") M = InputBox("輸入M") G = Gcd(N, M) Print N; "和"; M; "的最大公約數是:"; G End Sub Private Function Gcd(ByVal A As Integer, ByVal B As Integer) As Integer Dim R As Integer R = A Mod B Do While R <> 0 A = B B = R R = A Mod B Gcd = B End Function 2、調用標準模塊中的公有過程 [格式]:Call [<標準模塊名>.]<過程名>[(<實參表>)] [功能]:調用其他標準模塊中定義的公有過程。 [說明]: 若公有過程唯一,則直接調用,不加模塊名。 若存在同名的公有過程,則: 調用本模塊中過程:直接調用,不加模塊名 調用其它模塊中過程:必須加模塊名。 被調用的函數和過程必須是公有的; 函數也可以這樣調用。 8.4 參數的傳遞 形式參數: 過程定義時,在過程名后面的圓括號里的一系列變量; 過程被調用執行時,系統才給形參分配存儲空間; 可以是除定長字符串外的任一簡單變量; 可以是數組,變量名后接括號; 簡稱“形參” 實在參數 主調程序中,調用語句中,出現在過程名后面圓括號里的變量,是實在參數,可以是常量、變量或表達式; 過程調用傳遞參數時,實參按“位置”和形參結合; 實在參數和形式參數,要求個數一樣,位置對應,類型一致,否則會出錯; 定長字符串變量可以作為實在參數; 簡稱“實參” 舉例:寫出下列程序執行的結果 Private Sub ExamSub( x as integer,y as integer) x=x+10 : y=y-10 End Sub Private Sub Form-click() Dim x as integer, y as integer x=10:y=100 Call ExamSub( y ,x ) Print “x=” ; x ; “y=” ; y End Sub [格式]:ByVal <變量說明> [傳遞方式 ]: 調用時,系統為形參分配一個臨時存儲單元,并將實參的值存儲到該臨時單元中。 若在被調用的過程體中改變了形參的值,只是改變了臨時存儲單元中的數據,對實參的值無任何影響。 [參數傳值傳遞]舉例: Private Sub Form_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value_change(M, N) Print "M="; M, "N="; N End Sub Private Sub Value_change(ByVal x As Integer, ByVal y As Integer) x = x + 20 y = y + 20 Print "X="; x, "Y="; y End Sub 傳值是單向的: 調用時,實參將值傳遞給形參,兩者就無任何關聯。過程中形參的值發生變化,對實參無任何影響。 [格式]: ByRef <變量說明> [傳遞方式]: 系統在調用執行過程時,為形參分配臨時存儲單元,并將實參的內存單元地址傳送給形參,存儲在臨時存儲單元中 在被調用的過程體中一切對形參的操作,都是直接對地址保存在形參中的內存單元中的數據進行的,而實參就是保存在此內存單元中的數據,所以任何對形參的操作也就是對實參的操作; 按地址傳遞時,形式參數和實在參數共用同一“內存單元”。 [參數傳址傳遞]舉例:(對比前例) Private Sub Form_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value(M, N) Print "M="; M, "N="; N End Sub Private Sub Value(x As Integer, y As Integer) x = x + 20 y = y + 20 Print "X="; x, "Y="; y End Sub 傳地址是雙向的: 舉例:計算5!+4!+3!+2!+1! Private Sub Form_Click() Dim Sum As Integer, I As Integer For I = 5 To 1 Step -1 Sum = Sum + Fact(I) Next I Print "Sum="; Sum End Sub Private Function Fact(n As Integer) As Integer Fact = 1 Do While n > 0 Fact = Fact * n n = n - 1 End Function 將傳地址修改為傳值的方式為: 方法一:在形參n前加ByVal 方法二:將調用語句中fact(i)改為fact( ( i ) ) 參數有兩種傳遞方式:傳值(ByVal)和傳地址(ByRef)。 若調用時實參為常量或表達式,這兩種方式沒有區別,無論形參定義的是按值傳遞還是按地址傳遞,系統都是按傳值方式傳遞 系統在調用時為形參分配一個臨時存儲單元,將表達式的值計算出來,存儲到該臨時單元;調用結束,系統收回臨時單元。 調用函數或過程時,將單個變量轉換成表達式的方法:將變量放在一對括號中。如用Fact((I))的方式調用函數,系統會按傳值來處理。 按地址傳遞時,當實參是變量時,實參與形參必須類型完全一致; 按地址傳遞時,當實參是常量或表達式時,VB會自動進行類型轉換,然后再傳遞相應的值(即類型無須完全一致); 在算術表達式中,函數的優先級最高,若表達式中有函數的實參,而函數的參數又是按地址傳遞的,則函數中有可能改變了實參的值,即改變了表達式中變量的值,會引起混淆。 Private Sub Form_Click() Dim S As Single S=125.5 Call Convert((S),” End Sub Private Sub Convert(Inx As Integer,Sing As Single) Inx=Inx*2 Sing=Sing+23 Print “Inx=”;Inx,”Sing=”;Sing End Sub VB允許把數組作為形式參數,聲明數組的格式是: <數組名>() As <數據類型> [注意]: (1)數組參數只能按地址傳遞,即不能用ByVal來修飾數組參數 (2)定義數組參數時無須說明數組的維數和下標變化范圍; (3)調用過程時,對應的實在參數也必須是數組,但只需要數組名,無須后跟括號,且數據類型也要一致。` (4)在過程體或函數體中無須對數組參數再次說明; (5)若實參是動態數組,在過程體或函數體中可以使用重定義語句修改數組的維界; 舉例 Private Sub Form_Click() Dim a() As Integer, i As Integer Dim n As Integer n = InputBox("請輸入數組的初始大小") ReDim a(n) For i = 1 To n a(i) = i Next i Call PrintArray(a) Call Array1(a) Call PrintArray(a) End Sub Private Sub PrintArray(x() As Integer) Dim i As Integer For i = LBound(x) To UBound(x) Print x(i); Next i Print End Sub Private Sub Array1(a() As Integer) Dim m As Integer, n As Integer n = UBound(a) m = InputBox("請輸入新大小") ReDim Preserve a(m) Dim i As Integer For i = n + 1 To m a(i) = 0 Next i End Sub 輸入5和8,程序執行結果為: 舉例:自定義一個將一維數組按從小到大排序的通用過程 Private Sub Command1_Click() Dim i As Integer, j As Integer Dim a(10) As Integer For i = 1 To 10 a(i) = Int(8 * Rnd) Picture1.Print a(i); Next i Call sort(a) For i = 1 To 10 Picture2.Print a(i); Next i End Sub Private Sub sort(a() As Integer) Dim i As Integer, j As Integer For i = 1 To UBound(a) - 1 For j = i + 1 To UBound(a) If a(i) > a(j) Then temp = a(i) a(i) = a(j) a(j) = temp End If Next j Next i End Sub 本程序的功能是找出100~200之間的所有素數。 Private Sub Form_Click() Dim i As Integer, x As Integer For i = 100 To 200 If prime(i) Then Print i Next i End Sub Private Function prime( byval n as integer ) As Boolean Dim i As Integer For i = 2 To Sqr(n) If n Mod i = 0 Then Next i prime = True End Function 8.5 遞歸過程 所謂遞歸,就是在過程定義中,調用過程本身。 例:使用遞歸函數求N!。 [提示]:N!=N*(N-1)! Private Sub Form_Click() Dim n As Integer n = InputBox("輸入一個正整數") Print n; "!="; fact(n) End Sub Private Function fact(ByVal n As Integer) As Long If n = 1 Then fact = 1 Else fact = n * fact(n - 1) End If End Function 總結: 使用遞歸算法,最重要的是要有一個結束遞歸的條件,可以使遞歸得以返回,即終止條件或邊界條件。 例:使用遞歸算法計算裴波拉挈數列。 Private Sub Form_Click() Dim n As Integer n = InputBox("求數列的第幾項") Print “數列中第”; n; “項是”; Cal(n) End Sub Private If n = 1 Or n = 2 Then Else Cal = Cal(n - 1) + Cal(n - 2) End If End Function 遞推法:利用未知項與已知項之間存在的某種關系,從已知項逐項推出未知項的方法。 Private Sub Form_Click() Dim fb() As Integer Dim i As Integer,, n as integer n = InputBox(“求數列中第幾項的值”) Redim fb(n) fb(1)=1:fb(2)=1 For i = 3 To n fb(i)=fb(I-1)+fb(I-2) Next i Print "數列中的第"; n; "項是"; fb(n) End Sub [例8-9]:編寫一個遞歸函數,求任意兩個整數的最大公約數。 Private Sub Command1_Click() Dim Gcdvalue As Long, M As Long, N As Long If M < > 0 And N < > 0 Then Gcdvalue = Gcd(M, N) Text3.Text = CStr(Gcdvalue) End If End Sub Private Function Gcd(ByVal X As Long, ByVal Y As Long) Dim R As Long R = X Mod Y If R = 0 Then Gcd = Y Else X = Y :Y = R :Gcd = Gcd(X, Y) End If End Function 練 習 寫出下列程序運行的結果: Private Sub Command1_Click() Dim a As Integer a = 2 Call sub1(a) End Sub Private Sub sub1(x As Integer) x = x * 2 + 1 If x < 10 Then Call sub1(x) End If x = x * 2 + 1 Print “x=”;x End Sub Private Sub Command1_Click() Dim a As Integer a = 2 Call sub1(a) End Sub Private Sub sub1(x As Integer) x = x * 2 + 1 If x < 10 Then Call sub1(x) End If x = x * 2 + 1 Print “x=”;x End Sub 8.6 變量的作用域 在一個過程內部聲明的變量,只在過程內部有效,又稱為局部變量; 例: Private Sub Command1_Click() Dim i As Integer i = i + 1 Print i End Sub Private Sub Command2_Click() i = i - 1 Print i End Sub 過程級變量,過程開始執行時,系統分配給其存儲單元,而一旦過程運行結束,系統就收回存儲空間。在其它過程中,不可訪問。 在模塊的“通用”聲明段中用Private和Dim聲明的變量,模塊中任何一個過程都可以訪問; Dim i As integer Private Sub Command1_Click() i = i + 1 Print i End Sub Private Sub Command2_Click() i = i - 1 Print i End Sub 模塊級變量,在模塊加載時,即分配給其內存存儲單元,模塊中任意過程均可對該變量進行操作,直到模塊卸載時,系統才收回存儲空間。但在其它模塊中,不可訪問。 當變量的作用域不同時,允許變量的名稱相同。 例如: Dim i As integer Private Sub Command1_Click() i = i + 1 Print i End Sub Private Sub Command2_Click() Dim i As integer i = i + 10 Print i End Sub 說明:當變量名稱相同而作用域不同時,優先訪問局限性大的變量,即作用范圍小的變量屏蔽作用范圍大的變量。 Option explicit Public x as integer,y as integer,z as integer Private sub form_activate() Conflict_x Debug.print “X,Y和Z是:”,x,y,z End sub Private sub form_load() X=10 : y=20 : z=35 End sub Private sub conflict_x() Dim x as integer x=135 Debug.print “X,Y和Z是:”,x,y,z End sub 在過程內的變量定義時,用Static 關鍵字定義的變量。 所謂靜態變量,是指僅在過程第一次執行時,分配給該變量內存單元,到過程執行結束時,并不象其它局部變量一樣收回存儲空間,系統并不收回分配給靜態變量的存儲空間,其內的內容得以保留,當再次調用執行該過程時,靜態變量中保留了上次運行時的數據,本次執行可直接訪問。 靜態變量只在過程內有效,即是局部變量 Private Sub Command1_Click() Static i As integer i = i + 1 Print i End Sub 舉例: Option explicit Private sub command1_click() Dim k as integer K=5 Call static-variable(k) Debug.print “第一次調用:k=”;k K=5 Call static-variable(k) Debug.print “第二次調用:k=”;k End sub Private sub static_variable(n as integer) Static sta as integer Sta=n+sta N=sta+n End sub 說明: 因二次過程調用時,STA的初值不同,所以雖然實參一樣,但運行結果不同。 練 習 Dim a As Integer, b As Integer ‘模塊級變量 Private Sub Form_click() Dim x As Integer, y As Integer a = 5: b = 3 x = x + a: y = y + b Print fun1(x, y) Print fun1(x, y) End Sub Private Function fun1(m As Integer, n As Integer) As Integer Static k As Integer ‘靜態變量 Dim a As Integer, b As Integer ‘同名的過程級變量 a = a + m b = b - n k = k + a + b fun1 = k End Function 寫程序運行結果: 上課習題講解: 1.執行下面的程序,單擊Commandl,則窗體上第一行顯示的是 (______) ,第二行顯示的是(______________) 。 Option Explicit Dim X As Integer Private Sub Commandl_Click() Dim Y as Integer X=10:Y=2 Call process(Y) Print X,Y Call process((Y)) Print X,Y End Sub Private Sub process(n As Integer) Dim Y As Integer If n>0 Then X=X-n Y=X Else X=X+n Y=X+2 End If n=-n End Sub 2.執行下面的程序,連續三次單擊命令按鈕Commandl之后,A數組共有 (________) 個元素;數組元素A(2)的值是(____________) ,A(4)的值是.(_______________) 。 Option Explicit Option Base 1 Private Sub Commandl_Click() Static A()As Integer,n As Integer Dim i As Integer,k As Integer k=n ‘ n=n +2 ReDim Preserve A(n) For i=k+1 To n A(i)=i*n+1 Next i For i=1 To n Print A(i); Next i End Sub 3.執行下面的程序,單擊Commandl,在窗體界面上顯示的第一行是 (___________) ,第二行是 (___________) ,第三行是(_______________) ,第四行是(____________) 。 Option Explicit Private Sub Commandl_Click() Dim a As Integer,b As Integer,i As Integer i=1218 a=i\100 b=i Mod 100 If b<>0 Then Print a Print b . Print Lcd((a),(b));a;b Print Lcd(a,b);a;b End If End Sub Private Function Lcd(x As Integer,Y As Integer)As Integer Dim d As Integer ’ If x<Y Then d=x:x = Y:Y = d End If d=X Do If x Mod Y=0 Then Lcd=x Exit Do Else X=x+d End If End Function 4.本程序的功能是利用無窮級數求cos(x)的近似值,已知: 當第n項的絕對值小于等于10^-7時計算終止。 Option Explicit Private Sub Commandl_Click() Dim X As Single,n As Integer,sum As Single
Dim a As Single x=Textl ( ______________ ) a=1 n=1 Do a=-a a=( _________________ ) sum=sum+a n=n+1 Text2=sum
End Sub 7.定義方陣的一種范數為該方陣各列元素的絕對值之和中的最大值。以下程序的功能 是求一個4×4方陣的范數。該方陣的數據是隨機生成的-20~20之間的整數。 Option Explicit Option Base 1 Private Sub Commandl_Click() Dim a(4,4) As Integer Dim i As Integer,j As Integer For i=1 T0 4 For j=1 To 4 a(i,j)= ( _________ ) Picturel.Print Right(" "&Str(a(i,j)),4); Next j Picturel.Print Next i Textl.Text= (______________ ) End Sub Private Function fan(a()As Integer)As Integer Dim b(4) As Integer,max As Integer Dim i As Integer,j As Integer For i=1 To 4 For j=1 To 4 b(j)=( ______________ ) Next J Next i max=b(1) For i=2 To 4 If max<b(i) Then max=b(i) Next i fan=max End Function
8.下面程序的功能是:找出僅由數字1、2、3、4組成的4位素數,要求每個素數由4個不 同數字組成。算法提示:函數Validate用于驗證一個4位數是否由4個不同數字組成。在函 數中用A數組的各個元素分別對應數字0~9,只要某數字出現在四位數中,無論幾次,均將該數字對應的數組元素值置為1。 Option Explicit Private Sub Commandl_Click() Dim i As Integer,Flg As Boolean For i=1234 To 4321 ( ________________ ) Call Prime(i,Flg) If Flg Then If Validate(i)Then Textl=Textl & i & vbCrLf . End If End If Next i End Sub Private Sub Prime(n As Integer,f As Boolean) Dim k As Integer For k=2 To Sqr(n) ( __________________ ) Next k f=True End Sub Private Function Validate(n As Integer)As Boolean Dim A(0 To 9)As Integer,s As String,i As Integer Dim sl As String*1 . ( ____________________ ) For i=1 To Len(s) sl=Mid(s,i,1) ( ____________________ ) Next i If A(1)+A(2)+A(3)+A(4)=4 Then ( ________________________ ) End If End Function 9.下面程序的功能是:首先生成一個由小到大已排好序的整數數組,再輸入一個數據,單擊“插入”按鈕會自動把這個數據插人到原數組適當的位置,并保持數組的有序性。 Option Explicit Dim a( )As Integer Private Sub Form_Activate() Dim i As Integer ReDim a(10) For i=1 To 10 a(i)=(i-1)*10+1 Textl=Textl & Str(a(i)) Next i Text2.SetFocus End Sub Private Sub Commandl_Click() Dim n As Integer,i As Integer n=Text2 For i=1 To UBound(a) If ( __________________ )Then Exit For Next i ( ______________________ ) For i=1 To UBound(a) Text3=Text3 & Str(a(i)) Next i End Sub Private Sub inst(P()As Integer,n As Integer,k As Integer) '數組元素移位并實現插入 Dim i As Integer ( ____________________ ) For i=UBound(P)-l To k Step -1 ( ____________________ ) Next i P(k)=n End Sub 課后習題: 1.運行下面的程序,單擊commandl,在窗體上顯示的變量A的值為( _____ ),變量B的值為( _______ ) Option Explicit Dim A As Integer Private Sub Command1_Click() Dim B As Integer B=3 A=4 B=Fun(Fun(A,B+2),A)+B Print A,B End Sub Private Function Fun(N As Integer,K As Integer) N=N+A K=N-K Fun=N+K+A End Function 2.執行下面的程序,單擊command1,窗體上顯示的第一行是(_____ ),第二行是( _____ ),第四行是( _______ ),最后一行是( ________ ) Option Explicit Private Sub Command1_Click() Dim n As Integer n=5 Call test(n) Print n End Sub Private Sub test(ByVal n As Integer) Dim i As Integer,S As String If n>0 Then For i=1 To n S=S & CStr(i) Next i Print S Call test(n-2) Else Print "OVER" End If End Sub 3.運行下列程序,單擊Command1,在窗體上顯示的第一行內容是 (______ ),第二行的內容是(________ ),第三行的內容是( ________ )("A"的ASCII碼是65,"z"是90) Option Explicit Private Sub Command1_Click() Dim i As Integer, st As String, n As Integer, p As String * 1 p = "B" For i = 3 To 1 Step -1 n = Asc(p) - i If n < 65 Then n = n + 26 st = Chr(n) st = st & F(i) Print st Next i End Sub Private Function F(n As Integer) Dim i As Integer Static S As Integer For i = 1 To n S = S + i Next i F = S End Function 6•用以下公式求f(x)的值。當通項的絕對值小于10^-7時停止計算,x的值由鍵盤輸入。 f(x)=a1x1-a2x2+a3x3-…+(-1)n+1anxn+… |X|<l其中 a1=1,a2=2,an= Option Explicit Private Sub Command1_Click()、 Dim x As Single,fx As Single Dim a As Single,a1 As Single,a2 As Single Dim t As Single a1=l:a2=2 x=text1 If (______________ ) Then MsgBox("x必須在-1---1之間") ExitSub End If fx=a1*x-a2*x*x t=(-1)*x*x DO a=1/(al+a2) t=(-1)*x*x fx=(________________ ) al=a2 ( ________________ ) Loop Until Abs(a*t)<0.0000001 Text2=fx End Sub 7.學生的某次課程測驗中,選擇題的答案已記錄在列表框list1中,其數據行格式是:學號為6個字符長度,2個空格,選擇題的答案為15個字符長度,程序根據標準答案進行批改,每答對一題給1分,并將得分存放到列表框list1中,標準答案存放在變量Exact中。 Option Explicit Private Sub Command1_click() Dim Anw as string , StudId as string Dim Scor as Integer, Exact as string Dim I as Integer, J as integer Exact=”ABCCBAACBBDCCDA” For I=( ____________ ) Anw=( _______________ ) StudId=Left(Anw,6) Anw=Right(Anw,Len(Anw)-8) ( _______________ ) For J=1 to Len(Anw) If ( ________________ ) Then Scor=Scor+1 End If Next J List2.AddItem StudId & “ “ & Scor Next I End Sub
8.下面程序的功能是:統計存放在數組A中的N個數有多少個是不同的。具體做法是:變量Left指向要被處理的數(從第2個元素開始),Right指向數組最后一個元素。若A(Left)與排在它前面的某個數組元素值相同,就用數組元素A(Right)的值來替換A(Left)的值,同時將變量Right的值減1;否則將變量Left的值加1,處理數組下一個元素,重復以上過程,直到Left>Right為止。Right的值即為不同的數的個數。 Option Explicit OptionBase 1 Private Sub Commandl_Click() Dim A() As Integer,N As Integer,I AS Integer Dim OP As Integer N=InputBox("請輸入數據個數", ,10) ReDim A(N) Randomize For I=1 To N A(I)=Int(Rnd*10)+1 Text1=Text1 & A(1) & " " Next I Call Statistic(A,OP) Text2="有" & oP & "個不同的數:" For I=1 To OP Text2=Text2 & A(I) & " " Next I End Sub Private Sub Statistic(A() As Integer,Right As Integer) Dim Left As Integer,K As Integer,I As Integer Right=( __________ ) Left=2 Do While Left<=Right K=( ___________ ) For I=K To 1 Step -1 If A(Left)=A(I) Then Exit For Next I If ( _______________ )Then Left=Left+1 . Else A(Left)=A(Right) ( ______________ ) End If End Sub 9.在計算機中用一個字節(8位),來存儲一個字符的Ascii碼,其中低7位二進制數對應字符的編碼,每個字節的最高位一般保持為” Option Explicit
Private Sub Command1_Click() Dim i As Integer,S As String Dim str As String,ch As String str=Text1.text For i=1 To Len(str) ( __________________ ) Call convert(ch,s) List1.AddItem ch & "==>" & S Next i End Sub Private Sub convert(ch As String,S As String) Dim m As Integer,k As Integer,n As Integer,iAs Integer s= ( _______________ ) n=Asc(ch) Do While n>0 ( ____________ )
S=m & S If m=1 Then k=k+1 End If n=n\2 For i=1 To 7-Len(s) '將字符的二進制代碼補足7位 S="0" & S Next i If k Mod 2=0 Then ( __________________ ) Else S="0" & S End If End Sub |
||||||