VB常用算法总结.docx
- 文档编号:6004753
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:20.25KB
VB常用算法总结.docx
《VB常用算法总结.docx》由会员分享,可在线阅读,更多相关《VB常用算法总结.docx(14页珍藏版)》请在冰豆网上搜索。
VB常用算法总结
VB_常用算法总结
一、变量值的交换
算法思想:
若交换两个变量的值,必须引入第三个新的变量进行传递。
以下代码是错误的:
X=12:
Y=34:
X=Y:
Y=X
正确的代码是:
X=12:
Y=23:
T=X:
X=Y:
Y=T
二、判断一个数是否能被另一个数整除
算法思想:
可以用整除的定义(余数为0)或X除以Y等于X整除Y等表达式进行判断。
条件表达式可以为:
XmodY=0或X\Y=X/Y或Int(X/Y)=X/Y
如果以上条件表达式为True,则表示X能被Y整除。
三、累加、阶乘、计数和求平均值
算法思想:
使用循环语句,并用一个变量存放累加的中间及最终结果。
注:
累加求和时变量初值为0,计算阶乘时变量初值为1。
统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。
求平均值算法思想是先求和,再除以个数。
条件求和(或计数):
在循环语句中加入If-EndIf判断语句。
例题:
计算1到10之间所有整数的累加和以及10!
。
n=10
sum=0‘累加求和时,变量的初值一定为0
prod=1‘累乘(连乘)时,变量的初值一定为1
Fori=1Ton
sum=sum+i
prod=prod*i
Nexti
Printsumprod
例题:
统计0—100之间能被3整除的数的个数、累加和及其平均值。
s=0
n=0
Fori=0To100
Ifimod3=0Then
s=s+i
n=n+1
EndIf
Nexti
Printnss/n
四、对数组中的元素逐一进行操作
算法思想:
在VB中,对于数组中元素的操作,往往使用到For循环。
通用代码为:
Dim数组名([下标下界]To下标上界)
……
Fori=LBound(数组名)ToUBound(数组名)
……
数组名(i)……
……
Nexti
通过以上循环,可以对数组中所有元素逐一操作。
注:
1)LBound函数:
返回数组的下界
UBound函数:
返回数组的上界
2)如果数组上界和下界已经确定,可以不使用函数,直接指明即可。
例如
Optionbaxxxxse1
Dima(100)AsInteger
Fori=1To100
……
a(i)……
……
Nexti
3)对于二维数组,要使用For循环的嵌套实现对数组中元素的操作,其中外层循环变量控制第一维下标的变化,内层循环变量控制第二维下标的变化,例如:
Optionbaxxxxse1
Dima(23)AsInteger
Fori=1to2
Forj=1to3
……
a(ij)……
……
Nextj
Nexti
例题:
1.对下标为偶数的元素进行处理的程序代码
Optionbaxxxxse1
……
Fori=1toUBound(a)‘循环变量i可代表数组元素的下标
Ifimod2=0Then
a(i)……
EndIf
Nexti
2.对数组元素中数据为偶数的元素进行处理
Optionbaxxxxse1
……
Fori=1toUBound(a)‘循环变量i代表数组元素的下标
Ifa(i)mod2=0Then
a(i)……
EndIf
Nexti
五、交换数组元素
算法思想:
若某一维数组有n个元素,将第1个元素和第n个元素交换,将第2个元素和第n-1个元素交换……,需要交换n\2次(如果交换n次,则回到初始状态);对于二维数组,若进行行交换或列交换,需要使用循环语句,每次循环需要使用变量值交换算法。
例题:
交换一维数组(5个元素)的元素值
b=Array(13579)
Fori=0To5\2
tmp=b(i)
b(i)=b(5-i-1)
b(5-i-1)=tmp
Nexti
EndSub
例题:
一维数组元素交换的通用代码:
n=UBound(数组名)
Fori=LBound(数组名)Ton\2
t=b(i)
b(i)=b(n)
b(n)=t
n=n-1
Nexti
例题:
交换二维数组Mat第二列和第四列的数据
Fori=LBound(Mat1)ToUBound(Mat1)
t=Mat(i2)
Mat(i2)=Mat(i4)
Mat(i4)=t
Nexti
例题:
交换二维数组Mat第一行和第三行的数据
Forj=LBound(Mat2)ToUBound(Mat2)
t=Mat(1j)
Mat(1j)=Mat(3j)
Mat(3j)=t
Nexti
六、求数组元素中的最大值、最小值
算法思想:
假设数组中第一个元素为最大值,并赋给变量Max,然后使用循环结构依次与第2个数组元素至最后一个元素进行比较,如果某数组元素的值大于Max,则将该元素的值赋给Max(同时可记录下该数组元素在数组中的位置)。
例题:
显示数组a中的最大值及其下标。
Optionbaxxxxse1
DimMaxAsIntegerIndexAsInteger
Max=a
(1)
aIndex=1
Fori=2toUBound(a)
Ifa(i)>MaxThen
Max=a(i)
aIndex=i
EndIf
Nexti
PrintMaxi
求最小值的方法与此类似,差别在于取第一个元素为最小值Min,与2个数组元素至最后一个元素进行比较时判断关系有所调整,即
Min=a
(1)
Ifa(i) Min=a(i) EndIf 七、常用字符处理函数 Mid函数: 从字符串指定位置取指定个字符,格式为Mid(字符pn),从第p个字符开始,向后截取n个字符(若n省略则取到最后)。 Left和Right函数: 从字符串左边或右边取指定个字符,格式为Left(字符n)和Right(字符n)。 Len函数: 测试字符串长度。 UCase和LCase函数: UCase将小写字母转换为大写字母;LCase将大写字母转换为小写字母。 Instr([首字符位置]字符串1字符串2[n]): 在字符串1中查找字符串2,如果找到,返回字符串2的第一个字符在字符串1中出现的位置。 首字符位置是可选的,如果不指定,从字符串起始位置开始查找;如果指明,从指定的位置开始查找。 Asc函数: 返回字符串中第一个字符的ASCII码。 Chr函数: 将一个数值转换为其所对应的字符。 字符的比较规则是按ASCII码顺序比较,规则为空格<”A”~”Z”<”a”~”z” 小写字母的ASCII比大写字母的ASCII小32。 例题: 1.将所有文本转换为大写(小写)字母 可以直接使用UCase(LCase)函数转换。 例如: Text2.Text=UCase(Text1.Text) 2.对某个字符串的所有字符逐一处理 算法思想: 如果对某个字符串的所有字符逐一处理,即从字符串的第1个字符开始到最后一个字母,每次处理1个字符。 可以使用For循环实现。 通用代码为: Fori=1ToLen(s) s1=Mid(si1) …… Nexti 3.字符转换 算法思想: 通过字符的ASCII码进行处理(使用Asc函数),然后再使用Chr函数将ASCII转换成字符。 例题: 将文本框Text1中字符按如下规律转换a-b、b-c……z-a,并显示在文本框Text2中。 s=Text1.Text n=Len(s) Fori=1Ton s1=Mid(si1) Ifs1>="a"Ands1<="y"Then s2=s2+Chr(Asc(s1)+1) ElseIfs1="z"Then s2=s2+"a" EndIf Nexti Text2.Text=s2 例题: 将文本框Text1中的小写字母转换其对应的大写字母,将大写字母转换成小写字母,并显示在文本框Text2中。 PrivateSubCommand1_Click() s=Text1.Text n=Len(s) m=Asc("a")-Asc("A") Fori=1Ton s1=Mid(si1) Ifs1>="a"Ands1<="z"Then s2=s2+Chr(Asc(s1)-m) EndIf Ifs1>="A"Ands1<="Z"Then s2=s2+Chr(Asc(s1)+m) EndIf Nexti Text2.Text=s2 EndSub 4.判断是否回文函数 所谓回文是指顺读与倒读都一样的字符串,如“rececer” Functionfoundhuiwen(pAsString) foundhuiwen=True k=Len(p) Fori=1Tok/2 IfMid(pi1)<>Mid(pk+1-i1)Then foundhuiwen=False ExitFor EndIf Next EndFunction 如果foundhuiwen函数返回值为True,表明字符串p为回文,否则表示不是回文。 5.统计某字符出现次数 算法思想: 对字符串中字符逐一判断,如果是某字符,则统计变量加1。 例题: 统计文本框Text1中字符i和j出现的次数(不区分大小写)。 PrivateSubCommand1_Click() s=Text1.Text n=Len(s) Fori=1Ton s1=Mid(si1) IfUCase(s1)="I"Thenni=ni+1 IfUCase(s1)="J"Thennj=nj+1 Nexti Printninj EndSub 八、素数 素数定义: 只能被1和本身整除的正整数称为素数(或称质数)。 例如11就是素数,它只能被1和11整除。 算法思想: 判别某数n是否是素数的方法有很多,最简单的是从素数的定义来求解。 对于n,从i=2,3,…,n-1判别n能够被i整除,只要有一个能整除,n就不是素数,否则n是素数。 此种算法比较简单,但速度慢,因此,可以将n被2到(或n/2)间的所有整数除,如果都除不尽,则n就是素数,否则n是非素数。 注: 执行For循环时,循环变量等于终值仍进入循环,遇到Next语句,循环变量会自动加上步长,因此如果循环正常完成后,循环变量的值将大于终值。 例如: Fori=1To4 If……ThenExitFor Nexti Printi 如果循环正常结束,则输出结果为5(大于4)。 如果循环过程中满足If条件,执行ExitFor语句退出循环,则i的值一定小于5。 例题: 判断n是否是素数。 PrivateSubCommand2_Click() n=Val(Text1.Text) Forj=2Ton-1 IfnModj=0ThenExitFor Nextj Ifj>n-1ThenPrint"是素数"ElsePrint"不是素数" EndSub 例题: 输出2~n范围的全部素数。 PrivateSubCommand1_Click() n=Val(Text1.Text) Fori=2Ton Forj=2ToSqr(i) IfiModj=0ThenExitFor Nextj Ifj>Sqr(i)ThenPrinti Nexti EndSub 使用DoWhile循环判断是否是素数的代码为: PrivateFunctionisprime(aAsInteger)AsBoolean DimflagAsBoolean flag=True b=2 DoWhileb<=Int(a/2)Andflag IfInt(a/b)=a/bThen flag=False Else b=b+1 EndIf Loop isprime=flag EndFunction EndSub 其中flag作为标志变量,首先赋值为True,在循环体中,如果满足If条件(即n能被其他数整除),则flag重新赋值为False,最后根据flag的值可知n是否是素数。 九、最大公约数和最小公倍数 算法思想: (1)对于已知两数x、y,使得x>y (2)x除以y得余数r; (3)若r=0,则x为求得的最大公约数,算法结束;否则执行步骤(4) (4)x←y,y←r,再重复执行 (2) 求得了最大公约数后,最小公倍数就可很方便地求出,即将原来的两数相乘除以最大公约数。 PrivateSubForm_Click() x=Val(InputBox("请输入第一个数: ")) y=Val(InputBox("请输入第二个数: ")) Ifx t=x x=y y=t EndIf x1=x y1=y Printxy DoWhiley<>0 r=xMody x=y y=r Loop Print"最大公约数为: ";x Print"最小公倍数为: ";x1*y1/x EndSub 十、完数 定义: 一个数如果正好等于它的因子之和,这个数就称为完数。 例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。 例题: 编程找出1000以内的所有完数。 PrivateSubCommand1_Click() OutputWanNumber1000 EndSub '求完数的过程 SubOutputWanNumber(ByValnAsInteger) DimiAsInteger DimjAsInteger DimsAsInteger Fori=1Ton s=0 Forj=1Toi\2 IfiModj=0Thens=s+j Nextj Ifs=iThenPrinti&"是完数" Nexti EndSub 十一、水仙花数 定义: “水仙花数”是指一个三位数,其中各位数字的立方和等于该数本身(如153=13+53+33) 分析: 此题的关键是要知道如何分离出一个三位数中的各位数字。 例题: 找出100~999之间的所有“水仙花数”。 PrivateSubCommand1_Click() Fori=100To999 a=Int(i/100) b=Int((i-100*a)/10) c=i-Int(i/10)*10 Ifi=a^3+b^3+c^3Then Printi EndIf Nexti EndSub PrivateSubCommand1_Click() Forn=100To999 s=0 a=n DoWhilea<>0 b=aMod10 s=s+b*b*b a=a\10 Loop Ifs=nThenPrintn Nextn EndSub 十二、数列 以下数列: 1,1,2,3,5,8,13,21,…,的规律是从第3个数开始,每个数是它前面两个数之和。 PrivateSubCommand1_Click() Dima(50)AsLong DimfAsLong a (1)=1 a (2)=1 Fori=3ToVal(Text1.Text) f=a(i-2)+a(i-1) a(i)=f Next Text2.Text=f EndSub 以下数列: 1,1,3,5,9,15,25,41,…,的规律是从第3个数开始,每个数是它前面两个数的和加1。 PrivateSubCommand1_Click() DimfAsLong a (1)=1 a (2)=1 Fori=3ToVal(Text1.Text) f=a(i-2)+a(i-1)+1 a(i)=f Next Text2.Text=f EndSub 十三、排序 本算法主要应用于数组。 排序算法有种,其中“冒泡”排序法是较为常见的一种。 算法思想: 从数组的第一个元素开始,每一项(i)都与下一个元素(i+1)进行比较,如果下一个元素的值较小,就将这两项的位置交换,从而使值较小的数据项“升”到上面(最大数“沉底”),重复这种操作直到最后一个元素,然后再回到开始进行重复处理。 当整个数组不再出现交换项目时,排序结束。 例题: 数组a种有5个元素,每个元素值分别为10、8、21、7、5,用冒泡排序法进行排序。 Optionbaxxxxse1 PrivateSubCommand1_Click() arr1=Array(24153) Fori=5To2Step-1 Forj=1Toi-1 Ifarr1(j)>arr1(j+1)Then t=arr1(j) arr1(j)=arr1(j+1) arr1(j+1)=t EndIf Nextj Nexti Fori=1To5 Printarr1(i); Nexti EndSub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 常用 算法 总结