t=a(j+1)
a(j+1)=a(j)
a(j)=t
EndIf
Nextj
Nexti
Fori=1Ton
List2.AddItema(i)
Nexti
Command1.Enabled=True
Command3.Enabled=False
Command4.Enabled=True
Command2.Enabled=False
EndSub
PrivateSubCommand4_Click()'二分查找
DimMidAsInteger,Low%,High%,c%,m%
c=InputBox("请输入要查找的数字:
")
Low=LBound(a)
hight=UBound(a)
Do
Mid=(Low+hight)\2
Ifa(Mid)>cThen
Low=Mid+1
ElseIfa(Mid)=cThen
m=Mid
ExitDo
Else
hight=Mid-1
EndIf
LoopUntilLow>hight
Ifm=0Then
MsgBox"找不到"
Else
MsgBox"是第"+Str(m)+"个"
List2.Selected(m-1)=True
Command5.Enabled=True
EndIf
EndSub
PrivateSubCommand5_Click()'删除元素
Fori=mToUBound(a)-1
a(i)=a(i+1)
Nexti
List2.Clear
ReDimPreservea(UBound(a)-1)
Fori=LBound(a)ToUBound(a)
List2.AddItema(i)
Next
Command5.Enabled=False
EndSub
五、过程
1、过程的概念
VB的程序是由一个个过程构成的,除了VB系统提供了大量使用的内部函数过程和事件过程外,VB系统还允许用户根据各自的需要自定义过程。
使用过程的好处:
使程序简练、高效、便于程序的调试和维护。
2、两类过程定义与调用
1)子过程
定义形式:
Sub<子过程>[(形参表)]
………
EndSub
特点:
子过程名无值,无类型
调用形式:
Call<子过程名>[(实参表)]
<子过程名>[(实参表)]
特点:
独立的语句
在首句Sub前面还可加上表示过程作用域的标识符
Public:
表示该子过程可被应用程序(整个工程)的任意模块和过程调用
Private:
标识该子过程只能被本模块(文件)中的过程调用
2)函数过程
定义形式:
Function<函数过程>([形参表])
。
。
。
。
。
。
<函数过程名>=<表达式>
。
。
。
。
。
。
EndFunction
特点:
函数过程名有值、有类型、在过程体内至少赋值一次
调用形式:
<函数过程名>([实参表])
特点:
不能独立存在,必须参加表达式的运算。
Eg:
1)下面子过程说明合法的是:
A)Subf1(ByValn%())数组作为参数时,不能使用值传递
B)Subf1(n%)AsInteger子过程名无值也无类型
C)Functionf1%(f1%)函数名与形参名相同
D)Functionf1(Byvaln%)
3、参数传递
传值(ByVal):
将实参的具体值传递给形参(调用结束不能由形参将操作结果返回给实参)
传址(ByRef):
将实参在内存的地址传递给形参(即实参、形参共用内存内的“地址”)
Eg:
下面程序运行后显示的结果是
PublicSubF1(n%,Byvalm%)
n=nMod10
m=m\10
EndSub
PrivateSubCommand1_Click()
Dimx%,y%
X=12:
y=34
CallF1(x,y)
Printx,y
EndSub
注意:
若实参是数组、自定义类型、对象变量等,形参只能是地址传递。
4、变量的作用域
全局变量:
Public关键字开头的变量为全局变量,在整个工程中都有效。
窗体、模块级变量:
在通用声明段用Dim或Public关键字声明的变量,在该窗体或模块内有效(即窗体装入时分配该变量的存储空间,直到该窗体从内存卸掉,才回收该变量分配的存储空间)
局部变量:
在过程中声明的变量,在该过程调用时分配内存空间并初始化,过程调用结束,回收分配的空间。
(即调用一次,初始化一次,变量不保值)
Eg:
如下程序,运行的结果是
Dima%,b%,c%
PublicSubp1(x%,y%)
Dimc%
x=2*x:
y=y+2:
c=x+y
EndSub
PublicSubp2(x%,ByValy%)
Dimc%
x=2*x:
y=y+2:
c=x+y
EndSub
PrivateSubCommand1_Click()
a=2:
b=4:
c=6
Callp1(a,b)
Print"a=";a;"b=";b;"c=";c
Callp2(a,b)
Print"a=";a;"b=";b;"c=";c
EndSub
5、过程的递归调用
在调用一个子过程或函数过程中又调用自己,称为递归调用(递归过程)
Eg:
求阶乘n!
n!
=n*(n-1)!
阶乘n!
=n*(n-1)!
,写成如下形式:
fac(n)=0(n=1)
fac(n)=n*fac(n-1)(n>1)
PublicFunctionfac(nAsInteger)AsDouble
Ifn=1Then
fac=1
Else
fac=n*fac(n-1)
EndIf
EndFunction
PrivateSubCommand1_Click()
DimnAsInteger
n=Val(InputBox("输入n的值:
"))
Print"fac("+Str(n)+")=";fac(n)
EndSub
6、常用算法
1)穷举法:
把所有可能的值都验证一遍,若符合条件则有解
Eg:
已知某人的出生日乘以12和出生月份乘以31之和,求其出生日期
PrivateSubCommand1_Click()
Dimn%,ri%,yue%
n=InputBox("请把你的出生日乘以12,再把出生月份乘以31求出两数之和:
)")
Foryue=1To12
Forri=1To31
Ifri*12+yue*31=nThenMsgBox"我知道了!
你的生日是"+Str(yue)+"月"+Str(ri)+"日"
Nextri
Nextyue
EndSub
2)迭代(主要是用计算机解决数学中高次方程的近似求解问题):
迭代法是用一个初值x,通过迭代公式求得新值x1,若|x-x1|<€,则x1就是求得的根;否则用x1代替x重复迭代,直到达到精度。
所以迭代是通过循环来实现。
Eg:
实验讲义P26_6
PrivateSubCommand1_Click()
Consteps=0.000001
Dima!
a1!
a0!
a=InputBox("请输入a=")
a1=a
Do
a0=a1‘反复用新值代替旧值来迭代
a1=(a0+a/a0)/2
LoopUntilAbs(a1-a0)Print"a^(1/2)=";a1
EndSub
3)求级数:
庄子:
一尺之锤,日取其半,万世不竭
1/2+1/2^2+...1/2^n+...=1
无穷级数。
它的项随n大而减小,但它的和为1。
另一个级数:
1/2+1/3+1/4+...+1/n+...
虽然项也是越来越小,但只要n取得适当,可大于任何预定的数m。
例