完整word版,vb常用算法介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

统计算法

相关文档
最新文档