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=ntop step-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+1to5 Forj=1toi
t=a(i,j) t=a(i,j)
a(i,j)=a(j,i) a(i,j)=a(j,i)
a(j,i)=t a(j,i)=t
Nextj Nextj
Nexti 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,根据某一迭代公式得到一个新的值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)
例如:
You are good→Dtz fwj ltti
解密为加密的逆过程
将每个字母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