完整word版,vb常用算法介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、累加算法
如果在设计过程中遇到求1+2+3+……+100等连加问题时,就可以用累加算法来解决。
累加算法的一般做法是设一个变量s,作为累加器使用,初值为0,设一个变量用来保存加数。一般在累加算法中的加数都是有规律可循,可结合循环程序来实现。一个循环程序的设计,如果以下三方面确定下来:变量的赋初值、循环体的内容、循环结束条件,那么根据循环语句的格式,就很容易写出相应的循环程序。
例:求1+2+3++100的累加和,并打印输出
分析:
设累加器S,初值为0,加数用变量I表示
当I=1时,累加器S= S+I = 0+1=1
当I=2时,累加器S= S+I =1+2= 3
当I=3时,累加器S=S+I =3+3 =6
当I=4时,累加器S=S+I =6+4 =10
……
当I=100时,累加器S=S+100=1+2+3+……+99+100=5050
不难看出,I的值从1变化到100的过程中,累加器均执行同一个操作:S=S+I,S=S+I 的操作执行了100次,所以该程序段可写成:
Dim I As Integer, S As Integer
S = 0 ‘给累加器s赋初值
For S = 1 To 100
S= S + I ‘I既作为循环变量,又作为加数
Next I
Print "1+2+……100="; S
考虑一下:语句Print "1+2+……100="; S可以放在循环体中吗?
延伸一下:
上述算法对数值型数据,执行的是累加操作,如果对字符串型数据,完成的是字符串的连接。
例:从键盘上输入一串字符,要求将其加密后显示在文本框Text1中,加密的方法是将每一个字符转变为它的后一位字符,如:A转变为B,1转变为2。
分析:
因为涉及对每一个字符做相应处理再连接成一个新串,所以可以用类似累加的算法。定义一个变量str1用来接收输入的原始字符串,变量str2用来接收加密后的字符串,初值为空串。可用Len()函数得出字符串的长度,用循环控制,从左向右逐个取字符,截取字符的功能可用函数Mid()完成,由于要做加密操作,可利用Asc()函数获得字符的Ascii码,用Chr()函数获得Ascii码对应的字符。
程序段如下:
Dim str1 As String, ch As String * 1
Dim i As Integer, str2 As String
str1 = InputBox("输入原始字符串:")
For i = 1 To Len(str1)
str2 = str2 + Chr(Asc(Mid(str1, i, 1)) + 1) ‘将加密后的字符连接成串
Next i
Text1.Text = str2
由此可以看出:对字符串的连接操作,可用累加算法来完成,不过在字符串的操作中,经常要用到字符串处理函数,所以一些常用的函数功能和用法必须掌握。
考虑一下:如果要实现字符的逆序连接,该怎么办?
二、连乘算法
连乘算法的一般做法是定义一个变量t,作为乘法器使用,初值为1,设一个变量用来保存乘数。
例:求10!=1*2*3*……*10的结果并打印输出
分析:
与累加算法类似,只不过加法变成乘法。
设乘法器t,初值为1,设变量I存放乘数。
当I=1时,T=T*I=1*1=1
当I=2时,T=T*I=1*2=2
当I=3时,T=T*I=2*3=6
……
当I=10时,T=T*I=1*2*3*……*9*10
所以当I的值从1变化到10的过程中,乘法器均执行同一个操作:S=S*I,程序段可写成:
Dim I As Integer, T As long
T= 1
For I = 1 To 10
T = T* I
Next I
Print "1*2*3*……*10=";T
例:求1!+2!+……+10!的值
分析:
这一题总体上是累加题,只不过加数不再是简单的1、2、3等,而是1!、2!到10!,可考虑设一个变量s作累加器,设一个变量t存放每一次的加数,累加的次数是10次,分别加上1!到10!。设循环变量i值从1变化到10,每一次循环执行一次累加操作,每次累加的加数t为i!,所以在每次累加之前,应先用连乘算法计算I!的值,可设循环控制变量j,按如下程序段完成求i!:
t = 1
For j = 1 To i
t = t * j
Next j
结合累加算法,求!+2!+……+10!的程序段如下:
Dim i As Integer, j As Integer
Dim s As Long, t As Long
s = 0
For i = 1 To 10
t = 1
For j = 1 To i
内循环
t = t * j
Next j
s = s + t
Next i
Print "1!+2!+……+10!="; s
程序执行流程是:I=1,计算t=1!,s=0+1!=1!
I=2,计算t=2!,s=1!+2!
I=3,计算t=3!,s=1!+2!+3!
……
I=10,计算t=10!,s=1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
考虑一下:
(1):语句t=1是否可以和s=0一样,放在外循环外?
(答案:不可以!循环初始化所放置的位置要牢记以下原则:外循环初始化应放在外循环的外面,内循环初始化应放在外循环体内,内循环体外。)
(2):变量s和t可以将其类型定义为Integer(整型)吗?
(答案:不可以!因为8!的值就已经超过整型所能表示的最大值32767,所以s和t必须定义成长整型(Long),否则会发生溢出。)
优化:
由于n!=(n-1)!*n,即2!=1!*2,3!=2!*3,……,10!=9!*10,所以上述程序段还可进行以下的优化:
Dim i As Integer, j As Integer
Dim s As Long, t As Long
s = 0
t = 1 ‘这时t=1不可放在循环体内
For i = 1 To 10
t = t * i
s = s + t
Next i
Print "1!+2!+……+10!="; s
执行流程为:
I=1,计算t=1*1=1!,s=0+1!=1!
I=2,计算t=1!*2=2!,s=1!+2!
I=3,计算t=2!*3=3!,s=1!+2!+3!
……
I=10,计算t=9!*10=10!,s=1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
归纳一下:
所有累加次数确定的累加程序都可以采用如下的编程模式:
定义累加器s,初值为0或根据情况赋一个特定值,设变量t存放加数,假设累加次数为n 次,则程序段可按如下框架编写:
s = 0
For i = 1 To n
将加数赋给t
s = s + t
Next I
统计算法