第8章 程序VB循环结构程序设计ppt课件.ppt

上传人:小飞机 文档编号:1430283 上传时间:2022-11-23 格式:PPT 页数:97 大小:264.50KB
返回 下载 相关 举报
第8章 程序VB循环结构程序设计ppt课件.ppt_第1页
第1页 / 共97页
第8章 程序VB循环结构程序设计ppt课件.ppt_第2页
第2页 / 共97页
第8章 程序VB循环结构程序设计ppt课件.ppt_第3页
第3页 / 共97页
第8章 程序VB循环结构程序设计ppt课件.ppt_第4页
第4页 / 共97页
第8章 程序VB循环结构程序设计ppt课件.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《第8章 程序VB循环结构程序设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《第8章 程序VB循环结构程序设计ppt课件.ppt(97页珍藏版)》请在三一办公上搜索。

1、第8章 循环结构程序设计,学习重点,ForNext语句、DoLoop语句、WhileWend语句、GoTo语句。循环语句的嵌套使用。掌握常用的循环结构算法。,本章内容,8.1 ForNext语句8.2 DoLoop语句8.3 WhileWend语句8.4 GoTo语句8.5 循环嵌套8.6 常用算法及实例本章小结,引言,循环:重复进行某些相同或相近的操作 循环结构语句 : 程序自动重复执行代码段。 Visual Basic中的循环结构语句: ForNext语句 DoLoop语句 WhileWend语句,8.1 ForNext语句,ForNext语句(也称步长循环语句) ,常用于在循环开始前能确

2、定循环执行次数的情况。ForNext语句格式如下:For 循环变量=初值 To 终值 Step 步长 语句块 Exit For 语句块Next循环变量功能:以指定次数来重复执行一组语句。,示例代码 :Dim i As IntegerFor i=1 To 10 Step 1 Print i ;Next i执行以上代码将在窗体上输出结果如下:1 2 3 4 5 6 7 8 9 10,For 循环变量=初值 To 终值 Step 步长 语句块 Exit For 语句块Next循环变量,关于循环的几个概念:,循环变量又称为“循环控制变量”、“控制变量”或“循环计数器”,是用做循环计数器的数值变量。这个

3、变量必须为数值型变量,不能是逻辑型数据或数组元素。 循环体 被重复执行的代码段。循环次数循环体被重复执行的次数。循环次数必须是有限的,否则称程序陷入“死循环”,Dim i As IntegerFor i=1 To 10 Step 1 Print i ;Next i,说明:上述代码中整型变量i是循环变量。 初值、终值和步长也必须是数值表达式。步长可以是正数或负数,仅当步长为1时,“Step 步长”可以省略。当步长是正数或零时,要求循环变量小于或等于终值;当步长是负数时,要求循环变量大于或等于终值。若不符合以上情况时,不能进入循环执行语句块。在上述代码中循环变量i的初值是1,终值是10,步长是1。

4、,Dim i As IntegerFor i=1 To 10 Step 1 Print i ;Next i,For和Next中间的语句段称为循环体。在上述代码中循环体仅有一条语句构成。可以在循环体中任何位置放置任意个Exit For语句,随时退出循环。Exit For经常在条件判断之后使用,如IfThen语句之后,并将控制权转移到紧接在Next之后的语句。如将上述代码改为 Dim i As Integer For i=1 To 10 Step 1 Print i ; If i5 Then Exit For Next i 程序的输出就变为1 2 3 4 5。,8.1 ForNext语句,ForN

5、ext语句执行过程: 首先计算初值、终值和步长表达式的值,并将它们都转换成与循环变量相同的类型。 将计算好的初值表达式的值赋给循环变量,作为循环变量的初值,注意循环变量仅被赋初值一次。 进行判别:判断循环变量的值是否超过终值,即当步长0(步长为正数)时,判别循环变量终值否;当步长0(步长为负数)时,判别循环变量终值否,如果未超过,则进入执行循环体;如果超过了,则正常退出结束循环,去执行Next语句的下一语句。 执行Next语句,使循环变量增加一个步长,即执行循环变量=循环变量+步长;返回步骤继续进行判别。,图8-1 ForNext语句程序流程图,Dim i As IntegerFor i=1

6、To 10 Step 1 Print i ;Next i,上述代码中循环变量的初值是1,以后每次执行到For语句时判断i=10是否成立,成立则执行循环体中的语句,即输出变量i当前的值,否则结束循环,每次执行到Next语句时将循环变量i的值自增1。因此,循环变量i的值从1一直变化到10,并将这些值输出。最后一次执行过Next语句后,变量i的值是11,因为超出终值而结束循环。一般地,若循环体中不出现类似于Exit For和Exit Sub之类的强制跳转语句时,结束For循环时循环变量的值肯定超过了终值。,8.1 ForNext语句,循环次数的一般计算公式如下:循环次数=Int(Abs(终值-初值)

7、/步长)+1注意,若循环变量在循环体内被重新赋值,则会影响和改变循环次数。示例代码如下: For i=1 to 100 i=i+1Next i 以上循环体中i的值自增了1,而语句Next i还将使i的值增加1,因此在进入后一次循环时i的值比前一次进入循环时共增加了2,因此循环也就执行了50次。,8.1 ForNext语句,注意:初值、终值和步长值仅在步骤中计算,在循环体内对这三个值所涉及的变量进行值的更改,都不会改变循环进行中的初值、终值和步长值,当然也不会影响循环次数。 以下3段代码中的循环执行次数均为 Int(20-1)/2)+1=10次。,8.1 ForNext语句,格式中Next后面的

8、循环变量有时被省略,但不推荐这样使用。如果省略,则由系统自己去识别该Next对应的循环变量,并对它进行相应的步长运算。如以下代码也是正确的。 For i=1 To 10 Step 1 Print i ; Next 省略循环变量,ForNext举例,例8-1 求1+2+3+100 Private Sub Command1_Click() Dim i As Integer, sum As Integer sum=0 变量sum清零 For i=1 To 100 sum=sum + i 累加 Next I Print sumEnd Sub 本题输出结果是5050。思考:如何实现n!=123n?,Fo

9、rNext举例,例8-2 输出1200间所有能被3整除的数,要求每行输出10个数。,第1种方法实现如下:Private Sub Command1_Click() Dim x As Integer, n As Integer For x=1 To 200 If x Mod 3=0 Then Print x; n=n + 1 If n Mod 10=0 Then Print End If Next x PrintEnd Sub,第2种方法实现如下:Private Sub Command2_Click() Dim x As Integer, n As Integer For x=3 To 200 S

10、tep 3 Print x; n=n + 1 If n Mod 10=0 Then Print Next x PrintEnd Sub,8.2 DoLoop语句,8.2.1 当型循环 8.2.2 直到型循环,8.2.1 当型循环,当型DoLoop语句格式如下: Do While 循环条件 语句块 Exit Do 语句块Loop 或 Do 语句块 Exit Do 语句块Loop While 循环条件 功能:当循环条件为True时,重复执行语句块中的命令。,8.2.1 当型循环,如用以下代码也可以在窗体上输出1 2 3 4 5 6 7 8 9 10。 Dim i As Integer i=1 Do

11、 While i = 10 Print i; i=i + 1 Loop,Dim i As Integer i=1 Do Print i; i=i + 1 Loop While i = 10,8.2.1 当型循环,说明:(1)“循环条件”通常是一个关系或逻辑表达式,其值为True或False。(2)Do和Loop间的语句块是循环体,当循环条件为True时,重复执行循环体,当循环条件为False时,结束循环,转入Loop后的语句执行。,8.2.1 当型循环,说明:(3)两种格式的当型DoLoop语句对应的流程图如图8-2所示,两者的区别是:图8-2(a)表示每一次进入循环,总是先判断循环条件是否为

12、“True”,然后再决定是否进入执行循环体语句;而图8-2(b)先执行一次循环体语句,再判别循环条件是否为真“True”,以决定是否再次执行循环体。即图8-2(a)的循环形式有可能一次也没执行循环体语句,而图8-2(b)中不管循环条件是否为真,至少执行一次循环体语句。但一旦图8-2(a)进入循环,其循环次数和对应的图8-2(b)循环次数相等。,(a)Do WhileLoop结构流程图 (b)DoLoop While结构流程图,8.2.1 当型循环,说明:(4)DoLoop语句中可以在任何位置放置任意个数的Exit Do语句,随时跳出DoLoop循环。 Exit Do只能用于DoLoop语句中,

13、通常用于条件判断之后。如以下代码中没有设置循环条件,而采用在循环体中有条件的跳出来设置循环终止条件。 Dim i As Integer i=1 Do Print i; i=i + 1 If i 10 Then Exit Do Loop,8.2.1 当型循环,说明:(5)为了使循环语句在有限的时间内执行完毕,在循环体中至少要有一条语句使得循环条件趋向于假“False”或用Exit Do语句终止循环,否则程序将无休止的执行循环体,直至耗尽系统资源,我们称这种现象为“死循环”。 提示 当程序进入“死循环”或长时间执行某过程时,用户可以使用Ctrl+Break键强行中断程序的运行,将程序从运行状态改为

14、设计状态,并释放程序运行中的临时资源。,8.2.1 当型循环,说明:(6)可以将ForNext语句改写成DoLoop语句,但仅有已知循环次数的DoLoop语句才可以改写成ForNext语句。在ForNext语句中,格式中包含了对循环变量的赋初值、设置循环进行的条件及循环变量按步长变化等操作,这些在DoLoop语句中都需要编程人员一一考虑并用语句设置。,8.2.1 当型循环,例8-3 验证谷角猜想。对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。 分析:由于不能确定要多少步才能结束运算,因此本题中采用当型DoLoop

15、循环语句实现。使用变量n存放该正整数,每次重新计算出的新值仍然存放在n中。当n未达到1时继续执行运算,当n等于1时结束循环。,例8-3,代码:,Private Sub Command1_Click() Dim n As Integer Cls 清屏 n=Val(InputBox(请输入一个正整数) Print n; If n 0 Then Do While n 1 If n Mod 2=1 Then n=n * 3 + 1 Else n=n / 2 End If Print -; n; Loop End IfEnd Sub,8.2.2 直到型循环,直到型 DoLoop语句格式如下: Do Un

16、til 循环条件 语句块 Exit Do 语句块Loop 或 Do 语句块 Exit Do 语句块Loop Until 循环条件 功能:当循环条件为False时,重复执行语句块中的命令;当循环条件为True时,结束循环。,8.2.2 直到型循环,如用以下代码也可以在窗体上输出1 2 3 4 5 6 7 8 9 10。 Dim i As Integer i=1 Do Until i 10 Print i; i=i + 1 Loop,Dim i As Integer i=1 Do Print i; i=i + 1 Loop Until i 10,8.2.2 直到型循环,说明 :(1)直到型DoLo

17、op语句也有两种形式。,(a)Do UntilLoop结构流程图 (b)DoLoop Until结构流程图,8.2.2 直到型循环,说明 :(2)直到型DoLoop语句格式中的组成和当型DoLoop语句格式基本一致,两者的区别是两者的循环条件正好相反。 大部分当型DoLoop语句都可以改写成直到型DoLoop语句。如将例8-3中的Do While n 1 改成Do Until n=1,程序功能完全一致。,例8-4,例8-4 随机产生n个随机整数,并求它们的平均值,n由用户输入。 分析:用户输入信息的有效性过滤:使用整型变量n接收用户输入的数据,可以过滤掉非数值字符串 采用Fix函数进行取整可以

18、将用户输入的实数类型数据转换为整数 使用一个DoLoop循环对负数进行过滤,并由用户选择是否继续输入,例8-4,Private Sub Form_Click() Dim n As Integer, x As Integer, i As Integer, sum As Integer n=Fix(Val(InputBox(请输入数据个数) 舍去取整 Do Until n 0 If MsgBox(输入错误,需要重新输入吗?, vbYesNo)=vbYes Then n=Fix(Val(InputBox(请输入数据个数) Else Exit Sub 结束本事件过程 End If Loop,实现数据n

19、的输入,例8-4,sum=0 累加器sum清零 For i=1 To n x=Int(Rnd * 100) sum=sum + x Print x; If i Mod 10=0 Then Print 每行输出5个数据 Next i Print Print n; 个数的平均值=; sum / nEnd Sub,功能实现求n个数的平均值,8.3 WhileWend语句,语句格式:While 循环条件 循环体Wend,在窗体上输出1 2 3 4 5 6 7 8 9 10。Dim i As Integeri=1While i = 10 Print i; i=i + 1Wend,这种结构使用完全类似于当

20、型DoLoop循环语句的格式1,8.4 GoTo语句,语句格式如下:GoTo 标签其中标签无需定义,是在一行语句的开头用冒号和语句隔开的标识符。 说明:(1)GoTo语句是一个无条件转支语句,通常和分支语句配合使用。,Private Sub Form_Click() Dim x As Integer x = Val(InputBox(请输入一个正整数) If x 0 Then GoTo L1 Print xL1: End Sub,程序功能:只输出用户输入的正整数,8.4 GoTo语句,(2)使用GoTo语句可以构造出一个具有循环功能的结构 。在窗体上以紧凑格式输出数值110。 Dim i As

21、 Integer i = 1A: Print i; i = i + 1If i = 10 Then GoTo A执行以上程序段后i的值是11。,8.4 GoTo语句,(3)在循环语句中使用GoTo语句,既可以从循环内部跳转到循环外部语句,也可以从循环外部语句跳转到循环内部语句,但要注意由此产生的循环执行过程的变化。 如:Dim i As Integer For i=1 To 10B: Print i; Next i If i = 11 Then GoTo B以紧凑格式输出数值111,不恰当的GoTo语句将使程序陷入死循环 C: For i = 1 To 9 Print * If i 5 The

22、n GoTo C Next i,8.4 GoTo语句,(4)结构化程序设计中并不建议使用GoTo语句来控制程序流程,因为它会使程序流程复杂化。,8.5 循 环 嵌 套,循环嵌套是指在某个循环的循环体中又包含着另一个完整的循环。,8.5 循 环 嵌 套,说明:(1)嵌套的层数没有具体限制,但内层的小循环一定要完整地被包含在外层的大循环之内,而不得相互交叉。 以下两种结构中语句之间存在着交叉,是不正确的:,8.5 循 环 嵌 套,(2)对有循环控制变量的循环进行嵌套时,要注意循环嵌套后对改变循环变量的值是否影响循环次数等。(3)循环嵌套的层次数不能太多,要考虑实际语句的执行次数。一般的,在内层循环

23、体中的语句执行次数=每次内层循环次数外层循环次数。(4)若有多层ForNext语句嵌套,且各自的Next语句在连续位置上,则可将多条Next语句合并成一条语句,格式是Next内层循环变量,外层循环变量,以下代码是正确的。For a=1 to 5For b=1 to 5For c=1 to 5 Next c,b,a 等价于三条语句 Next c : Next b : Next a,程序举例,例8-5 如有以下程序代码: i=1 Do While i = 10 s=1 For i=1 To i s=s * i Next i Print i; !=; s i=i + 1 Loop 程序的本意是要分别

24、输出110的阶乘,但程序的输出如图所示,除了输出的行数不符外,我们还发现每行上求的值也不符合。,例8-5,分析其原因发现,内层循环对变量i的变化影响了外层循环的正常执行。解决的方法是每一个循环使用一个唯一的循环控制变量(不同名)。修改代码:,Dim i As Integer, s As Double i=1 Do While i = 10 s=1 For j=1 To i s=s * j Next j Print i; !=; s i=i + 1 Loop,程序举例,例8-6 输出九九乘法表,Private Sub Form_Activate() Dim i As Integer, j As

25、Integer For i=1 To 9 For j=1 To 9 Picture1.Print Tab(10 * (j - 1); CStr(i); *; CStr(j); =; CStr(i * j); Next j Picture1.Print Next i End Sub,思考:如何输出只有下三角区域的九九乘法表?,8.6 常用算法及实例,8.6.1 累加(乘)8.6.2 求最值8.6.3 穷举法8.6.4 递推法(迭代法)8.6.5 字符串遍历8.6.6 有限状态自动机8.6.7 进制转换8.6.8 图形字符的打印,8.6.1 累加(乘),累加(乘)是指在某个值的基础上一次又一次的加

26、上(乘以)一些数 。累加(乘)的结果是运算最终的目标,通常只需使用一个变量来存放在各次运算结果,称这样的变量为累加(乘)器。,1累加,2累乘,1累加,算法描述如下。步骤1:给累加器变量sum赋初值为0,给计数器i赋初值为0。步骤2:计数器加1,即i+1i。步骤3:计算ai。步骤4:ai+sumsum。步骤5:ai是否是最后一项,若是则转步骤6,否则转步骤2。步骤6:输出累加器变量sum的值。,1累加,程序模式:(1)若已知i的取值范围是1k,则用以下语句组合来计算累加和sum。sum=0For i=1 to k sum=sum +aiNext i(2)若已知最后一项的取值要求,则用以下语句组合

27、来计算累加和sum。sum=0 :i=1Do While ai满足条件 或Do Until ai不满足条件 sum=sum +ai i=i + 1Loop,2累乘,算法描述与累加相似,主要区别在于:(1)累乘器的初值赋为1(2)使用sum=sum *ai进行累乘运算。同样的,也可以总结出类似的累乘程序模式加以运用。,程序举例,例8-7 正弦函数可表示为使用该公式求sinx的近似解,直到累加项的绝对值小于10-6为止。,分析:这是一个累加问题,使用累加模式实现。其中,通项中分子是个阶乘,需要使用累乘模式实现。,例8-7,Private Sub Cmdcul_Click() Dim x As Si

28、ngle, i As Integer, j As Integer Dim sum As Single, t As Single, f As Single x=Val(txtX.Text) i=1 Do f=1 求2i-1的阶乘,放入变量f中 For j=1 To 2 * i - 1 f=f * j Next j t=(-1) (i - 1) * x (2 * i - 1) / f 通项t的计算 sum=sum + t 累加 i=i + 1 Loop Until Abs(t) 10 (-6) txtResult.Text=Format(sum, 0.00000)End Sub,多项式法,8.6.

29、2 求最值,最值问题一般表现为求n个数中的最大(小)值。算法描述如下。步骤1:给存放最大(小)值的变量赋初值。步骤2:取n个数中的一个数和最大(小)值变量比较,若大于最大值变量(小于最小值变量),则将该数赋值给最大(小)值变量。步骤3:重复步骤2,直至所有数都比较完成。,程序举例,例8-8 使用随机函数生成30个学生的数学成绩,并求其中的最高分。 分析:百分制分数的范围是0100,设最大值变量max的初值为0,以保证在第1次数据比较时就能使max等于第一个数。,例8-8,Private Sub Form_Click() Dim grade As Integer, i As Integer, m

30、ax As Integer Print 30个学生的数学成绩是: max=0 设置最大值为一个相对小的数 For i=1 To 30 grad=Int(101 * Rnd) 随机生成百分制成绩 Print grad; If i Mod 10=0 Then Print If grad max Then max=grad Next i Print 最高分是; maxEnd Sub,例8-8,这种对max赋初值的方法在有些场合并不适用,为了能确保max中只存放真实数据中的一个,我们可以将第1个数据作为初值赋给max,然后从第2个数开始和max比较。,改进:Private Sub Form_Click

31、() Dim grade As Integer, i As Integer, max As Integer Print 30个学生的数学成绩是: grad=Int(101 * Rnd) 生成第一个成绩 Print grad; max=grad 设置最大值为第1个数 For i=2 To 30 从第2个数开始比较 grad=Int(101 * Rnd) Print grad; If i Mod 10=0 Then Print If grad max Then max=grad Next i Print 最高分是; maxEnd Sub,8.6.3 穷举法,穷举法主要通过将可能出现解的范围中所有的

32、数一一进行判断。搜索范围的确定是穷举法的关键,一旦确定了范围,使用常规的循环语句即可解决问题。1组合问题 2素数问题,1组合问题,组合问题一般体现在要求符合条件的所有组合情况,此类问题的关键是要按一定的顺序进行穷举,避免遗漏。 例8-9 求由数字0、1、2、3、4组成的所有无重复数字的3位正整数。 分析:分别对3位数的3个位数字进行穷举,其中百位数字不能为0。使用三重循环来实现,,例8-9,Private Sub Form_Click() Dim a As Integer, b As Integer, c As Integer, n As Integer For a=1 To 4 For b=

33、0 To 4 For c=0 To 4 If a b And b c And a c Then Print a * 100 + b * 10 + c; n=n + 1 If n Mod 5=0 Then Print End If Next c Next b Next aEnd Sub,2素数问题,素数即质数,是指除了能被1和自身整除而不能被其他任何数整除的数。例8-10 判断整数x是否是素数。根据素数的定义,只需用2到n-1去除n,如果都除不尽则n是素数,否则,只要其中有一个数能除尽则n不是素数。也可以理解为,在2到n-1中寻找n的因子,若找不到则n是素数,否则n不是素数。,例8-10,Pri

34、vate Sub Command1_Click() Dim x As Integer, i As Integer x=Val(Text1) If x 1 Then For i=2 To x - 1 If x Mod i=0 Then Exit For 判断x是否能被i整除,即i是否是x的因子 Next i If i=x Then MsgBox x & 是素数 Else MsgBox x & 不是素数 End If Else MsgBox x必须大于1 End IfEnd Sub,例8-10,改进:将搜索范围缩小到2, 之间,k=Sqr(x) 这里进行自动转换,等价于四舍五入取整 For i=2

35、 To k If x Mod i=0 Then Exit For Next i If i k Then MsgBox x & 是素数 Else MsgBox x & 不是素数 End If,例8-11,例8-11 从键盘上输入一个正整数,找出大于或等于该数的第一个素数。,x=Val(Text1) If x 1 Then Do For i=2 To Sqr(x) If x Mod i=0 Then Exit For Next i If i Round(Sqr(x) Then Exit Do Else x=x + 1 End If Loop Label2.Caption=“=x的第一个素数是: &

36、 x Else MsgBox x必须大于1 End If,8.6.4 递推法(迭代法),使用递推法来解决的问题中,前一个状态和后一个状态间存在着一定的函数关系。递推法的关键在于找到正确的函数关系,然后使用循环语句来实现。1最大公约数和最小公倍数 2Fibonacci数列 3累加中的递推 4迭代法求方程的近似根,1最大公约数和最小公倍数,若已知整数x和y的最大公约数是k,则它们的最小公倍数是xy/k。 求两个整数最大公约数的两种方法。 (1)辗转相除法(欧几里德算法) (2)相减法,1最大公约数和最小公倍数,(1)辗转相除法(欧几里德算法)递推公式如下:,算法描述如下:步骤1:输入两个自然数x、

37、y,令x=y。步骤2:求x除以y的余数r。步骤3:yx,ry。步骤4:若r0,则转步骤2,否则转步骤5。步骤5:输出x。,1最大公约数和最小公倍数,(2)相减法。递推公式如下:,两个数中从大数中减去小数,所得的差若与小数相等,则该数为最大公约数。若不等,对所得的差和小数,继续从大数中减去小数,直到两个数相等为止。,程序举例,例8-12 用欧几里德算法求x和y的最大公约数。,If x 0 Text3.Text=CStr(x) 输出最大公约数,2Fibonacci数列,兔子繁殖问题:如果每对兔子每月繁殖一对子兔,而子兔在出生后第2个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子? 可以这样思考:

38、第1个月后即第2个月时,一对兔子变成了两对兔子,其中一对是它本身,另一对是它生下的幼兔。第3个月时两对兔子变成了三对,其中一对是最初的一对,另一对是它刚生下来的幼兔,第三对是幼兔长成的大兔子。第4个月时,三对兔子变成了五对,第5个月时,五对兔子变成了八对,按此方法推算,第6个月是13对兔子,第7个月是21对兔子,2Fibonacci数列,裴波那契得到一个数列,人们将这个数列前面加上一项1,成为“裴波那契数列”,即1,1,2,3,5,8,13。该数列的特点是从数列的第3项开始,每一项都等于前两项之和,用公式表示如下。,算法描述如下 :步骤1:将x1和x2的初值赋为1。步骤2:若x1符合条件,则输

39、出x1;若不符合,则程序结束。步骤3:x1t;x1+x2x1;tx2。步骤4:转步骤2。,程序举例,例8-13 输出100以内的Fibonacci数列。 Private Sub Form_Click() Dim x1 As Integer, x2 As Integer, t As Integer x1=1: x2=1 Print x2; Do While x1 = 100 Print x1; t=x1 x1=x1 + x2 x2=t LoopEnd Sub,3累加中的递推,在累加(乘)算法中,若ai序列的前后项之间存在数学关系(ai=f(ai-1))时,累加(乘)运算也可采用递推法来实现,这种

40、递推也称为迭代法。使用迭代法求累加(乘)中通项ai时,可以避免每次都重新开始计算ai,大大提高程序的效率。,程序举例,例8-14 用递推法求解,例8-14,参考代码如下:Private Sub Cmdcul_Click() Dim x As Single, i As Integer Dim sum As Single, t As Single x=Val(txtX.Text) i=1: t=x: sum=x 第1项的处理 Do t=t * (-1) * x * x / (2 * i * (2 * i + 1) 通项t的递推 sum=sum + t i=i + 1 Loop Until Abs(

41、t) 10 (-6) txtResult.Text=Format(sum, 0.00000)End Sub,4迭代法求方程的近似根,主要思想是从某个初值x0开始,根据迭代公式逐次产生更接近于真实解的x1,x2,直到某个x在一定精度下非常接近真实解,这个x就是解的近似值。,程序举例,例8-15 用牛顿迭代法求方程的近似根( 为止)。,牛顿迭代法的迭代公式是,k=0,1,2,其中 是对 求导的结果。本题中,例8-15,程序代码如下:Private Sub Command1_Click() Dim x0 As Single, x1 As Single x1=Val(InputBox(请输入x的初值)

42、 Do x0=x1 x1=x0 - (x0 * Exp(x0) - 1) / (Exp(x0) * (x0 + 1) Loop Until Abs(x1 - x0) 10 -5 Print Format(x1, 0.0000000)End Sub当程序输入x的初值为0.5时,结果显示近似根为0.5671433。,8.6.5 字符串遍历,字符串的遍历是指逐个访问字符串中的每一个字符,并对其进行指定的操作。 1完全遍历 2回文字符串,1完全遍历,一般的,我们总是从字符串的第一个字符开始访问,直到最后一个字符,称为字符串的完全遍历。经常采用以下语句结构进行字符串的遍历。For i=1 To Len(

43、str) 对str中第i个字符Mid(str,i,1)进行处理Next i,程序举例,例8-16 统计用户输入的字符串中字母字符、数字字符和其他字符的数量。,Private Sub CmdCount_Click() 统计按钮的单击事件 Dim s As String, i As Integer 设置3个计数器,分别记录字母、数字和其他字符的统计数量 Dim n_char As Integer, n_digital As Integer, n_other As Integer s=Text1.Text 接收用户输入的一串字符 For i=1 To Len(s) 从第1个字符开始统计到最后1个字符

44、 Select Case Mid(s, i, 1) 对每1个输入的字符进行判断分类 Case A To Z, a To z n_char=n_char + 1 字母计数器+1 Case 0 To 9 n_digital=n_digital + 1 数字计数器+1 Case Else n_other=n_other + 1 其他字符计数器+1 End Select Next i 显示统计结果 MsgBox “有” & n_char & “个字母,” & n_digital & “个数字,” & _ n_other & 个其他字符。End Sub,2回文字符串,回文字符串是指该字符串正读和反读都一

45、样。如“aba”、“abba”、“处处飞花飞处处”、“珠联璧合璧联珠”等都属于回文字符串。例8-17 判断用户输入的字符串是否是回文。 两种方法:(1)按定义判断(2)首尾字符的成对比较,例8-17,(1)按定义判断 先求出字符串的反序字符串,然后和原字符串比较,如果相等则是回文,否则不是回文。,Dim str As String, i As Integer 以下求Text1中文本的反序串str For i=1 To Len(Text1) str=Mid(Text1, i, 1) & str Next i If str=Text1 Then MsgBox 是回文 Else MsgBox 不是回

46、文,2回文字符串,(2)首尾字符的成对比较将字符串折半比较,若每对字符都相等则是回文,否则只要有一对字符不等就不是回文。,Dim i As Integer For i=1 To Len(Text1) 2 If Mid(Text1, i, 1) Mid(Text1, Len(Text1) - i + 1, 1) Then Exit For Next i If i Len(Text1) 2 Then MsgBox 是回文 Else MsgBox 不是回文,8.6.6 有限状态自动机,计算机工作者们提出了一种形象的方式描述这种动态过程,它可以清楚地反映一个“系统”的状态、状态转换的条件、转换时的动作

47、等等。这种抽象模型称为自动机。,程序举例,例8-18 统计文章中共有多少英文单词。设单词间使用空格隔开,句中或句末使用逗号、句号、感叹号、问号。分析:当前字符是单词的首字符,则遇到新单词,这时应把计数器加一。当前字符不是空格,它是不是新词的开始还依赖于前一字符是否空格。处理步骤不能孤立进行,处理方式需要依赖于前面的历史情况。读入过程有两种不同的状态(相互转换):处在单词之外(如果遇到非空格字符,那就是新词)正处在某单词的内部(不会遇到新词),描述读入状态转换的自动机,IN,OUT,读到空格字符,状态不变,读到空格字符,转到OUT状态,读到非空格字符,转到IN状态counter=counter+

48、1,读到非空格字符,状态不变,Flag=True,Flag=False,例8-18,For i=1 To Len(Text1) ch=Mid(Text1, i, 1) ch为当前字符 If ch = a And ch = A And ch = Z Then If flag=False Then 若前一字符不是字母 flag=True OUT状态转换到IN状态 counter=counter + 1 End If ElseIf ch= Or ch=. Or ch=, Or ch=! Or ch=? Then flag=False IN状态转换到OUT状态 End If Next i MsgBox

49、 共有 & counter & 个单词,8.6.6 有限状态自动机,素数问题另解: Flag=True 逻辑型状态变量Flag For i=2 To Sqr(x) If x Mod i=0 Then Flag=False : Exit For Next i If Flag Then 等价于If Flag=True Then MsgBox x & 是素数 Else MsgBox x & 不是素数 End If,8.6.7 进制转换,例8-19 实现D进制数整数(D=16)和十进制数整数的互换 1D进制整数转换成10进制整数 210进制整数转换成D进制整数,1D进制整数转换成10进制整数,由于D进

50、制数只能表示成字符串,因此这又是一个对字符串的操作运算。若D进制数表示成akak1a2a1a0,则转换成十进制数据的方法是多项式法,如下所示。,也可以表示成,其中后一种表达式中避免了对基数D的幂指数的求解,且将求和归结为求若干次aiD+ai1的过程,这是较为常用的方法。,Private Sub CmdD_10_Click() Dim s As String, ch As String * 1 Dim num As Double, i As Integer, d As Integer d=Val(T_digit.Text) If d = 2 Then s=Txt_D.Text For i=1 T

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号