完整版,vb常用算法介绍_第1页
完整版,vb常用算法介绍_第2页
完整版,vb常用算法介绍_第3页
完整版,vb常用算法介绍_第4页
完整版,vb常用算法介绍_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、累加算法如果在设计过程中遇到求1+2+3+100等连加问题时,就可以用累加算法来解决.累加算法的一般做法是设一个变量s,作为累加器使用,初值为 0,设一个变量用来保存加数.一般在累加算法中的加数都是有规律可循,可结合循环程序来实现.一个循环程序的设计,如果以下三方面确定下来:变量的赋初值、循环体的内容、循环结束条件,那么 根据循环语句的格式,就很容易写出相应的循环程序.例:求1+2+3+100的累加和,并打印输出分析:设累加器S,初值为0,加数用变量I表示当1=1时,累加器 S= S+I = 0+1=1当1=2时,累加器 S= S+I =1+2= 3当1=3时,累加器 S=S+I =3+3

2、 =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 IntegerS = 0 给累加器s赋初值For S = 1 To 100S= S + I I既作为循环变量,又作为加数Next IPrint 1+2+ 100=; S考虑一下:语句 Print 1+2+ 100=; S可以放在循环体中吗?延伸一下:上述算法对数值型数据,执行的是累加

3、操作,如果对字符串型数据,完成的是字符串的 连接.例:从键盘上输入一串字符,要求将其加密后显示在文本框Text1中,加密的方法是将每一个字符转变为它的后一位字符,如: A转变为B, 1转变为2.分析:由于涉及对每一个字符做相应处理再连接成一个新串,所以可以用类似累加的算法.定 义一个变量str1用来接收输入的原始字符串,变量str2用来接收加密后的字符串,初值为空串.可用Len()函数得出字符串的长度,用循环限制,从左向右逐个取字符,截取字符的功能可用函数Mid()完成,由于要做加密操作, 可利用Asc()函数获得字符的 Ascii码,用Chr() 函数获得Ascii码对应的字符.程序段如下:

4、Dim str1 As String, ch As String * 1Dim i As Integer, str2 As Stringstr1 = InputBox(输入原始字符串:)For i = 1 To Len(str1)str2 = str2 + Chr(Asc(Mid(str1, i, 1) + 1)将加密后的字符连接成串Next iText1.Text = str2由此可以看出:对字符串的连接操作,可用累加算法来完成,不过在字符串的操作中, 经常要用到字符串处理函数,所以一些常用的函数功能和用法必须掌握.考虑一下:如果要实现字符的逆序连接,该怎么办?二、连乘算法连乘算法的一般做法

5、是定义一个变量t,作为乘法器使用,初值为 1,设一个变量用来保存乘数.例:求10! =1*2*3*10的结果并打印输出分析:与累加算法类似,只不过加法变成乘法.设乘法器t,初值为1,设变量I存放乘数.当 1=1 时,T=T*I=1*1=1当 1=2 时,T=T*I=1*2=2当 1=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 longT= 1For I = 1 To 10T = T* INext IPrint 1*2*3*

6、 *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 = 1Forj = 1 To i t = t * jNext j结合累加算法,求!+2 ! +10!的程序段如下:Dim i As Integer, j As IntegerDim

7、s As Long, t As Longs = 0Fori = 1 To 10t = 1内循环Forj = 1 To i t = t * jNext js = s + tNext iPrint 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 一样,放在外循环外?答案:不可以!循环初始化所放置的位置要牢记以下原那么:外循环初始化应

8、放在外循环的外面,内循环初始化应放在外循环体内,内循环体外.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 IntegerDim s As Long, t As Longs = 0t = 1 这时t=1不可放在循环体内Fori = 1 To 10t = t * is = s + tNext iPr

9、int 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 = 0For i = 1 To n将加数赋给ts = s + tNext I统计算法如果在编程时需要

10、计算满足某一条件的量有多少个时,就可以采用统计算法.统计算法的一般做法是定义假设干个变量用来作计数器,专门来统计满足相应条件的量,有多少个统计要求,就定义多少个计数器,在程序设计过程中,分别判断是否满足指定条件,假设满足条件,那么指定的计数器加1.如果计数器太多,而且相互之间有联系时,一般会定义一个计数器数组.例:在文本框中输入一串字符,统计其中的字母、数字和其他字符的个数.根本思路:要统计满足指定要求的字符个数,应定义相应变量(如 n)作为计数器,初值为 0,每找到符合条件的字符,将指定计数器的值加1.此题需要定义3个计数器n1、n2、n3,初值为0,对字符串的字符逐个判断,如果是字母,n1

11、加1,如果是数字,n2加1,否那么n3加1Private Sub Command1_Click()Dim str As String, i As Integer, ch As String * 1Dim n1 As Integer, n2 As Integer, n3 As Integern1 = 0: n2 = 0: n3 = 0str = Text1.TextFor i = 1 To Len(str)ch = Mid(str, i, 1)If UCase(ch) = A Thenn1=n1 + 1计数器n1加1ElseIf ch = 0 And ch max Then max = xx m

12、in Then min = xNextiPrint最大值是 & maxPrint最小值是& minEnd Sub产生1到100间的随机数素数判断一个数如果只能被1和其本身整除,而不能被其他任何数整除,那么这个数就称为素数. 我们通过下面的例子来说明判断素数算法的根本思路.例:输入一个整数,判断它是否是素数,比方输入7,应输出“ 7是素数的提示,输入 24,应输出“24不是素数的提示.分析:由素数的定义,判断任一个整数n是否是素数的算法是让n分别整除从2到n-1(或n/2、sqr(n)中的每一个数,如果有一个数能被 n整除,那么n不是素数,如果所有的数都不能被 n整除,那么n是素数.这也是一个典

13、型的循环程序,可设一个循环变量为I,让I从2变化到n-1,如果有一个I能被n整除,说明n不是素数,下面就不用再进行判断,提前跳出循 环;如果所有的I都不能被n整除,最后正常结束循环.关键是如何知道跳出循环后是提前跳出还是正常退出?对于这种有两种判断结果的处理, 一般采用标志变量.设一个变量,假设命名为Flag,让Flag的初值为True,如果提前跳出循环,Flag的值赋为False,跳出循环后可根据Flag的值判断是提前跳出还是正常结束.程序如下:Private Sub Command1_Click()Dim i As Integer, n As IntegerDim flag As Bool

14、eanflag = True给标志变量赋初值n = Val(Text1.Text)For i = 2 To n - 1If n Mod i = 0 Thenflag = False 如果I能被n整除,将flag赋值为FalseExit ForEnd IfNext iIf flag = True Then 该条件也可写成 If flag ThenMsgBox n & 是素数ElseMsgBox n & 不是素数End IfEnd Sub另一种方法:还可以在循环结束后通过循环限制变量的值来进行素数的判断.如果是素数,循环将正常结束,循环限制变量将超过终值;如果不是素数,肯定有一个数能够被n整除,循

15、环会提前结束,循环限制变量小于等于终值.程序如下:Private Sub Command1_Click()Dim i As Integer, n As Integern = Val(Text1.Text)For i = 2 To n - 1If n Mod i = 0 Then Exit ForNext iIf i = n Then该条件也可写成 If flag ThenMsgBox n & 是素数ElseMsgBox n & 不是素数End IfEnd Sub求最大公约数求任意两个正整数的最大公约数可用辗转相除法来求.假设要求任两个整数m和n的最大公约数,用辗转相除法的步骤是:求m和n的余数

16、r,将n的值作为m的新值,将r的值作为n的新值,再不断的求新的m和n的余数r,直到r的值等于0为止,这时m的值就是要求的最大公约数.注意:由于循环程序次数不确定,应采用 do-loop循环结构.例:在两个文本框 Textl和Text2中分别输入两个正整数,单击命令按钮Command侑在窗体上输出其最大公约数.程序如下:Private Sub Command1_Click()Dim m As Integer, n As IntegerDim r As Integer定义存放余数的变量rm = Val(Textl.Text)n = Val(Text2.Text)Print m; 和;n; 的最大公

17、约数为;Dor = m Mod nm = nn = rLoop Until r = 0Print mEnd Sub 考虑一下:可以将第一条 print语句放在执行循环以后吗?(答案:不可以.由于执行完循环后m和n已经不是原来的数值了)将以上程序添加相应语句就可完成求最小公倍数的功能(M和n的最小公倍数等于 m*n/m和n的最大公约数).程序如下:Private Sub Command1_Click()Dim m As Integer, n As IntegerDim r As IntegerDim t As Integerm = Val(Text1.Text)n = Val(Text2.Tex

18、t)t = m * n 记录 m*n的初始值Print m; 和;n;的最大公约数为;Dor = m Mod n m = n n = rLoop Until r = 0Print m;,最小公倍数为;t / mEnd Sub穷举算法穷举法是循环程序中具有代表性的根本应用之一.穷举是一种重复型算法.它的根本思想是对问题的所有可能状态都一一测试,直到找到答案或将全部可能状态都测试过为止.循环限制有两种方法:计数法和标志法.计数法用于循环次数确定的情况下,一般用 For-Next循环比较方便;标志法用于循环次数未知情况,表示到达某一目标后使循环结束.例:搬砖问题:36块砖,36人搬,男搬4,女搬3,

19、两个小孩搬一砖,要求一次全搬完,问男、女和小孩各有多少个?分析:假设男人用变量 man表示,女人用wome俵示,小孩用children 表示,有以下式子成立:men+women+children=364*men+3*women+children/2=36如果用算术来解方程,可以看出这是一个典型的不定方程,可能有多个解.穷举法的算法思想是将所有可能的情况全部列出来,逐一进行测试.由条件可知:男人(men)的可能取值范围为:08女人(women)的可能取值范围为:011可利用双重循环实现对所有可能的男人men和女人women的值进行选择children=36-men-women如果满足4*men+

20、3*women+children/2=36那么表示找到一个合理的解.Private Sub Form_Click()Dim men As Integer, women As IntegerDim children As IntegerFor men=0 To 8men取所有可能的值For women=0 To 11womens 所有可能的值children=36-men women 算出 children 的人数If 4*men+3*women+children/2=36 ThenPrint 男人有:;men; 人Print 女人有:;women; 人Print 小孩有:;children;

21、人End IfNext womenNext menEnd Sub精确迭代算法迭代是一个不断用新值取代旧值或用旧值推出新值的过程.迭代算法的程序编制时要从三方面着手:确定迭代公式(也就是循环体的内容)、公式 的初始化以及迭代的终止条件.如果每次迭代都可以得到精确值,并且迭代的次数确定,这就是精确迭代算法.例:兔子繁殖问题:意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开始它们每个月都生一对兔子.按此规律,并假设没有兔子死亡,一年后共有多少对兔子.可以发现每月的兔子数组成如下数列:1,1,2,3,5,8,13,21,34,打印数列的前20项,且一行输出5个对数列1

22、,1,2,3,5,8,13,21,34,可看出:数列从第3项开始,每1项都是其前2项之和.假设第1项元素用f1表示,第2项元素用f2表示,每次新元素用f表示f1f2f第 3 月11f=f1+f2=2第 4 月12f=f1+f2=3第 5 月23f=f1+f2=5第 6 月35f=f1+f2=8 f1和f2初值为1f=f1+f2f1=f2f2=f可以看出:每1个月的兔子数f要由前面的兔子数f1和f2推出,并在求下1个月的兔子数之前 要用新值对f1和f2的值进行更新.这就是迭代算法.如果迭代的次数确定,可以得到一个确定的值,这样的迭代称为精确迭代.程序如下:Private Sub Form_cli

23、ck()Dim fl As Integer, f2 As IntegerDim i As Integer , f As Integerfl = 1: f2 = 1给fl和f2赋初值Print f1; f2;For i = 3 To 20f = f1 + f2f1 = f2f2 = fPrint f;输出每月的兔子数If i Mod 5 = 0 Then Print限制每行输 5 个Next iEnd Sub近似迭代算法一元高次方程的求解没有通用的求根公式,常用迭代法来求方程的近似根.迭代法求方程f(x)=0的根是将其改写为:x=小(X)选取适当的初值x0,便可通过重复迭代构造序列:x0,x1,

24、x2,xn,假设该数列收敛,那么极限值就是方程的一个解.牛顿迭代法和二分迭代法都是对一元高次方程求解的近似方法.(1)、牛顿迭代法牛顿迭代法求f(x)=0的根是在根的附近找一个初值作为x0,过x0做方程的切线,与x轴的交点为x1 ,再过x1作切线,交x轴于点x2, .可以知道,只要给定一个初始值x,通过以上操作,可不断的得到新的值 x,并且x无限的接近函数在 x轴的交点,即方程的根. 所以经过假设干次迭代后,可得到方程较高精度的近似根.牛顿切线法迭代公式为xi+1 = xi f(x i)/ f (x i )其中:f(xi)是f(x i)的导数,当|xi+1-xi|V&或|f(x i)| &时,

25、x+1就作为方程的近似 根.例:编写程序,利用牛顿迭代法求方程xex -1=0在x=0.5附近的一个根,要求精确到10-7算法分析:1、循环初值x=0.52、 迭代公式x = x-(xe x-1)/(xe x+ex)(循环体的内容)3、 结束条件:| xe x-1|10 -7程序如下:Private Sub Command1_Click()Dim x As Single, Eps As Singlex=InputBox(输入初始值x:, 牛顿迭代法)Eps=InputBox(输入允许误差Eps,牛顿迭代法)Dox =x-(x*Exp(x)-1)/(Exp(x)*x+Exp(x)Loop Unt

26、il Abs(x*Exp(x)-1)=EpsText1.Text=Str(x)End Sub(2)、二分迭代法算法例:设计一个用二分法求方程x3-x 4+4x2-1=0在区间0 , 1上的一个实根.算法思路:假设方程f(x)=0在区间a,b上有一个实根,那么f(a)与f(b) 一定异号.二分法的思想是在 区间a,b上取中点c=(a+b)/2 ,假设f(a)*f(c)0 ,那么实根在区间c,b中,将c赋给a;构成新区间a,b,再取中点c,继续做 如上操作,直到|a-b|的值小于给定的误差精度值,这时 a或b就是方程的根.程序如下:Private Sub Form_click()Dim a As

27、Single,b As Single,c As Single,e As Singlee = InputBox(请输入误差精度)a = 0: b = 1Print在误差 & e & 范围内,方程在0,1上的根为:;Doc = (a + b) / 2If (aA3 -aA4+4*aA2-1)*(cA3-cA4+4*cA2-1)0 Thenb = cElsea = cEnd IfLoop Until Abs(a - b) 0r = m Mod 2求余数m = m 2Loopstr ,利用字符串连接符进行(2)、要将余数逆序连接成二进制数,可定义一个字符串变量 连接.str = r & str程序如下

28、:Private Sub Command1_Click()Dim m As Integer, str As String, r As Integerm = Val(Text1.Text)Do While m 0r = m Mod 2 str = r & str m = m 2LoopText2.Text = strEnd SubPrivate Sub Command2_Click()EndEnd Sub2、把任意一个十进制正整数转换成8进制数程序如下:Private Sub Command1_Click()Dim m As Integer, str As String, r As Intege

29、rm = Val(Text1.Text)Do While m 0r =m Mod 8str=r & strm=m 8LoopText2.Text = strEnd SubPrivate Sub Command2_Click()EndEnd Sub3、把任意一个十进制正整数转换成16进制数可以看出:将十进制数转换为十六进制数时,由于余数r可能超过10,所以对超过10的余数要进行转换.转换的对应关系为:101112131415A(65)B(66)C(67)D(68)E(69)F(70)对应的字符为:chr(r+55)程序如下:Private Sub Command1_Click()Dim m As Integer, str As String, r As Integer m = Val(Text1.Text)Do While m 0r = m Mod 16If r = A And

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论