VB程序设计的常用算法Word下载.docx
- 文档编号:17069222
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:27
- 大小:173.04KB
VB程序设计的常用算法Word下载.docx
《VB程序设计的常用算法Word下载.docx》由会员分享,可在线阅读,更多相关《VB程序设计的常用算法Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
t=1'
第一项
PAI=0'
累加和初始值为0
n=1'
每一项的分母值
s=1'
第一项符号
DoWhile(Abs(t)>
=x)
PAI=PAI+t'
将每一项求和,得到π/4的近似值
n=n+2'
产生每一项的分母值
s=-s'
产生每一项的符号值
t=s/n'
产生每一项
Loop
PAI=PAI*4
EndFunction
【使用说明】调用该函数时将题目中规定了精度值(例如10^-6)传递给形参x,调用完该函数后π的近似值就保存在函数名PAI中。
PrivateSubForm_Click()
PrintPAI(10^-6)
EndSub
【计算e的近似值】求自然对数e的近似值,要求其误差小于0.00001,近似公式为:
PrivateFunctionE_zhi(ByValx)
Dimi%,n&
t!
E_zhi=0'
存放累加和
i=0'
循环控制变量
n=1'
存放连乘积
t=1'
级数第i项初始值
DoWhilet>
x
E_zhi=E_zhi+t'
将每一项加入累加和
i=i+1'
产生阶乘下一个乘数
n=n*i'
乘以乘数i得到每一项的阶乘
t=1/n'
Loop
【使用说明】调用该函数时将题目中规定了精度值(例如0.00001)传递给形参x,调用完该函数后e的近似值就保存在函数名E_zhi中。
PrintE_zhi(0.00001)
【斐不拉齐数列】输出斐不拉齐数列(Fibonacci)的前40个项:
1、1、2、3、5、8、13、……
数列中的第1、2项为1,其后每项都等于其前两项之和,其递推公式:
PrivateSubFibo(x())
Dimf1AsLong,f2AsLong,iAsInteger
x(Lbound(x))=1'
数列第一项
x(Lbound(x)+1)=1'
数列第二项
f1=1
f2=1
Fori=Lbound(x)+2ToUbound(x)'
循环产生第3至最后一项
f3=f1+f2'
计算下一个数列项
x(i)=f3'
产生下一个数列项
f1=f2'
为下一个数列项计算做准备
f2=f3'
Nexti
EndSub
【使用说明】调用该子过程时,根据题目中规定的数列项数产生一个对应大小的数组(例如a()),将数组传递给传递给形参数组x(),调用完该子过程后斐不拉齐数列就保存在实参数组中。
PrivateSubForm_Click()
Dima(1to40)
CallFibo(a())
Fori=0to40
Printa(i);
Ifimod5=0thenPrint
Nexti
【计数统计】用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
使用数组来处理,用数组a(1to100)存放产生的确100个随机整数,数组x(1to10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x
(1)中,个位是2的个数存放在x
(2)中,……个位是0的个数存放在x(10)。
Dima(1To100),x(1To10)AsInteger
Dimi,pAsInteger
Fori=1To100'
产生100个[0,99]范围内的随机整数,每行10个打印出来
a(i)=Int(Rnd*100)
Ifa(i)<
10Then
PrintSpace
(2);
a(i);
Else
PrintSpace
(1);
EndIf
IfiMod10=0ThenPrint
'
统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x
(1),x
(2),...,x(10)中,将统计结果打印出来
Fori=1To100
p=a(i)Mod10'
求个位上的数字
Ifp=0Thenp=10'
统计数字的个数
x(p)=x(p)+1
Print"
统计结果"
Fori=1To10'
打印计数统计的结果
p=i
Ifi=10Thenp=0
个位数为"
+Str(p)+"
共"
+Str(x(i))+"
个"
2、最大公约数(最小公倍数)
求两个正整数X和Y的最大公约数,可以使用递推算法,辗转相除得到。
用M表示被除数,N表示除数(M>
N),R表示余数。
输入两个正整数M和N,且M>
N;
计算M除以N得余数R;
如果R不为0时,使M=N和N=R后转移到第2步再次计算;
如果R=0时,N就是所求的最大公约数。
最小公倍数就是两个数的乘积再除以最大公约数的结果。
PrivateSubGYGB(ByValx,ByValy,MaxGY,MinGB)
Dimm,n,r
Ifx>
yThen'
使得M>
N,即将两个正整数排序
m=x:
n=y
Else
m=y:
n=x
EndIf
Do'
求最大公约数
r=mModn
m=n
n=r
LoopWhiler<
>
0
MaxGY=m
MinGB=x*y/m
【说明】
x和y保存了两个正整数的原值,以便最后计算最小公倍数;
If语句保证了m>
n,但省略If语句也不会出错,因为r=mModn:
m=n:
n=r会自动将较大的数交换到m中。
【使用说明】调用该子过程时,将题目中规定所求的两个数(例如:
a和b)作为前两个实参分别传递给前两个形参x和y,子过程调用结束x和y两个数的最大公约数保存在形参MaxGY里,并传递给第3个实参(例如:
c),同理x和y两个数的最小公倍数保存在形参MinGB里,并传递给第4个实参(例如:
d)。
Dima,b,c,d
a=Text1.Text
b=Text2.Text
CallGYGB(a,b,c,d)
Printc,d
3、穷举法
将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现,也称为“枚举法”。
这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
【百钱买百鸡】我国古代数学家张丘建在《算经》中曾提出一个有趣的“百钱买百鸡”问题。
题意为:
已知用5文钱可以买一只公鸡,3文钱可以买1只母鸡,用1文钱可以买3只小鸡,如果要用100文钱买100只鸡。
请问公鸡、母鸡和小鸡应各买多少只?
(1)分析:
设变量x表示公鸡,y表示母鸡,z表示小鸡。
则有方程组:
上述方程组中,有3个求和数,但只有两个方程,帮方程组有多个解。
为解决这类问题一般需要使用穷举法。
即先对各求知数的所有可能进行穷举,然后再依次判断哪些值能满足要求。
DimxAsInteger,yAsInteger,zAsInteger,numAsLong
Forx=0To100
Fory=0To100
Forz=0To100
num=num+1
If(x+y+z=100And5*x+3*y+z/3=100)Then
公鸡="
;
x,"
母鸡="
y,"
小鸡="
z
Nextz
Nexty
Nextx
方法一的If语句测试了"
num;
"
次"
EndSub
(2)通过分析可知,公鸡、母鸡和小鸡的可能值为:
0~20、0~33、100-x-y。
PrivateSubForm_Click()
DimxAsInteger,yAsInteger,zAsInteger,numAsInteger
Forx=0To20
Fory=0To33
z=100-x-y
num=num+1
If5*x+3*y+z/3=100Then
Print“公鸡=”;
x;
“母鸡=”;
y;
“小鸡=”;
Endif
Nexty,x
Print"
方法二If语句测试"
EndSub
通过num变量可以测试循环的次数,还可以使用系统变量Now测试循环使用的时间。
在方法二中两层循环的Next相邻时,可以合而为一:
Nexty,x。
【注意】在多重循环中,为了提高运行的速度,要考虑对程序优化问题:
利用已知条件,尽量减少循环的次数。
合理地选择内、外层的循环控制变量,即将循环次数多的放在内循环。
尽量少用变体型变量,在方法一中x、y、z使用变体型,运行的时间可由4s减少到19s。
【换零钱程序】将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
Dimi%,j%,k%
5元"
"
1元"
0.5元"
Fori=1To20
Forj=1To100-i
k=100-i-j
If5*i+1*j+0.5*k=100Then
Printi,j,k
Nextj
4、素数问题
素数(质数)就是只能被1和它本身整除的整数。
如果整数m不能被2~m-1之间的数所整除,则m是素数。
反之,如果找到一个2~m-1之间的数能够整除m,则证明m不是素数。
结合循环结构使用穷举法测试2~m-1。
实际上,如果整数m能被分解为两个因子a和b,那么其中较小一个因子必定小于m0.5。
只要找到一个能整除m的数x后,已经能证明m不是素数,x的后续数据可以不再验证,可使用Exitfor有条件提前退出循环。
【穷举法素数判断】输入一个正整数m,并判断m是否为素数。
PrivateFunctionSS(ByValm)AsBoolean
DimkAsInteger,iAsInteger
k=Sqr(m)'
求m的平方根
Fori=2Tok'
从2到k测试是否为m的因子,如果是素数则正常退出循环
IfmModi=0ThenExitFor'
找到一个因子,不是素数则提前退出循环
Nexti
Ifi>
kThen'
根据结束循环的方式,判断素数结果
SS=True
Else
SS=False
EndIf
【说明】如果程序是因为找到了一个能整除m的数,而通过Exitfor语句退出For循环的,则i<
=Sqr(m);
反之,如果是正常结束循环的话,则应执行i=k+1。
因此,可以根据是否(i>
k)来判断“是素数”或“不是素数”。
【使用说明】调用该函数时,将题目中需要判定的数(例如:
x)作为实参传递给形参m,调用结束后函数名(例如:
SS)保存了判定的逻辑结果(True或False)。
Dimx
x=Val(Text1.Text)
PrintSS(x)
【随机产生素数】随机产生20个两位素数。
DimmAsInteger,countAsInteger,iAsInteger,kAsInteger
Randomize
DoUntilcount>
=20
m=Int(Rnd*90)+10'
随机产生一个两位十进制数
IfSS(m)Then'
如果是素数则打印输出到窗体上,并计数加1
count=count+1
Printm;
””;
IfcountMod10=0ThenPrint'
一行打印输出10个
EndIf
Loop
首先通过随机函数产生一个两位整数,然后再判断该整数是否是素数。
如果是素数,则素数计数器count加1;
如果不是素数,则产生下一个随机数。
程序反复执行,直到产生20个满足条件的随机素数为止。
外循环是一个DoUntil…Loop循环,内循环是一个For…Next循环。
语句“IfcountMod10=0ThenPrint”的作用,是保证每行输出10个素数。
5、最大值和最小值
在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值,然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,依次逐一比较。
【寻找最大值和最小值】从10个范围[1,100]随机数中找出其最大值和最小值。
PrivateSubMax_Min(x(),Max,MaxIndex,Min,MinIndex)
Dimi%
MinIndex=Lbound(x)
MaxIndex=Lbound(x)
Min=x(MinIndex)
Max=Min
Fori=Lbound(x)+1ToUbound(x)
Ifx(i)<
minThenMin=x(i):
MinIndex=i
Ifx(i)>
maxThenMax=x(i):
MaxIndex=i
【使用说明】调用该子过程时,将题目中待查找的数据都放入一个数组(例如:
a())中,作为实参数组传递给形参数组x(),子过程调用结束后找出的最大值通过形参Max传递给实参x,找出的最大值在数组中的下标通过形参MaxIndex传递给实参y,找出的最小值通过形参Min传递给实参c,找出的最小值在数组中的下标通过形参Min传递给实参d。
Dimx,a(1to10)
Fori=1To10
a(i)=Int(Rnd*100)+1
Printa(i);
Nexti
CallMax_Min(a(),x,y,c,d)
Printx,y,c,d
【最短残料】有一根长度为321m的钢材料,要将它截取成两种规格的短料,规格a、b的长度分别为17m和27m,每种至少1段,分隔成a、b各多少段后,剩余的残料r最少?
该题利用二重循环求残料r的最小值正数,因为残料不可能为负。
Dima%,b%,r!
ia%,ib%,t!
r=321'
最小值初值取钢材料的长度
Forb=1ToInt((321-17)/27)'
b最多的段数
Fora=1ToInt((321-b*27)/17)'
a最多的段数
t=321-b*27-a*17'
当前的残料
Ift>
=0Andt<
rThen'
当前的残料>
=零并且比最短的残料小
r=t'
求最短的残料
ia=a'
最短残料时a的段数
ib=b'
最短残料时b的段数
Nexta
Nextb
最短残料时a的段数:
"
ia
最短残料时b的段数:
ib
最短残料为:
r
6、数组与矩阵运算
矩阵元素可以存放在二维数组中,对矩阵的各种运算也就变成了对数组的运算。
【矩阵转置】对于n×
n的矩阵,转置实质上是:
每个元素与下标交换后对应的元素交换数据,其中两条对角线上的元素和自身交换数据。
例如,有二维数组a(5,5),要对它实现转置,有两种方法可以实现。
PrivateSubArray_ZZ(x())
Fori=LBound(x,1)ToUBound(x,1)-1'
将矩阵a转置
Forj=i+1ToUBound(x,2)
temp=x(i,j)
x(i,j)=x(j,i)
x(j,i)=temp
Nextj
【使用说明】调用该子过程时,将题目中要求转置的数据都放入一个二维数组(例如:
a())中,并作为实参数组传递给形参数组x(),子过程调用结束后经过转置的数据也通过形参数组传递回实参数中。
PrivateSubCommand1_Click()
Dima(5,5)AsInteger,i%,j%
Picture1.Cls:
Picture2.Cls
Fori=1To5'
矩阵a赋初始值并显示在Picture1中
Forj=1To5
a(i,j)=Int(Rnd*9+1)
Picture1.Printa(i,j);
Picture1.Print
CallArray_ZZ(a())
Fori=1To5'
转置结果显示在Picture2中
Picture2.Printa(i,j);
Picture2.Print
二、数据处理算法
1、排序
排序是程序设计中最基本的问题之一,有关排序算法的各种讨论可以写成厚厚的一本书。
在本例中介绍了两种最常用的排序方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 程序设计 常用 算法