IffindThensearch=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中任一元素l
c(i,j)=2(a(i,kMb(k,j))(i=1,2,…,m;j=1,2,…,n)
krn
Fori=0Tom
Forj=0Ton
c(i,j)=0Fork=0Tol
c(i,j)=c(i,j)+a(i,k)*b(k,j)
Nextk
Nextj
Nexti
(3)矩阵转置
例:
有二维数组a(5,5),要对它实现转置,可用下面两种方式:
(2)Fori=2to
Fori=1to5
5
Forj=1to
Forj=i+1to5
■
a(i,j)=
a(j,i)=t
Nextj
Nexti
it=a(i,j)t=a(i,j)a(i,j)=a(j,i)a(j,i)a(j,i)=t
Nextj
Nexti
(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,根据某一迭代公式得到一个新的值XI,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:
x1TxO,重新按原来的方法求x1,重复这一过和直到Ix1-x0|<£(某一给定的精度)。
此时可将x1作为问题的解。
例:
用迭代法求某个数的平方根。
已知求平方根的迭
代公式为:
刘」仏+邑)
2X0
PrivateFunctionFsqrt(aAssingle)ASsingleDimx0AsSingle,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=x1EndFunction
十、数制转换
将一个十进制整数m转换成fr(2-16)进制字符串。
方法:
将m不断除r取余数,直到商为零,以反序得到结果。
下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,
八进制的基是8等),函数输出结果是字符串。
PrivateFunctionTrDec(idecAsInteger,ibaseAs
Integer)AsString
DimstrDecR$,iDecR%
strDecR=""
DoWhileidec<>0
iDecR=idecModibaseIfiDecR>=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)
"a"T"f",
"Z"或"z"则
例如序数k为5,这时"A"T"F",
"B"T"G"…当加序数后的字母超过
c=Chr(Asc(c)+k-26)
fwjItti
例如:
Youaregood^Dtz
解密为加密的逆过程
将每个字母C减(或加)一序数K,即
c=chr(Asc(c)-k),
例如序数k为5,这时"Z"T"U","z"T"u",
"Y"7"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")TheniA=Asc(strT)+5IfiA>Asc("Z")TheniA=iA-26strp=strp+Chr$(iA)
ElseIf(strT>="a"AndstrT<="z")TheniA=Asc(strT)+5
IfiA>Asc("z")TheniA=iA-26strp=strp+Chr$(iA)
Else
strp=strp+strT
EndIf
i=i+1
Loop
Printstrp2.统计文本单词的个数
算法思路:
(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量W俵示所取字符是否是单词内的字符,初值设为False
”YUi=r.”
(2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True则表是新单词的开始,让单词数Nw=Nw+1,让WT=True;
口,”
号”
(3)若所取字符是“空格”,“逗号”,“分号”或“感叹等单词的分隔符,则表示字符不是单词内字符,
让WT=False;
(4)再依次取下一个字符,重得
(2)(3)直到文本结束。
'取第i个字符
下面程序段是字符串strI中包含的单词数Nw=0:
Wt=FalsenL=Len(RTrim(strI))Fori=1TonLstrT=Mid$(strI,i,1)SelectCasestrTCase"",",",";","!
"Wt=FalseCaseElseIfNotWtThenNw=Nw+1Wt=TrueEndIfEndSelect
Nexti
Print"单词数为:
",Nw
十二、穷举法穷举法(又称“枚举法”)的基本思想是:
一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
例:
将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
Dimi%,j%,k%Print"5元Fori=1To20
Forj=1To100-ik=100-i-j
If5.0*i+1.0*j+0.5*k=100
Then
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