Next
‘交换a(min)和a(i)
T=a(min)
A(min)=a(i)
A(i)=t
Next
四、二维数组操作dima(1to4,1to4)
1、二维数组元素赋值
Fori=1to4
Forj=1to4
A(i,j)=….
Nextj
Nexti
2、二维数组元素输出
Fori=1to4
Forj=1to4
Printa(I,j)
Next内重循环完成则输出完成第i行数据
Print
Nexti
五、array函数的使用
1、定义变体型变量
2、变量名=array(值1,值2,值3,。
。
。
。
)
六、for…each结构
foreach变量名in数组名
循环体
Next
Eg.foreachxina
X=x+2
Next
七、静态数组和动态数组
1、静态数组:
数组元素个数不会变
Dim数组名(常量)常量:
具体数值和符号常量
Eg.dima(4)
Eg.consta=4a是一个常量,值为4
Dimarr(a)
2、动态数组:
数组元素个数可以变化
(1)在通用部分定义一个只有数组名和类型的数组,不给出数组元素个数
(2)重定义数组时,使用redim语句,给出元素个数,不给类型,数组名不变
Dima()as类型
。
。
。
Redima(5)
八。
控件数组
1、控件数组:
一组具有相同名称、属性、相应同一个的控件。
2、index属性:
从0开始
3、创建控件数组的方法:
复制——粘贴
D6:
8月27日
第八章过程(所占试卷比例10%,理论课时:
6节,上机课时:
4节
一、VB中过程分类:
系统定义和用户自定义过程
1、系统定义过程:
事件过程,例如command1_click()、form_load()
2、用户自定义过程:
sub过程(子过程)、function过程(函数过程)
6.1Sub过程
6.1Sub过程
知识点1建立Sub过程
通用Sub过程的结构与前面多次见过的事件过程的结构类似。
一般格式如下:
[Static]|[Private]|[Public]Sub过程名[(参数列表)]
语句块
[ExitSub]
[语句块]
EndSub
说明:
(1)Sub过程以Sub开头,以EndSub结束,在Sub和EndSub之间是描述过程操作的语句块,称为“过程体”或“子程序体”。
(2)EndSub标志着Sub过程的结束。
(3)Sub过程不能嵌套。
过程不能嵌套定义。
(5)参数列表形式——形参(定义过程时)
●参数1as类型,参数2as类型,参数3as类型
●Byref参数1as类型,byref参数2as类型,…
第一种和第二种等价,参数传递为双向传递(参数传递方式为传址),调用时实参传递给形参;调用完后,形参反传给实参
●Byval参数1as类型,byval参数2as类型,
第三种参数传递方式为传值,单向传递(调用时,把实参传递给形参)
例1.定义一个子过程输出两个数的和
Subsum(aasinterger,basinterger)
‘输出a和b的和
Form1.printa+b
Endsub
调用sub过程:
callsum(2,3)
Sum2,4
例2.定义一个子过程输出正方形的周长和面积(边长已知)
Subarea(aasinterger)a是边长
‘输出正方形的周长和面积
Form1.print“周长=”;4*a
Form1.print“面积=”;a*a
Endsub
调用sub过程:
callarea(5)callarea(val(text1.text))
Area5areaval(text1.text)
在窗体单击命令按钮
触发form_click(),执行form_click()中的过程代码
Callarea子过程的调用
转到subarea
参数传递(实参传递给形参,val(text1.text)传递给a)
执行subarea过程体
回到调用处
例3.定义一个子过程输出已知2个数中的最大值
Submax(xasinterger,yasinterger)
‘输出已知两个数的最大值
Ifx>ythenmax=xelsemax=y
Printmax
Endsub
调用sub过程:
callmax(val(text1.text),val(text2.text))
Maxval(text1.text),val(text2.text)
知识点2调用Sub过程
1、Call语句:
Call过程名(实参1,实参2,实参3.。
。
。
)
2、把过程名作为一个语句来使用。
过程名实参1,实参2,
(1)去掉关键字Call。
(2)去掉“实际参数”的括号。
3、调用过程
调用过程语句(起点)——》子过程定义处——》参数传递(实参传给形参)——》子过程过程体——》回到调用处(起点)
知识点3通用过程与事件过程
控件事件过程的一般格式为:
[Private|Public]Sub控件名_事件名(参数表)
语句组
EndSub
窗体事件过程的一般格式为:
[Private][Public]SubForm_事件名(参数表)
语句组
EndSub
通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中,不同模块中的过程(包括事件过程和通用过程)可以互相调用。
6.2建Function过程函数过程
知识点4
一、建立Function过程
Function过程定义的格式如下:
[Static][Private][Public]Function过程名[(参数表列)][As类型]
[语句块]
[过程名=表达式]
[ExitFunction]
[语句块]
EndFunction
说明:
Function过程名(参数表列)
过程体
过程名=,,,,,,返回值存储在以过程名同名的变量中
Endfunction
(1)Function过程以Function开头,以EndFunction结束,在两者之间是描述过程操作的语句块。
(2)function有返回值,返回值存储在与函数名同名的变量中;sub过程没有返回值
Eg.编写function函数,返回2个已知数的和
Functionsum(aasinteger,basinteger)传址,双向
Sum=a+b变量sum与函数同名,存储返回值
Endfunction
Eg.编写function,已知圆的半径(存储在文本框text1中),返回圆的面积。
单击窗体时,在窗体上输出面积。
Constpi=3.14
Functions(byvayrasinteger)传值,单向
Area=PI*r*r
S=area
Endfunction
Privatesubform_click()
Dimyy表示面积
Y=s(val(text1.text))
Form1.printyform1.prints(val(text1.text))
Endsub
Eg.编写function函数,求1+2+3+。
。
。
+20的和
Functiony()
Sum=0
Fori=1to20
Sum=sum+i
Next
Y=sum
Endfunction
Eg.编写function函数,返回已知数n的阶乘(n的值由实参传递)
Functionx(nasinteger)
S=1
Fori=1ton
S=s*i
Next
X=s
Endfunction
单击窗体后,在窗体上输出10的阶乘
Privatesubform_click()
Y=x(10)
Form1.printy
Endsub
二、function过程调用
同普通函数一样:
变量=过程名(实参1,实参2,实参3.。
。
。
)
Eg.length=len(string1)y=abs(x)
补充:
●过程的作用范围(使用关键字是什么、在哪里定义、在哪里可以使用)
1、模块级过程:
private,从定义处开始到对应的模块结束。
2、全局级过程:
public或不添加整个应用程序
●变量作用域(使用关键字是什么、在哪里定义、在哪里可以使用)
1、局部变量(过程级变量):
dim或者static;在过程中定义;只在定义的过程内有效
2、窗体模块级变量:
dim或private;窗体通用部分定义;窗体模块有效
3、全局变量:
public整个工程
●过程使用参数总结
1、参数传递方式:
(1)传址,双向传递
Byref参数as类型或者参数as类型
(2)传值,单向(实参传递给形参)
Byval参数as类型
2、过程可使用参数类型
(1)变量
(2)数组
参数传递方式:
传址
格式:
不论形参还是实参都应该用数组名()的形式给出。
不用给长度
Eg.定义一个过程,输出一维数组
Suboutput(a()asinteger,nasinteger)形参是数组,不用给长度
Fori=1ton
Printa(i)
Next
Endsub
数组做参数,调用过程:
dimb(10)
Calloutput(b(),10)
Dimc(5)
Calloutput(c(),5)
数组做参数如何传递:
对应元素传递给对应元素
(3)对象做过程参数:
VB运行对象做过程参数,窗体和控件可以作为过程参数
3、可选参数(可有可无)
Optional参数名as类型
Eg.Subf(xasinteger,yasinteger,optionalcasinteger)
Callf(1,2,3)
Callf(4,5)
1、模块级过程
【经典题解】
1.下面函数的功能应该是:
删除字符串str中所有与变量ch相同的字符,并返回删除后的结果。
例如:
若str="ABCDABCD",ch="B",则函数的返回值为:
"ACDACD"
Functiondelchar(strAsString,chAsString)AsString
DimkAsInteger,tempAsString,retAsString
ret=""
Fork=1ToLen(str)
temp=Mid(str,k,1)
Iftemp=chThen
ret=ret&temp
EndIf
Nextk
delchar=ret
EndFunction
但实际上函数有错误,需要修改,下面的修改方案中正确的是。
A)把ret=ret&temp改为ret=temp
B)把Iftemp=chThen改为Iftemp<>chThen
C)把delchar=ret改为delchar=temp
D)把ret=""改为temp=""
知识点5调用Function过程
【经典题解】
1.下面是求最大公约数的函数的首部
Functiongcd(ByValxAsInteger,ByValyAsInteger)AsInteger
若要输出8、12、16这3个数的最大公约数,下面正确的语句是。
A)Printgcd(8,12),gcd(12,16),gcd(16,8)
B)Printgcd(8,12,16)
C)Printgcd(8),gcd(12),gcd(16)
D)Printgcd(8,gcd(12,16))
2.设有以下函数过程
Functionfun(aAsInteger,bAsInteger)
DimcAsInteger
Ifa c=a:
a=b:
b=c
EndIf
c=0
Do
c=c+a
LoopUntilcModb=0
fun=c
EndFunction
若调用函数fun时的实际参数都是自然数,则函数返回的是。
A)a、b的最大公约数
B)a、b的最小公倍数
C)a除以b的余数
D)a除以b的商的整数部分。
6.3参数传送
在VisualBasic中,通常把形式参数叫做“参数”,而把实际参数叫做“自变量”。
知识点6形参与实参
知识点7引用
【经典题解】
1.窗体上有一个名称为Text1的文本框和一个名称为Commandl、标题为“计算”的命令按钮,如图所示。
函数fun及命令按钮的单击事件过程如下,请填空。
PrivateSubCommand1_Click()
DimxAsInteger
x=Val(InputBOX("输入数据"))x=2
Text1=Str(fun(x)+fun(x)+fun(x))
第一次调用:
fun
(2),n=2,n=4,fun=4,x=4
Text1=Str(4+fun(x)+fun(x))
第二次调用,fun(4),n=16,fun=16,x=16
Text1=Str(4+16+fun(x))
第三次调用,求fun(16),n=256,fun=256,x=256
Text1=Str(4+16+256)
EndSub
PrivateFunctionfun(ByRefnAsInteger)双向传递,传地址
IfnMod3=0Then
n=n+n
Else
n=n*n
EndIf
Fun=n
EndFunction
先将程序中的空格填写完整,并当单击命令按钮,在输入对话框中输入2时,文本框中显示的是。
知识点8传值
【经典题解】
1.窗体上有名称为Command1的命令按钮。
事件过程及2个函数过程如下:
PrivateSubCommand1_Click()
DimxAsInteger,yAsInteger,z
x=3
y=5
z=fy(y)转到functionfy定义处
printfx(fx(x)),y
第一步求fx(x),x->a,a=3,a=a+a=6,fx=6,函数返回值为6
第二步求fx(6),6->a,a=6,a=12,fx=12,函数返回值为12
第三步执行print12,y
EndSub
Functionfx(ByValaAsInteger)单向传递,
a=a+a
fx=a
EndFunction
Functionfy(ByRefaAsInteger)a=5,双向传递
a=a+aa=10
fy=afy=10返回值
EndFunction把形参反向传给实参,y`
运行程序,并单击命令按钮,则窗体上显示的2个值依次是和。
2.设有如下通用过程
Public Function Fun(xStr As String) As String‘xStr=”ABCDEF”
Dim tStr As String, strL As Integer
tStr = ""
strL = Len(xStr)
i = strL / 2
Do While i <= strL
tStr = tStr & Mid(xStr, i + 1, 1)
i = i + 1
Loop
Fun = tStr & tStr
End Function
在窗体上画一个名称为Text1的文本框和一个名称为Command1的命令按钮。
然后编写如下事件过程
Private Sub Command1_Click()
Dim S1 As String
S1 = "ABCDEF"
Text1.Text = LCase(Fun(S1))
End Sub
程序运行后,单击命令按钮,文本框中显示的是。
A)ABCDEFB)abcdefC)defdefD)defabc
知识点9数组参数的传送
VisualBasic允许把数组作为实参传送到过程中。
用数组作为过程的参数时,应在数组名的后面加上一对括号,以免与普通变量相混淆。
除遵循参数传送的一般规则外,还应注意以下两点:
(l)为了把一个数组的全部元素传递给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。
(2)如果不需要把整个数组传递给通用过程,可以只传递指定的单个元素,这需要在数组名后面的括号中写上指定的元素下标。
说明:
如果用数组名作为参数进行传递时,相当于传址方式。
即对形参数组元素值的改变会影响实参数组元素的值。
【经典题解】
1.以下关于函数过程的叙述中,正确的是。
A)函数过程形参的类型与函数返回值的类型没有关系
B)在函数过程中,过程的返回值可以有多个
C)当数组作为函数过程的参数时,既能以传值方式传递,也能以传址方式传递
D)如果不指明函数过程参数的类型,则该参数没有数据类型
2.在窗体上画一个名称为Command1的命令按钮。
然后编写如下程序:
OptionBase1
PrivateSubCommand1_Click()
Dima(10)AsInteger
Fori=1To10
a(i)=i
Next
Callswap(a())
Fori=1To10
Printa(i);
Next
EndSub
Subswap(b()AsInteger)
n=Ubound(b)
Fori=1To5
t=b(i)
b(i)=b(n)
b(n)=t
Nexti
EndSub
上述程序的功能是,通过调用过程swap,调换数组中数值的存放位置,即a
(1)与a(10)的值互换,a
(2)与a(9)的值互换,……。
请填空。
3.有以下程序:
Subsubp(b()AsInteger)