一、累加算法
如果在设计过程中遇到求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
统计算法
如果在编程时需要计算满足某一条件的量有多少个时,就可以采用统计算法。统计算法的一般做法是定义若干个变量用来作计数器,专门来统计满足相应条件的量,有多少个统计要求,就定义多少个计数器,在程序设计过程中,分别判断是否满足指定条件,若满足条件,则指定的计数器加1。如果计数器太多,而且相互之间有联系时,一般会定义一个计数器数组.
例:在文本框中输入一串字符,统计其中的字母、数字和其他字符的个数。
基本思路:
要统计满足指定要求的字符个数,应定义相应变量(如n)作为计数器,初值为0,每到符合条件的字符,将指定计数器的值加1。
本题需要定义3个计数器n1、n2、n3,初值为0,对字符串的字符逐个判断,如果是字母,n1加1,如果是数字,n2加1,否则n3加1
Private Sub Command1_Click()
Dim str As String, i As Integer, ch As String * 1
Dim n1 As Integer, n2 As Integer, n3 As Integer
n1 = 0: n2 = 0: n3 = 0: str = Text1。Text
For i = 1 To Len(str)
ch = Mid(str, i, 1)
If UCase(ch) 〈= "Z" And UCase(ch) >= ”A” Then
n1 = n1 + 1 ‘计数器n1加1
ElseIf ch 〉= ”0” And ch 〈= "9” Then
n2 = n2 + 1 ‘计数器n2加1
Else
n3 = n3 + 1 ‘计数器n3加1
End If
Next i
Text2 = “字母的个数为" & n1 & Chr(13) & Chr(10)
Text2= Text2 & “数字的个数为” & n2 & Chr(13) & Chr(10)
Text2= Text2 & “其他字符的个数为” & n3
End Sub
求最大值和最小值
在N个数中求最大值和最小值的思路是定义一个变量假设为max,用来存放最大值,定义一个变量假设为min,用来存放最小值。一般将第1个数赋给max和min,将剩下的每个数分别和max、min比较,如果比max大,将该数赋给max,如果比min小,将该数赋给min,即让max中总是放当前的最大数,让min中总是放当前的最小值,这样当所有数都比较完时,在max中放的就是最大数,在min中放的就是最小数。
例:随机产生20个1到100之间的整数,打印输出其最大值和最小值。
任何一个随机整数 x都可通过随机函数来产生,随机函数Rnd( )可产生在0到1之间均匀分布的随机数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论