a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 189|回复: 3

[Visual Basic] 2011年度计算机等级考试二级VB复习指导(16)

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
 3.8.1 子过程  VB程序是由多个过程构成的,这些过程可分为两大类;其中一类是系统提供的事件过程,例如窗体或按钮的Click事件过程等。事件过程是构成VB应用程序的主体,由事件触发执行,例如单击按钮,则按钮的Click事件过程就会执行。在前面的一些实例中用到的都是事件过程。# W( H0 x3 |* R
  另一类过程是通用过程,由用户根据需要自行定义,以供事件过程调用。在程序中,有些处理需要经常重复进行,这些处理的代码是相同的,只不过每次都以不同的参数调用。例如,要计算整数1~n的累加结果,n的人小可以由用户决定,因此它是不确定的。这样就可以定义一个以n为参数的过程,为了得到不同n时的累加结果,以不同的参数n调用该过程就可以了。使用过程的好好就在于使得程序简练,同时也便于程序的设计与维护。% `" C0 r; W' e  w0 H! W
  通用过程又一可以分为Sub子过程(简称子过程)和Function函数过程(.简称函数过程).3 T. z3 A; I3 V% M
  子过程用来完成特定的任务,其定义有两种方法。
" X; T: P7 m+ N( [& ?3 Z9 r  1.直接在【代码】窗口中输入。2 R, t0 v9 d. w. ~* ]9 h9 |1 }
  打开窗体或标准模块的【代码】窗口,将插入点定位在所有现有过程的外面,然后输入子过程即可。
5 f0 q: z* @2 d; g5 D+ ~$ G. z  子过程的形式如下:$ D$ @( K1 o5 I& L5 h1 j
  [Private][Public][Static]Sub[(参数表)]
9 ?% w3 M0 ], }9 Y) Y' u; g! p  
/ a2 J' _. W$ L4 G9 H, A* \& p1 I  [Exit Sub]
- G8 e+ U8 F0 S1 ?: j5 S, Q4 [3 d. ~  & L0 p7 e& w1 W" Y$ @
  End Sub, Y/ k3 e8 U' f, _4 y4 @3 A8 ]5 ?/ l( b
  具体说明如下:
- k/ S+ }8 B' z# r: K" r5 i  Sub是子过程的开始标记,End Sub是子过程的结束标记,是具有特定功能的程序段,Exit Sub语句表示退出子过程。
! S8 m* I$ Q1 [5 [1 L7 W+ E  如果在子过程的前面加上Private,则表示它是私有过程,其作用范围局限于本模块。如果在子过程的前面加上Public,则表示它是公用过程,可在整个应用程序范围内调用。可见,子过程的作用域与变量的作用域类似。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:13 | 显示全部楼层

2011年度计算机等级考试二级VB复习指导(16)

表3.11中详细列出了子过程的作用范围及调用规则。
1 f( A9 {. E1 B2 o* l   8 P) ^  V4 J$ y) e4 e$ R% `5 u
  如果在子过程名的前面加上Static,则表示该过程中的所有局部变量都是静态变量。5 Q# Y, P7 n2 ]9 W5 s( g
  参数是调用子过程时给它传送的信息子。过程可以有参数,也可以不带参数,没有参数的过程称为无参过程。如果带有多个参数,则各参数之间使用逗号隔开。子过程中的参数表形式为:3 R7 _0 u" T  @+ R  y7 A
  [ByVal][As][.[ByVal][Asl,…].
( K5 I7 a9 A, c: }' k4 m  参数可以是变量,也可以是数组。当参数是数组时,参数声明时应省略其维数,但括一号不能省。这里的参数称为形参,在定义时它没有位。在参数名前有Byval关键字表示当该过程被调用时,参数的传递方式是传值,否则是传址。关于参数以及参数的传递在后面还会详细介绍。
5 H" ]3 \+ V* X. N7 {* j  2.使用【添加过程】对话框
2 G; U: t7 K: V  为了省去输入子过程框架的麻烦,也可以通过【添加过程】对话框在【代码】窗口中自动添加,步骤如下:* L: M$ d% X( E( U8 d# X# _/ K
  (1)打开想要添加子过程的【代码】窗口。
% ^. M- u; y: v9 U  (2)执行【工具】菜单中的[添加过程】命令,打开【添加过程】对话框,如图3.22所示。
0 e. Y6 f+ l' L" o  (3)在【名称】文本框中输入子过程名,在【类型】组中选中【子程序】单选按钮,在【范围】组中选择子过程的作用范围。如果选中【所有本地变量为静态变量】复选框,在子过程名前将加上Static关键字。. [4 |: ~9 n% _0 C( k+ J' W
  (4)设置完毕后,单击【确定】按钮,则代码窗口中就出现了相应的子过程的框架,如图3.23所示。其中在【添加过程】对话框中输入的名称是Abc选择的范围是"公有的"。
9 J0 C4 O' e2 y% Y8 k* Q  O: g" J2 U: V) E3 V' y9 _8 z6 A
  
, N; @: L; L7 C" q, Z" i  提示:使用【添加过程】对话框添加的子过程总是无参过程,用户可自行为子过程添加参数和编写过程体。! x1 C* M: ^' f+ S2 {
  在定义了子过程后,就可以在事件过程或其他过程中调用了。调用子过程有两种方法:
8 J: U+ a( p$ g4 _$ d- Y  L) r  r6 b3 ]3 _/ `  使用Call语句:Call(参数表)( n2 ]6 Q7 f, ^$ C  l8 p
  直接使用过程名:[]
) O' I  z9 r- r" V0 ]  注意:当使用Call关键字时,参数表必须放在括号内,若省略Call关键字,也必须同时省略括号。! M1 |9 x% A2 b9 }
  函数过程与子过程一样,也是用来完成特定功能的独立程序代码。与子过程不同是,函数过程可以返回一个值给调用程序。
. q. ~! v% F; W- q6 Z/ k! g# ~  函数过程的形式如下:. X- y0 M7 a* H& m
  [Private][Public][Static]Function[(参数表)][As类型]
0 ^7 h9 U# L. C/ s3 f- ^2 ~1 T0 s! `# {  
6 W: d  Y& `' |( d* t  [Exit Function]
* n; y5 z1 L/ {; u  
; Y1 B+ O5 i% |2 g  End Function
- L3 P& h& V5 J% N, m) d  可见,函数过程的形式与子过程的形式类似。Function是函数过程的开始标记,End Function是函数过程的结束标记,是具有特定功能的程序段,ExitFunction语句表示退出函数过程。As子句决定函数过程返回值的类型,如果忽略As子句,则函数过程的类型为变体型。其他各部分的功能同子过程中相应部分的含义完全相同。
0 W+ z2 D  R  b# q  由于函数过程要返回一个值,因此,在过程内部应该至少有一条为〔函数名就像一个变量)赋值的语句。. g2 l/ ~9 F9 l8 f! c8 s
  同样,也可以使用【添加过程】对话框在【代码】窗口中添加函数过程的框架,只要在【类型】组中选择【函数】单选按钮即一可。
# b! B6 {0 u2 b  函数过程是用户自定义的函数,它的调用与使用VB的内部函数没有区别口最简单的情况是将函数的返回值赋给一个变量,其形式为:
/ N4 t/ f# L) E2 _( F$ l3 n1 M, n6 n: E  变量名=函数名(参数表)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:14 | 显示全部楼层

2011年度计算机等级考试二级VB复习指导(16)

实例3.6使用函数过程  编写一个函数,用来计算整数1 ~n的累加结果,n的大小在调用函数时指定。为此,编写一个以n为参数的函数过程,代码如下:
& m8 h. C  M' m$ g) v  Private Function Sum(n As Integer) As Ineger9 p& y3 S' F+ G2 u
  Dim s As Integer
0 D4 M2 l) k. J6 |2 B3 `  S-07 _" O8 d7 H0 {* r& h- O  r
  For j=1 To n
% b) A4 H4 o* |0 B/ D  s=s+i
3 i+ G; G* p6 r) u  Next( B1 P3 A0 \$ x" R' G# m) F
  Sum=s
; U! n) J, i3 H8 z$ L; X0 E  End Function
0 T- Q  X$ r! `- J& O; ?- q# G  在窗体的Click事件过程中调用自定义的函数,代码如下:
4 b% B: E' w7 E' c( q  Private Sub Prom_Click()  H5 `' D+ k' L8 ?4 s# U2 n
  Dim r As Integer
& E, _* }8 v% B4 D5 v' n  r=Sum(100)
) C, E0 c# A+ X' d! N  Print F
) W+ v1 m2 H" L& ?7 G( `  Ebs Sub
. W( X! H) \' G% c4 r  在调用自定义过程时,调用者是通过参数向过程传递信息的。通常,把自定义过程中的变量称为形参;把调用这个过程时使用的参数称为实数。在VB中,参数的传递方式有两种:传址和传值,其中传址也被称为引用,是VS默认的参数传递方式。如果在定义过程时,在形参前加上关键字ByVal则参数传递方式变为传值。
" e+ f# _2 |+ J! C5 e6 a  传址是指在调用过程时,将实参的地址传递给形参。因此,在被调用的过程体中对形参的任何操作都变成了对实参的操作。例如,当形参的值变为原来的2倍时,则实参的值也变为原来的两倍。& E& z# \  u3 I6 F
  传值是指在调用过程时,将实参的值赋给形参,而实参本身与形参没有联系。因此,在被调用过程体中对形参的任何操作都不会影响到实参。
, j$ S# ~  v, S/ J4 U" M  实例3.7传址和传值8 e( q2 r4 s! k
  编写一个用于交换两个数的子过程Swl,该过程采用传址方式传递参数,过程代码如下:
& T& d' t6 @) }- ?7 }  ~. L  private Sub Swl (a As Single,b As Single)0 V$ R9 u( ^, \: b: Q5 B
  Dim s As Single
% I2 Q* Q0 l6 f$ G  s=b
* H. r) Y4 j# M* `, @0 d  b=a
, w3 D1 ^& a; |8 S+ x9 Z  a=s  l, {3 }) y0 X7 J% `- E+ {- y$ F% q
  End Sub" u3 C1 G6 t6 p6 r& x; t
  再编写一个过程体与Swl完全相同的子过程Sw2,不同的是Sw2采用的是传值方式传递参数,过程代码如下:
7 t+ x4 }+ U" U- G- m; P  Private Sub Sw2 (Byval a As Single,Byval b As sinlgle)8 E7 P' S0 Q. g0 I
  Dim s As Single
" k" k3 ?3 b4 E2 D! H  s=b- ~: n" z% \- ~3 h2 b$ z1 k
  b=a
/ J; B4 }% ?8 @* w2 b+ ~4 Z+ {( s  a=s
  x1 L) [4 j+ m# G- s0 o, d  End Sub
& u) a; }& O: T' `8 i+ J/ e6 `  编写窗体的Click事件过程,在该过程中使用相同的参数分别调用子过程Swl和Sw2,代码如下:
9 c* A6 h0 W# H( H& C  Private Subb Form_click()9 R4 u+ s1 R  c
  Dim x As single' Q# A4 @  E/ n8 n) M) y  N' S6 S
  Dim y AS Single" T0 [. |! O  {) E; k
  x=10- F. X4 s8 |. x. T. \0 Q( j) J
  y=20
6 L0 I) i0 g' p( \9 _# p  Print “x=“& x$ \) F0 r+ o  v: p' w4 k
  Print “y=“& y- }$ q) _* D) L3 n& G% d
  swl x,y 调用子过程swl, r% ?* w. f; v% J2 E' i0 U$ Y% s
  Print "使用子句swl交换两个数后:) s8 T- ]1 X7 i; S* A( w0 f, B0 H2 `
  Print “x=“& x- |* G( u8 E% c! I) L, |! c$ C
  Print “y=“& y( s( i9 E% O9 i8 l: F( L
  x=10 重新给x,y赋值
6 l& p4 h, N0 j- `. ^+ G4 e  y=20
6 Q. V2 d5 j" J, y% T  sw2x,y 调用子过程sw29 O) k7 ]) B8 X0 @
  Print “使用子过程sw2交换两个数后:”$ V9 r" K: I& O( Q& D$ q
  Print“x=”& x
( l0 ^) l" u2 X- B( |  Print“y=”& y2 E/ `/ h/ f9 u/ C$ s
  End Sub" e# f  P) }/ n# z( v, U
  运行该程序,单击窗体,结果如图3.24所示。从打印出的结果可以看出,调用子程序Swl达到了交换两个数的目的,而调用子程序Sw2后,两个数却没有发生任何变化。这就是因为子程序Sw2采用的是传值的方式,实参x和Y仅仅是将它们的值分别赋给了形参a和b,而x/y本身与a/b没有任何联系,因此,在过程体中对形参a和b的操作不会影响到x和y。$ V4 W5 C* S/ G' R3 z5 L- d$ Z$ k' k
1 G6 v* F9 Z% Z- H8 Y9 B

  ^: D0 X3 `+ P2 c/ p  在前面的实例中,我们可以看到自定义过程的形参个数总是固定的,并且在调用它时,必须提供与形参相对应的实参,即实参的个数与类型要与形参的完全相同。
* ]5 N* P$ w8 @+ ]  在VB中,也可以定义具有可选参数的过程,所谓"可选参数"是指过程中的一类特殊形参,在调用过程时,可以为它们提供实参也可以不提供实参。如果不提供实参,则可选参数使用它的默认值。8 u) Z; U4 O7 ^3 O/ x" r
  将某个形参定义为可选参数的方法是在它的名称前加上关键字Optional,在定义的同时也可指定它的默认值。需要注意的是,可选参数一定要位于子过程或函数过程的末尾。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:15 | 显示全部楼层

2011年度计算机等级考试二级VB复习指导(16)

  实例3.8使用可选参数% K  J2 z  w' \3 Q
  编写一个用于计算两个实数的和以及平均值的子过程,该子过程具有一个可选参数,在调用子过程时,如果不提供与可选参数对应的实参,或实参的值为0,则在窗体上只打印两个数的和;如果提供了一个不为0实参,则在窗体上还将打印出两个数的平均值。& z8 C3 W4 J3 |8 M6 j
  具有可选参数的子过程的代码如下:; G% |# j& R4 C+ k! A0 \6 j: o
  Private Sub(x As Single,y As Single,Optional n As Boolean=0)6 A5 p. ]' ]$ a
  Dim s As Single,A As Single
: ~2 A7 |' V. o  s=x=y6 X* I* V) x) c9 ~
  A=S/2
5 X  a, {( h* A  If n=False Then
3 \& x4 Z. x; `# Q9 O+ k3 D  Print“总和为:”& S9 Z8 {( X, d! g3 b! r# S
  Else
0 i7 A) h4 x# Q8 `9 d9 t, l" a  Print“总和为:”& S
7 ]4 V3 [4 \' R8 H  Print“平均值为:”& A
% w# \, {3 p6 \2 P- s* Y/ q; U" }  End If. p& s4 t, ]* M0 Z
  End Sub
: K2 ^8 Y# s! d% d! V4 K8 W- B  在窗体的Click事件过程中调用子过程Sum.代码如下:6 r0 ~7 R  _: ]+ e( P# k
  Private Sub Form_Click()
- P) e( W5 w0 {4 n- O  d  Print “不提供与可选参数对应的实参”
3 L1 T8 p6 D7 G9 q) f1 E- \" G( `  Sun 6,9( A/ x9 Y8 ?, V& `) H
  Print “提供与可选参数对应的实参,并且实参为0:”
, k/ h" H- o3 h7 ^" q  Sun 6,9,0
; i* o+ [# c1 N1 [- h+ H' F- M  Print 空行% e$ E' N4 c4 ]" [8 h
  Print “提供与可选参数对应的实参,并且实参不为0:”
& J  V( ~2 F. I. Z! C% g  Sun 6,9,1
" X+ q$ r+ ]; Z& W# d  `  End Sub: T/ X5 A! ~* y7 T
  运行程序,单击窗体,结果如图3.25所示。
5 z6 h! U* r9 p9 b9 y) H6 w0 z' {$ J3 w$ P: i; |
   7 ^$ |7 r7 U9 N$ \
  递归是推理和问题求解的一种强有力方法,原因在于许多对象,特别是数学研究对象具有递归的结构。简单地说,如果通过一个对象自身的结构来描述或部分描述该对象就称为递归。最简单而易于理解的一个例子是阶乘的递归定义。如果以函数f(n〕表示自然数n的阶乘的道,则有定义:0 G# @8 W+ x* ?
  递归定义使我们能够用有限的语句描述一个无穷的集合。本例描述一个无穷的集合只用了两个语句。* D2 C* o7 P* W  X) n$ B/ ]  ]
  VB程序设计语言允许一个过程体有调用自身的语句,称为递归调用。也允许调用另一过程,而该过程又反过来调用本过程,称为间接递归调用。这种功能为求解具有递归结构的问题提供了强有力手段,使程序语言的描述与问题的自然描述完全一致,因而使程序易于理解,易于保证和维护。例如,对于上面的n阶乘的递归定义,可以写出相应的VB函数过程,如下面的实例3.9.这个过程的推理(计算)路线与原来函数的(递归)数学定义完全一致。: o. U2 O8 _  L/ ?
  实例3.9求n阶乘的VB函数过程
/ [9 C& P  S9 ~2 m( z9 \# z  Private Function F(byval n As Integer) As Integer, I5 c7 U1 N1 D. Q9 ~
  If n=1 Then7 w. y7 f4 c1 d) n% H. h9 {  O# z
  F=1
) ~, p* }, v' B" n  Else- M& Y; e  C! R! @: f7 E7 Z
  F=n*F(n-1)+ g* p' l9 p7 [# I5 G) D- x# V  J" O
  End If
! q' |6 S" R) o6 j$ A$ S! P( q, X  End Function
" q2 ^! j8 P4 B. U% u, x  让我们来跟踪这个程序的计算过程,令n=4调用这个函数,用下面的形式来表示递归求解的过程:2 \. f9 l( x" H, Y; h
  (1)F(4)=4*F(3) n=4调用函数过程F(3)% ~# H% `! u: r3 O# P9 ^2 U& D
  (2)F(3)=3*F(2) n=3调用函数过程F(2)
( k/ v* V- e( z# w  (3)F(2)=2*F(1) n=2调用函数过程F(1)) w1 |6 X- U* L- V
  (4)F(1)=1 n=1求的F(1)的值
2 O" o! o" j5 m9 e9 G+ m, j- t  (5)F(2)=2*1=2 回归,n=2,求得F(2)的值4 W% B( F1 M7 `# g4 n
  (6)F(3)=3*2=6 回归,n=3,求的F(3)的值- P! z, D' R5 Y4 W) |6 G  O" f! N
  (7)F(4)=4*6=24 回归,n=3,求得F(4)的值% \. w9 {, x. z6 @
  上面第1步到第4步求出F(1)=1的步骤称为递推,从第4步到第7步求出F(4)=4*6的步骤称为回归。
! M; T" V: v+ U& f$ b  @% P  从这个例子可以看出,递归求解有两个条件:  s' ?, |" U8 g& _2 J
  给出递归终止的条件和相应的状态。5 Q' I) k. H! |0 y2 \+ k2 [  i
  在本例中递归终止的条件是n=1,状态是F(1)=1.! l( R. U' P, x
  2.给出递归的表述形式,并且这种表述要向着终止条件变化,在有限步内达到终止条件。& N* U4 n9 Z2 T' D
  在本例中,当n>l时,给出递归的表述形式为F(n)=n*F(n-1).函数值F(n)用函数值F(n-1)来表示。参数的值向减少的方向变化,在第n步出现终止条件n=1。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 09:50 , Processed in 0.343351 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表