资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,*,页,第4章 Visual Basic程序设计,1,本章主要内容,分支结构程序设计,循环结构程序设计,过程,(8,10,学时,),2,4.1,分支结构程序设计,3,4.2.1,分支结构,1.,单分支结构,语句格式:,(1),IF,Then,ENDIF,(2),IF,Then,条件,语句块,F,T,执行过程,4,例,4-1,:已知两个数,x,和,y,,比较它们的大小,使得,x,大于,y,。,If xy Then,t=x:x=y :y=t,End If,或,If xy Then t=x:x=y :y=t,注意:将两个变量中的数进行交换,必须借助于第,三个变量才能实现。如果将上面的语句写成,:,If xy Then x=y:y=x,执行后结果会如何?,5,语句格式:,If,Then,Else,End If,条 件,语句块,1,语句块2,T,F,执行过程:,2.,双分支结构,6,例,4-2,:某地至北京的邮路里程为1043公里,通过邮局向北京邮寄“特快专递”,计费标准每克为0.05元,但超过100克后,超出数每克为0.02元。编写程序计算邮费。,w*0.05 w100,F=,7,Dim W!,F!,W=,InputBox,(“,请输入邮件重量,:”),If W=100 Then,F=0.05*w,Else,F=5+(w-100)*0.02,End If,Print“,邮件重量为:,”;W,“,邮费为:,”;F,8,3.,条件函数,IIf,函数可用来执行简单的条件判断操作,,它是“,IfThenElse”,结构的简写版本。,格式:,Result=,IIf,(,),功能:当,为真时,,IIf,函数返回“,True,部分”,,而当,为假时,,IIf,函数返回“,False,部分”。,说明:,Result,函数的返回值,,、,及结果变量的类型要一致。,例如,,dim,d%,x,%,d=,IIf(x,0,1,0),如果变量,x,的值大于,0,,变量,d,的值为,1,,否则为,0,。,9,又如,,dim str1,x%,y%,Print,IIf(x,y,“x,大于,y”,“y,大于或等于,x”),如果,xy,输出“,x,大于,y”,否则输出“,y,大于或等于,x”,再如,用,IIf,函数改写例,4.2,Dim W!,F!,W=InputBox(“,请输入邮件重量,:”),F=IIf(W=90 then,Print,优秀,ElseIf,x=80 Then,Print,良好,ElseIf,x=70 Then,Print ,中等,ElseIf,x=60 Then,Print,及格,Else,Print,不及格,End If,12,If X0 Then,Y=1,ElseIf,X=0 Then,Y=0,Else,Y=-1,End If,Y=,IIf(X,0,1,IIf(X=0,-1,0),B)Y=,IIf(X,=0,0,IIf(X0,1,-1),C)Y=,IIf(X,0,1,0),-1),D)Y=,IIf(X,0,IIf(X0,-1,0),1),例:在下列赋值命令中,与,If,语句等效的是:,13,语句格式,:,Select Case ,Case,Case,Case,Case Else,End Select,表达式列表2,表达式列表1,表达式列表,n,语句块,1,语句块,2,语句块,n,语句块,n+1,Y,N,N,N,Y,Y,执行过程,求表达式的值,2.Select Case,语句实现多分支,14,说明,:,各,Case,中的,要与,Select Case,中的,是同类型的下面四种形式之一:,例:,Select Case x,变量,x,是数值,的四种形式,表达式,A+5,变量,x,的值为表达式,A+5,的值,一组枚举表达式,(,用逗号分隔,),2,4,6,8,变量,x,的值分别为,2,4,6,8,3.,表达式,1 To,表达式,2,60 to 100,变量,x,的值为,60,100,Is,关系运算符表达式,Is 60,变量,x,的值小于,60,15,Select Case x,Case 90 to 100,Print,优秀,Case 80 to 89,Print,良好,Case 70 to 79,Print,中等,Case 60 to 69,Print,及格,Case Else,Print,不及格,End Select,用,Select Case,语句改写例,4-4,。,16,A),计算机成绩:不及格,B),计算机成绩:及格,C),计算机成绩:良,D),计算机成绩:优,Select Case x,Case is,=60,?计算机成绩:,&,及格,Case is,=70,?计算机成绩:,&,中,Case is,=80,?计算机成绩:,&,良,Case is,=90,?计算机成绩:,&,优,End select,例:选择与下面程序段相匹配的答案。,(,令计算机成绩,X=89),17,选择结构的嵌套:,在,IF,语句的,Then,分支和,Else,分支中可以完整地嵌套另一,IF,语句或,Select,Case,语句,同样,Select Case,语句每一个,Case,分支中都可嵌套另一,IF,语句或另一,Select,Case,语句。下面是两种正确的嵌套形式:,(,1,),IF,.,If,Else,.,End If,.,Else,.,IF,.,Else,.,End If,.,EndIF,(,2,),IF,.,Select Case,Case,IF,Else,.,EndIf,Case,.,End Select,.,EndIF,18,例,4-6:,从键盘上输入字母或,0,9,之间的数字,,,编写程,序对其进行分类。分类过程:首先判断是字母还是数,字,若是字母的话,要判断是大写字母还是小写字母。,若是数字的话,要判断是偶数还是奇数。判断的结果,输出相应信息。不是字母或数字,也应输出相应信息。,数据分类,19,程序如下:,Private Sub,Form_Click,(),Dim,msg,str1,msg1=,请输入一个字母或,0,9,数字,str1=InputBox(msg1,输入数据,),If Not IsNumeric(str1)Then,不是数字,If Len(str1)0 Then,Select Case Asc(str1),将字母转换成,ASCII,码值,Case 65 To 90,大写字母,msg2=,你输入的是大写字母,“,msg2=,msg2,&Chr(Asc(str1)&,。,Case 97 To 122,小写字母,msg2=,你输入的是小写字母,msg2=,msg2,&Chr(Asc(str1)&,。,Case Else,msg2=,你输入的不是一个字母或一个数字,End Select,End If,20,Else,Select Case Val(str1),转换成数值,Case 1,3,5,7,9,奇数,msg2=,你输入的数字,&str1&,是一个奇数。,Case 0,2,4,6,8,偶数,msg2=,你输入的数字,&str1&,是一个偶数。,Case Else,出界,msg2=,你输入的数超出范围。,End Select,End If,MsgBox,msg2,显示分类结果,End Sub,21,4.2,循环结构程序设计,22,4,.2.1,循环语句,1.FOR,循环结构,语句格式:,For =To ,Step,Exit For,Next ,循环体,23,循环变量超过终值?,循环变量+步长-循环变量,循环变量,-,初值,语句块,T,F,语句块,执行过程,结束循环,Exit For,24,说明:,(1),:,是数值变量,不能是布尔或数组元素。,(2),、,和,:,是数值表达式,,为正数时,表示递增循环;为负数时,表示递减循环;缺省值为,1,。,(3),:,在,For,语句和,Next,语句之间的语句序列,可以是一个或多个语句。,(4),:,此选项表示在满足特定条件时,强行退出循环;因此,该语句一定包含在条件语句之中。,(5),:,是循环终端语句,在其后的循环变量与,语句中的循环变量必须相同。只有一层循环时,循环变量可省略不写。,(6),循环执行次数:,n=,Int,(,终值,-,初值,)/,步长,)+1,(7)For_Next,语句可以嵌套使用,每层循环只有一个的变量作为循环变量;嵌套不能交叉。,25,例,4-7,:计算,S=1+2+3+4+.+100,的和,s=0,For i=1 to 100,s=s+i,Next i,?“s=”;s,例:计算,S=1!+2!+3!+10!,的和,s=0,For i=1 to 10,s=s+t,t,为,i!,值,Next i,?“s=”;s,t=1,t=t*i,例:,S=2,0,+2,1,+2,2,+2,63,(1m,3,1.42*10,8,颗),s=0,For i=to,s=s+,Next i,?“s=”;s,0,63,2i,26,格式一:,Do While|Until,Exit Do,Loop,循环条件,Exit Do,结束循环,F(While),T(Until),循环体,2.Do,循环结构,执行过程,While,:,当“条件”为真,时,,重复执行,”,循环体,”,Until,:,直到,“,条件”为真时,,结束,执行,”,循环体,”,T(While),F(Until),27,格式二:,Do,Exit Do,Loop While|Until,结束循环,循环体,执行过程,循环条件,Exit Do,F(While),T(Until),T(While),F(Until),28,例,4-8,:小红今年12岁,她父亲比她大30岁,编程计算出她父亲在几年后比她年龄大一倍,那时父女的年龄各为多少?,Private Sub Command1_Click(),dim age as integer,c as integer,age=12 :c=0,Do While(age+c)*2 age+30+c,c=c+1,Loop,Print“,经过”;,c;“,年,小红父女的年龄分别是:”,Print age+30+c;,和;,age+c,End Sub,格式,1:,29,Private Sub Command2_Click(),dim age as integer,c as integer,age=12 :c=0,Do,c=c+1,Loop Until(age+c)*2=age+30+c,Print“,经过”;,c;“,年,小红父女的年龄分别是:”,Print age+30+c;,和;,age+c,End Sub,格式,2:,30,4.2.2,循环嵌套,例,4-9,:用,ForNext,语句打印乘法九九表。,1*1=1,2*1=2 2*2=4,3*1=3 3*2=6 3*3=9,4*1=4 4*2=8 4*3=12 4*4=16,8*1=8 8*2=16 8*3=24 8*8=64,9*1=9 9*2=18 9*3=27 9*8=72 9*9=81,31,Sexp,=,a,&,“*”,&,b,&,“=”,&,a*b,P,rint,Tab(b-1)*8+1);Sexp;,For a=1 to 9,For b=1 to a,Next b,Print,Next a,For b=a to 9,1*1=1 1*2=2,1*3=3 1*9=9,2*2=4 2*3=6 2*9=18,3*3=9 ,3*9=27,8*8=64 8*9=72,9*9=81,32,33,例,4-10,:求3,200,以内的所有素数(只能被1和本身整除的数)。,For x=3 to 200 step 2,For y=2 to,sqr(x,),If x mod y=0 Then Exit For,Next y,If y,sqr(x,)Then Print x;,Next x,计算有多少个素数?并按每行,8,个数输出。,34,分析下面各题的执行结果:,a=0,For j=1 to 15,a=a+j mod 3 Next,?a,for x=1 to 2,a=0,for y=1 to x+1,a=a+1,Next y,?a;,Next x,k=5,for j=3 to 7,k=k+j,Next,?k+j,a=0,for i=1 to 3,for j=1 to i,for k=j to 3,a=a+1,Next k,Next j,Next i,?a,答案:15,答案:8,答案:2 3,答案:14,step-1,答案:38,35,x=1,For y=1 To 50,Print,x,y,If x=10 Then Exit For,If x mod 2=1 Then,x=x+5,Else,x=x-3,End If,Next y,(1),循环多少次?,(2),输出结果是什么?,For x=9 To 1 Step 1,If x mod 3=0 Then,x=x-1,Print,str(x,);,Endif,Next x,分析程序:,36,4.2.3,数组,数组并不是一种数据类型,而是,一组相同类型数据,的集合。用一个统一的名字,(数组名),代表逻辑上相关的一批数据,每个元素用,下标变量,来区分;下标变量代表元素在数组中的位置。,其表示形式:,A(1),,,A(10),X(1,1),X1(1,10),X(2,10),Y(0,0,0),Y(1,2,5),1.,数组概念,37,Visual Basic,中的数组,按不同的方式可分为以下几类:,按数组的大小(元素个数)是否可以改变来分为:定长数组、动态(可变长)数组。,按元素的数据类型可分为:数值型数组、字符串数组、日期型数组、变体数组等。,按数组的维数可分为:一维数组、二维数组、多维数组。,对象数组:菜单对象数组、控件数组。,38,Dim,:用在窗体模块或标准模块及过程中,定义窗体或标准模块级数组。,Redim,:,用来重新定义动态数组。用在过程中。,Static,:,用在过程中,说明该数组为静态数组。,Public,:,用在全局模块,(,标准模块,),中,说明该数组为全局的。,2.,声明数组,39,定义形式,语法,:,Dim,数组名(,下标下界,to,下标上界,)As,类型名称,如果不显式指定,下标下界,,则由,Option Base,语句控制。,Option Base 0,或,1,如果没有使用,Option Base,语句,则下界为,0,常量 或 表达式,用,Dim,定义数组时,数组元素初始化成,0,或“”等,40,1)Dim a(3)as integer,a(0)a(1)a(2)a(3),2)Option Base 1,Dim b(3)as integer,b(1)b(2)b(3),3)Dim c(1,3)as long,c(0,0)c(0,1)c(0,2)c(0,3),c(1,0)c(1,1)c(1,2)c(1,3),4)Dim e(-1 to 1,2)as double,e(-1,0)e(-1,1)e(-1,2),e(0,0)e(0,1)e(0,2),e(1,0)e(1,1)e(1,2),举例,:,41,3.,数组的基本操作,数组的基本操作包括输入、输出及复制,这些操作,都是对数组元素进行的。,1.,给数组元素赋初值,(1),利用,For,循环语句,Dim A(5)As Integer,For i=1 To 5,A(i)=0,数组的每个元素值为,0,Next,42,(2),利用,Array,函数,在,VB,中可以使用,Array,函数为数组元素赋值,即把一个数据集赋值给某个数组。,格式:,数组变量名,=Array(,数组元素值,),功能:,将数组元素值赋给数组各元素的值,各值之,间用逗号分隔。,说明:,数组变量名是预先定义的数组名,(,定义时没有指定维数和上下界,并且类型必须为变量体类型,Variant),,在数组变量名之后没有括号。,43,例,:,用,Array,函数给数组赋值。,Option Base 1,Dim A As Variant,B As Variant,A=Array(1,2,3,4,5,6),B=,Array(“abcd”,“efg”,“hijk,”),For i=1 To,UBound(A,),Print,Tab(i,*6);A(i);,Next i,Print,For i=1 To,UBound(B,),Print,Tab(i,*6);,B(i,);,Next i,运行结果:,1 2 3 4 5 6,abcd,efg,hijk0,44,2.,数组的输入,数组的输入可以用,For,循环语句及文本框控件输入,也可以通过,InputBox,函数输入。,(1),InputBox,函数给数组赋值,例:利用,InputBox,函数给数组赋值。,Option Base 1:Dim S(4)As String,Private Sub,Form_Click,(),For i=1 To 4,S(i,)=,InputBox(“Enter,Name:”),Print S(i);“”,;,Next,End Sub,通用,声明,45,(2),用赋值语句给数组赋值,例:利用随机函数,Rnd,产生,16,个随机整数分别给一维数组和二维数组赋值。,一位整数:,int(9*Rnd)+1,两位整数:,int(90*Rnd)+10,Dim a(16)As Integer,For i=1 To 16,a(i,)=Int(9*Rnd)+1,Next,Dim b(4,4)As Integer,For i=1 To 4,For j=1 to 4,b(i,j,)=Int(90*Rnd)+10,Next j,Next i,一维数组赋值操作用单循环,二维数组赋值操作用双重循环,46,3.,数组元素的输出,多维数组元素的输出和输入都可以通过多重循环来实现。由于,VB,中的数组是按行存储的,因此把控制数组第一维的循环变量放在最外层循环中。,For i=1 To 16,Print,a(i,);,Next,For i=1 To 4,For j=1 to 4,Print,b(i,j,);,Next j,Print,换行,Next i,一维数组输出操作用单循环,二维数组输出操作用双重循环,47,例,4-11,:编写程序,实现矩阵转置,即将一个,nm,的,矩阵的行和列互换。,数组转置,48,程序如下:,Option Base 1,在窗体的通用层中定义,Private Sub,Form_Click,(),单击窗体事件过程,Cls,n=,InputBox,(,输入矩阵行数:,输入数据,),m=,InputBox,(,输入矩阵列数:,输入数据,),ReDim,a(n,m),b(m,n)As Integer,定义两个动态数组,Randomize,For i=1 To n,For j=1 To m,a(i,j)=,Int(Rnd,*90)+10,利用随机函数给数组元素赋值,Next j,Next I,For i=1 To n,For j=1 To m,b(j,i)=,a(i,j),实现转置,Next j,Next i,Print,49,Print,矩阵,a(,转置前,):,For i=1 To n,For j=1 To m,Print Tab(5*j);,a(i,j);,输出,a,矩阵,Next j,Print,Next i,Print,Print,矩阵,b(,转置后,):,For i=1 To m,For j=1 To n,Print Tab(5*j);,b(i,j);,输出,b,矩阵,Next j,Print,Next i,End Sub,50,例,4-12,:某校组织了“计算机程序竞赛”,参加决赛的,10,名同学的成绩见表。编写程序,按成绩排出名次。,姓,名,成绩,姓,名,成绩,王一波,89,周亚玲,96,叶,琼,78,陈,远,93,张,伟,77,金,钊,84,张志峰,83,李,鑫,86,赵抗抗,90,潘,婷,95,竞赛成绩表,数据排序,51,这是一个排序问题,本程序采用的是“冒泡排序”法。“冒泡排序”法的基本思想:,(,将相邻两个数比较,,小的调到前头,),(,1,)假设有,n,个数(存放在数组,a(n,),中),第一趟将每相邻两个数比较,小的调到前头,经,n-1,次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小的数上升“浮起”;,(,2,)第二趟对余下的,n-1,个数(最大的数已“沉底”)按上法比较,经,n-2,次两两相邻比较后得次大的数;,(,3,)依次类推,,n,个数共进行,n-1,趟比较,在第,j,趟中要进行,n-j,次两两比较。,52,程序如下,:,Option Base 1,Private Sub,Form_Click,(),Cls,Dim m,x,m=Array(,王一波,叶琼,张伟,张志峰,赵抗抗,“,周亚玲,陈远,金钊,李鑫,潘婷,),x=Array(89,78,77,83,90,96,93,84,86,95),Print Tab(10);,计算机程序竞赛排名榜,输出表头,Print Tab(5);,名次,姓名,成绩,Print,53,For i=1 To 9,For j=i+1 To 10,If,x(i,),x(j,)Then,t=,x(i,):,x(i,)=,x(j,):,x(j,)=t,t=,m(i,):,m(i,)=,m(j,):,m(j,)=t,End If,Next j,Print Tab(5);i,m(i,),x(i,),输出前,9,名的成绩,Next i,Print Tab(5);10,m(10),x(10),输出第,10,名的成绩,End Sub,54,例,4-13,:,求斐波纳契数列前,40,个数以及它们的和。斐,波纳契数列是第,1,个数是,0,,第,2,个数是,1,,以后的数总,是前两个数的和。,斐波纳契数列,55,Private Sub,Form_Click,(),Dim i As Integer,a,b,c,sum As Long,a=0:b=1,Sum=1,Print a,b,For i=3 To 40,c=a+b,Sum=Sum+c,a=b,b=c,If i Mod 5=0 Then Print c Else Print c,Next,Print:Print Tab(30);Sum=;Sum,End Sub,解法,1,:,56,Option Base 1,Private Sub Command2_Click(),Dim i As Integer,a(40),sum As Long,Cls,Print,a(1)=0:a(2)=1,sum=1,Print a(1),a(2),For i=3 To 40,a(i)=a(i-1)+a(i-2),sum=sum+a(i),If i Mod 5=0 Then Print,a(i,)Else Print,a(i,),Next,Print:Print Tab(30);Sum=;sum,End Sub,解法,2,:,57,例4-14,:,利用随机函数,Rnd(),产生16个随机整数(两位)组成 44方阵;求出其中最大数、最小数且指出它们的位置(即行下标、列下标)。,Option Base 1,Dim a(4,4)As Integer,Randomize,for i=1 to 4,for j=1 to 4,a(i,j)=int(90*rnd()+10),Print a(i,j);,Next j:Print,Next i,58,max1=a(1,1):min1=a(1,1),max_i=1:max_j=1:min_i=1:min_j,=1,For i=1 to 4,For j=1 to 4,if max1a(i,j)Then,min1=a(i,j):min_i=i :min_j=j,End if,Next j,Next i,59,?“,第,”&max_i&“,行,第,”&max_j&“,列元素值最大:,”&max1,?“,第”,&min_i&“,行,第,”&min_j&“,列元素值最小:,”&min1,60,4.3,过程,61,过程-在程序设计中,往往将应用按功能或其他目的划分为若干个模块(每个模块还可继续细分为子模块)。这些(子)模块,都是可重复使用的、独立的。,优点:将复杂问题简单化,便于代码的调试与维护,提高代码的可读性和利用率,分类,内部函数(,Sub),:系统提供,子过程(,Sub),函数,过程(,Function),用户设计,62,4.3.1,过程的定义,自定义子过程的格式如下,:,Public|Private|Static,Sub(,参数表,),Exit Sub,End Sub,1.,子过程的定义,过程按照是否有返回值,可以分为子(程序)过程和函数,过程,所谓过程的定义就是设计过程。,63,(1),Public,:,表示,Sub,过程是“公用”过程,可在整个程序范围被调用,(,但需要指明该子程序所在的对象名,如果在窗体,Form1,中定义了一个程序,Sub1,,在窗体,From2,中调用它,应该用:,Call Form1.Sub1,。,(2),Private,:,表示,Sub,过程是“私用”过程,只能被本窗体中的其他过程访问,不能被其他模块的过程访问。,(3),Static,:表示该过程中的局部变量是静态变量,在过程被调用后其值仍然保留;如果省略“,Static”,,则局部变量就默认为“自动”的,即在每次调用过程时,局部变量被初始化为,0,或空字符串。,Static,对在过程之外的变量没有影响,即使这些变量在过程中使用。,说明:,64,(4),参数表:,是含在调用时传给该过程的简单变量名或数组名,各名字之间用逗号隔开。,“参数表”指明了调用时传送给过程的参数的类型和个数,每个参数的形式:,ByVal,(,变量名,(),As,类型,,),参数也称形参或哑元,在定义时没有值。,ByVal,表示该过程被调用时,参数是值传递,否则引用传递。定义子过程或子函数时,都可以无参数,但函数过程无参数时,函数过程名后的括号不能省略。这是函数过程与子过程的区别。,(5),过程名:,不能与同一级别的变量同名。在同一个模块中,同一个名称,不能既用作,Sub,过程名,又用作,Function,过程名。,(6),Exit Sub,:,表示退出子过程。,65,按照子过程的功能,,Visual Basic,的子过程可以,分为事件过程和通用过程。,(,1,)事件过程,事件过程是应用程序对事件发生后的响应,决定该事件发生后要执行的动作。例如:用鼠标单击命令按钮时,会自动执行,Command_Click,事件过程。,每个对象都有一组固定的事件,是,Visual Basic,内部定义的,用户不能自行添加事件。,66,(,2,)通用过程,创建(定义)通用过程的两种方法:,执行“工程”菜单 “添加模块,”“,新建”双击“模块,”,图标,打开模块代码窗口。,执行“工具”菜单 “添加过程,”,,打开“添加过程”对话框。,模块代码窗口,“添加过程”对话框,在窗体的代码窗口创建,67,在模块中创建,执行“工程”菜单 “添加模块,”“,新建”“模块,”,“打开”,则创建并打开一个新模块。,模块代码窗口,以上两种方法创建的模块均为标准模块文件,(.BAS),。,68,例:定义一个计算求,K!,阶乘的子过程。,Public Sub,jc,(,k%,t,&),For i=1 to k,t=t*i,Next i,End Sub,69,函数与过程相似,也是用来完成特定功能的独立程序代码,它与过程不同的是,,函数可以返回一个值给调用程序。,2.,函数过程的定义,自定义函数过程的格式如下:,Public|Private|Static,Function,函数名,()As,过程名,=,表达式,Exit Function,End Function,调用一个函数过程要返回一个值,因此通过将“表达式”的值赋给“过程名”实现。,70,例:定义一个计算求,K!,阶乘的,Function,过程。,Private Function,jc,(k%)as Long,jc,=1,For i=1 to k,jc,=,jc,*i,Next i,End Function,将“表达式”的值赋给“过程名”,71,4.3.2,过程的调用,(2),直接使用过程名调用,Sub,过程,而不必有,Call,。,格式:,过程名实参实参,说明:,不用括号把实参括起来。,(1),使用,Call,语句调用,Sub,过程。,格式:,Call,过程名,(,实参表列,),说明:,实参的个数、数据类型都要与被调用过程的参数一一对应。,72,m!,例,4-15,:求组合数:,C,m,n,=,n!(m-n)!,Private Sub Form_click(),Dim m%,n%,a&,b&,c&,m=,val(InputBox(“m,=?”),n=,val(InputBox(“n,=?”),Print“m=”;,m,“n,=”;n,a=1:b=1:c=1,Call,jc(m,a,):Call,jc(n,b,):Call,jc(m-n,c,),过程的调用,Print,m&,!,=&a,n&,!,=;b,m-n;,!,=;c,Print“,组合数,C=”;a/b/c,End sub,标准过程的调用,73,Private Sub Form_click(),Dim m%,n%,c&,m=,val(InputBox(“m,=?”),n=,val(InputBox(“n,=?”),Print“m=”;,m,“n,=”;n,c=,jc(m)/jc(n)/jc(m-n,),函数过程的调用,Print m&“!=&,jc(m,),n,jc(n,),m-n;“!=;,jc(m,-n),Print,组合数,C=;c,End sub,m!,例,4-16,:求组合数:,C,m,n,=,n!(m-n)!,函数过程的调用,74,在,Visual Basic,中,参数通过两种方式传送,即,传地址和传值,。,传地址方式习惯上称为引用,引用方式通过关键字,ByRef,(,通常省略,),来实现。变量的地址和被调用过程中相应参数的地址是相同的。这样,如果在过程中的操作修改了参数的值,则它同时也修改了传送给过程的变量的值。,而传值方式传送形参前有关键字,ByVal,,是一个真正的局部变量,系统把需要传送的变量复制到一个临时单元中,然后把该临时单元的地址传送给被调用的过程。这样在过程中修改变量的操作都是在此临时单元中进行的,所以不会改变原来变量的值。,4.3.3,过程之间参数的传递,75,例:用引用方式传送参数。,Sub mysub1(x As Integer,y As integer),x=x+100:y=y*6:Print“x=”;x,”y=”;y,End Sub,Sub Form_Click(),dim a As Integer,b As Integer,a=10:b=20,Mysub1,a,b,Print“a=”;a,”b=”;b,End Sub,运行结果:,x=110 y=120,a=110 b=120,76,例:用传值方式传送参数。,Sub MySub2(,ByVal,x As,Integer,ByVal,y As integer),x=x+100:y=y*6:Print“x=”;x,”y=”;y,End Sub,Sub Form_Click(),dim a As Integer,b As Integer,a=10:b=20,MySub2 a,b,MySub2 b,a,Print“a=”;a,”b=”;b,End Sub,运行结果:,x=110 y=120,x=120 y=60,a=10 b=20,77,4.3.4,过程的嵌套和递归调用,1.,过程的嵌套调用,Visual Basic,的过程定义都是互相平行和相对独立的。也就是说,在定义过程时,一个过程内不能包含另一个过程。,Visual Basic,虽然不能嵌套定义过程,但可以嵌套调用过程,也就是主程序可以调用子过程,在子过程中还可以调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程。,78,Sub Main(),Call Sub1,End Sub,Sub Sub1(),Call Sub2,End Sub,Sub Sub2(),End Sub,过程的嵌套调用执行过程,79,例,4-18:,过程嵌套调用示例。,Sub mysub1(x As Integer,y As Integer),x=x+5:y=y*3,Print,过程,1,传址调用,;,Print Tab(20);x=;x,y=;y,mysub2 y+x,y-x,End Sub,Sub mysub2(ByVal x As Integer,ByVal,y As Integer),x=x+5:y=y*3,Print,过程,2,传值调用,;,Print Tab(20);x=;x,y=;y,End Sub,80,Private Sub,Form_Click,(),Dim a As Integer,b As Integer,a=10:b=20,Print,调用前,;Tab(20);a=;a,b=;b,mysub1 a,b,Print,返回后,;Tab(20);a=;a,b=;b,End Sub,过程的嵌套调用,81,2.,过程的递归调用,Visual Basic,允许一个过程或函数在自身定义的内部,调用自己,这样的子过程或函数称为递归子过程或,递归函数。在许多问题中具有递归的特性,用递归,调用描述它们就非常方便。,例,4-19:,求,fac(n)=n!,的函数。,根据求,n!,的定义,n!=n*(n-1)!,,写成如下形式:,1 n=1,Fac(n)=,n*fac(n-1)n1,82,可编写出计算,fac(n),的函数:,Public Function,fac(n,As Integer)As Long,If n=1 Then,fac,=1,Else,fac,=n*,fac(n,-1),End If,End Function,Private Sub,Form_Click,(),Dim n As Integer,n=,Val(InputBox,(,输入,n,的值,:,4),Print,fac,(;n;)=;,fac(n,),End Sub,83,Fac(4)=4*fac(3),Fac(3)=3*fac(2),Fac(2)=2*1,Fac(2)=2*fac(1),Fac(1)=1,Fac(3)=3*2,Fac(4)=4*6,fac(4),的执行过程,84,Visual Basic,应用程序,(.,Vbp,),至少一个或若,干个窗体模块,(.,Frm,),文件,可有一个或若,干个标准模块,(.Bas),文件,可有一个或若,干个类模块,(.,Cls,),文件,事件过程,(Sub),自定义过程,(Sub),自定义函数过程,(Function),自定义过程,(Sub),自定义函数过程,(Function),自定义属性过程,(Property),自定义方法过程,(Sub,或,Function),自定义事件过程,(Event),4.3.5,变量、过程的作用域,85,(1).,局部变量,在过程内部定义的变量是局部变量,其有效范围仅限于定,义它的过程内。,(2).,模块(窗体)级变量,是指在一个模块(包括通用模块和窗体模块)内有效的变,量,模块级变量相当于该模块内所有过程的公共变量。,(3).,全局变量,全局变量是整个应用程序(工程)所有过程的公共变量。,1,变量的作用域,86,例,4-20:,全局变量和局部变量示例。,Public x As Integer,定义全局变量,x,Private Sub,Form_Load,(),x=10,将全局变量,x,的值设置
展开阅读全文