top=mid-1
Else
bot=mid+1
EndIf
Loop
IffindThen
search=mid
Else
search=-1
EndIf
EndFunction
七、插入法
把一个数插到有序数列中,插入后数列仍然有序
基本思想:
n个有序数(从小到大)存放在数组a
(1)—a(n)中,要插入的数x。
首先确定x插在数组中的位置P;(可由以下语句实现)
p=1
dowhilex>a(p)andp<=n
p=p+1
loop
a(p)—a(n)元素向后顺移一个位置以空出a(p)元素放入x,可由以下语句实现:
fori=ntopstep-1
a(i+1)=a(i)
nexti
a(p)=x
将其写成一插入函数
PrivateSubInstert(a()AsSingle,xAsSingle)
Dimp%,n%,i%
n=UBound(a)
ReDimPreservea(n+1)
p=0
DoWhilex>a(p)Andp<=n'确定x应插入的位置
p=p+1
Loop
Fori=nTopStep-1
a(i+1)=a(i)
Nexti
a(p)=x
EndSub
八、矩阵(二维数组)运算
(1)矩阵的加、减运算
C(i,j)=a(i,j)+b(i,j)加法
C(i,j)=a(i,j)-b(i,j)减法
(2)矩阵相乘
(矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。
矩阵C中任一元素
(i=1,2,…,m;j=1,2,…,n)
Fori=0Tom
Forj=0Ton
c(i,j)=0
Fork=0Tol
c(i,j)=c(i,j)+a(i,k)*b(k,j)
Nextk
Nextj
Nexti
(3)矩阵转置
例:
有二维数组a(5,5),要对它实现转置,可用下面两种方式:
Fori=1to5
(2)Fori=2to5
Forj=i+1to5Forj=1toi
t=a(i,j)t=a(i,j)
a(i,j)=a(j,i)a(i,j)=a(j,i)
a(j,i)=ta(j,i)=t
NextjNextj
NextiNexti
(4)求二维数组中最小元素及其所在的行和列
基本思路同一维数组,可用下面程序段实现(以二维数组a(2,3)为例):
‘变量max中存放最大值,row,column存放最大值所在行列号
Max=a(1,1):
row=1:
Column=1
Fori=1To2
Forj=1To3
Ifa(i,j)>a(row,Column)Then
Max=a(i,j)
row=i
Column=j
EndIf
Nextj
Nexti
Print"最大元素是";Max
Print"在第"&row&"行,";"第"&Column&"列"
九、迭代法
算法思想:
对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:
x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。
此时可将x1作为问题的解。
例:
用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
PrivateFunctionFsqrt(aAssingle)ASsingle
Dimx0AsSingle,x1AsSingle
x0=a/2'迭代初值
x1=0.5*(x0+a/x0)
Do
x0=x1'为下一次迭代作准备
x1=0.5*(x0+a/x0)
LoopWhileAbs(x1-x0)>0.00001
Fsqrt=x1
EndFunction
十、数制转换
将一个十进制整数m转换成→r(2-16)进制字符串。
方法:
将m不断除r取余数,直到商为零,以反序得到结果。
下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
PrivateFunctionTrDec(idecAsInteger,ibaseAsInteger)AsString
DimstrDecR$,iDecR%
strDecR=""
DoWhileidec<>0
iDecR=idecModibase
IfiDecR>=10Then
strDecR=Chr$(65+iDecR-10)&strDecR
Else
strDecR=iDecR&strDecR
EndIf
idec=idec\ibase
Loop
TrDec=strDecR
EndFunction
十一、字符串的一般处理
1.简单加密和解密
加密的思想是:
将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式:
c=chr(Asc(c)+k)
例如序数k为5,这时"A"→"F","a"→"f","B"→"G"…
当加序数后的字母超过"Z"或"z"则c=Chr(Asc(c)+k-26)
例如:
Youaregood→Dtzfwjltti
解密为加密的逆过程
将每个字母C减(或加)一序数K,即c=chr(Asc(c)-k),
例如序数k为5,这时"Z"→"U","z"→"u","Y"→"T"…
当加序数后的字母小于"A"或"a"则c=Chr(Asc(c)-k+26)
下段程序是加密处理:
i=1:
strp=""
nL=Len(RTrim(strI))
DoWhile(i<=nL)
strT=Mid$(strI,i,1)'取第i个字符
If(strT>="A"AndstrT<="Z")Then
iA=Asc(strT)+5
IfiA>Asc("Z")TheniA=iA-26
strp=strp+Chr$(iA)
ElseIf(strT>="a"AndstrT<="z")Then
iA=Asc(strT)+5
IfiA>Asc("z")TheniA=iA-26
strp=strp+Chr$(iA)
Else
strp=strp+strT
EndIf
i=i+1
Loop
Printstrp
2.统计文本单词的个数
算法思路:
(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量WT表示所取字符是否是单词内的字符,初值设为False
(2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True则表是新单词的开始,让单词数Nw=Nw+1,让WT=True;
(3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,则表示字符不是单词内字符,让WT=False;
再依次取下一个字符,重得
(2)(3)直到文本结束。
下面程序段是字符串strI中包含的单词数
Nw=0:
Wt=False
nL=Len(RTrim(strI))
Fori=1TonL
strT=Mid$(strI,i,1)'取第i个字符
SelectCasestrT
Case"",",",";","!
"
Wt=False
CaseElse
IfNotWtThen
Nw=Nw+1
Wt=True
EndIf
EndSelect
Nexti
Print"单词数为:
",Nw
十二、穷举法
穷举法(又称“枚举法”)的基本思想是:
一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
例:
将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
Dimi%,j%,k%
Print"5元1元0.5元"
Fori=1To20
Forj=1To100-i
k=100-i-j
If5.0*i+1.0*j+0.5*k=100Then
Printi,j,k
EndIf
Nextj
Nexti
十三、递归算法
用自身的结构来描述自身,称递归
VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。
递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
递归条件:
(1)递归结束条件及结束时的值;
(2)能用递归形式表示,且递归向终止条件发展。
例:
编fac(n)=n!
的递归函数
Functionfac(nAsInteger)AsInteger
Ifn=1Then
fac=1
Else
fac=n*fac(n-1)
EndIf
EndFunction