第5章 循环结构程序设计
例:求式子的和,直到表达式的最后一项的值小于0.0001。 Dim i As Integer Dim s As Double i=1 s=0 While 1 / (i * (i + 1)) >= 0.0001 s = s + 1 / (i * (i + 1)) i=i+1 End While s = s + 1 / (i * (i + 1)) ’退出循环时,小于0.0001的项没有 加上去。因此,再加一次。 MsgBox("结果为:" + Str(s), , "求和")
例子
1、从键盘输入一个字符串,分别统计字母“M” 和“m”在其中出现的次数。 2、计算并输出下面级数前n项(n=40)中偶数项的 和。 s = 1*2+2*3+3*4+4*5+……+n*(n+1)+… 3、计算并输出所有6位正整数中能被6整除且其 十位数不是4的数之和,并求它们中的最大数。 4、编写程序,计算并输出下面数列前n项的和 (设n=15,结果取4位小数)。 数列为: 2/1,3/2,5/3,8/5,13/8,21/13,……
例:判断一个数n是否为素数。 分析:根据素数的定义可知:一个数除了1和它本身之外,不能被其它数整除的数就是素数。可 以推断:如果只要发现了从2到n-1之间的一个整数能被n整除,则n就不是素数;否则,n就是素数。 可以先假定一个标志变量Flag,其初值为True,表示假定n是素数。然后把从2到n-1之间的所有 整数试一遍,只要发现某一个数能被n整除,就把标志变量Flag的值赋值为False,表示n不再是素数。循环 结束后,根据Flag的值来判断n是否素数,若Flag的值为True,则n是素数;否则n不是素数。 Dim n, i As Integer Dim flag As Boolean n = InputBox("请输入一个数值n:", "判断素数") flag = True i=2 While i <= n - 1 If n Mod i = 0 Then flag = False Exit while End If i=i+1 End While If flag Then MsgBox(Str(n) + "是素数!", , "判断素数") Else MsgBox(Str(n) + "不是素数!", , "判断素数") End If
注意: 1.防止出现死循环 2.在While...End While循环结构中,由于是先判断循环的 条件,然后再决定是否执行循环体。若在第一次进入循环 结构之前,条件不成立,那么循环体一次也不执行。
Do…Loop语句
可分为四种 : 1. Do While…Loop循环结构 语句形式如下: Do While <条件表达式> 语句块A [Exit do] 语句块B Loop 这种结构也是先判断条件,然后决定是否执行 循环体.
例:求1+2+3+…+100的和。
方法一:用do while…loop语句实现 Dim i, s As Integer i=1 s=0 Do While i <= 100 s=s+i i=i+1 Loop 方法二:用do…loop while语句实现 Dim i, s As Integer i=1 s=0 Do s=s+i i=i+1 Loop While i <= 100
例:求自然对数e的近似值,要求其误差小于0.000001(即求和公式的最 后一项的值小于0.000001),近似公式为:
分析:本例涉及两个重要的运算:一个是累加求和,另一个是求阶乘。 Dim i As Integer Dim fac, s As Double s=1 fac = 1 i=0 Do i=i+1 fac = fac * i ’求第i项分母的值,即i! s = s + 1 / fac Loop While 1 / fac >= 0.000001 MsgBox("e的值为:" + Format(s, "#.######"), , "求e的值")
4. Do… Loop Until 循环语句
语句形式如下: Do 语句块A [Exit Do] 语句块B Until <条件表达式> 此语句与Do…While Loop语句的功能的区别仅 仅在于:若条件表达式的值为False,就执行下次循 环体;否则,退出循环。使用的条件与Do…W=0 Do While i < 5 s=s+i i=i+1 Loop
程序段2: Dim i, s As Integer i = 10 s=0 Do s=s+i i=i+1 Loop While i < 5 当第一个程序段执行结束时,s的值为0;则第二个程序段执行结束时,s 的值为10。
If flag Then MsgBox(Str(n) + "是素数!", , "判断素数") Else MsgBox(Str(n) + "不是素数!", , "判断素数") End If
2. Do…Loop While 循环结构
语句形式如下: Do 语句块A [Exit Do] 语句块B Loop While <条件> 根据语句形式的书写可以看出,此结构是先执行循 环体,后进行条件的判断,以决定是否进行下一次循环。 也就是说,这种循环的循环体至少执行一次。
执行的流程如图所示。 说明如下:
语句块
条件 表达式
Y
N
例:用辗转相除法求两个数m,n的最大公约数和最小公倍数。
分析:辗转相除法求两个数m,n的最大公约数的思想如下: (1)求m除以n的余数r,即r=m mod n; (2) 若r≠0,转(3);若r=0,则此时的n就是最大公约数,转(4); (3) 把n的值给m,把r的值给n,即m←n,n←r,转(1); (4) 循环结构的下一个语句。 求最小公倍数的方法:两个数的乘积除以它们的最大公约数。
例:判断一个数n是否为素数。
Dim n, i As Integer Dim flag As Boolean n = InputBox("请输入一个数值n:", "判断素数") flag = True i=2 Do While i <= Sqrt(n) If n Mod i = 0 Then flag = False Exit Do End If i=i+1 Loop
例:求100到999之间的所有“水仙花数”。“水仙花数”的含 义是一个数的每个数位的立方和等于该数。例153=13+53+33。 分析:对于某一个数说,先把这个数拆开成单个的数字,然后 再判断它们的立方和是否等于本身。 程序如下: Dim bw, gw, sw, i As Integer Dim str1 As String str1 = "" For i = 100 To 999 bw = i \ 100 sw = (i Mod 100) \ 10 gw = i Mod 10 If bw ^ 3 + sw ^ 3 + gw ^ 3 = i Then str1 = str1 + Str(i) + vbCrLf End If Next MsgBox("结果为:" + vbCrLf + str1, , "求水仙花数")
3. Do Until … Loop 循环语句
语句形式如下: Do Until <条件表达式> 语句块A [Exit do] 语句块B Loop 此语句与Do While…Loop语句的功能的区别仅 仅在于:若条件表达式的值为False,就执行循环体; 否则,退出循环。也就是说,用do while与do until的 条件刚好相反。
Dim m, n, r, x, y, z As Integer m = TextBox1.Text n = TextBox2.Text x=m:y=n ’保存最初两个数的值给x和y,以备求最小公倍数时使用 r = m Mod n While r <> 0 m=n n=r r = m Mod n End While z=x*y/n ’求最小公倍数 MsgBox("最大公约数为:" + Str(n) + vbCrLf + "最小公倍数为:" + Str(z), , "求 最大公约和最小公倍")
While...End While循环
此循环也称“当型循环”,表示当条件成立时,重复执 行某个动作。语法如下: While <条件表达式> 语句块 [Exit While] 语句块 End While 其中:(1)条件表达式表示循环要满足的条件。若表达 式的值为True,则执行语句块。 (2)语句块:即循环体。
循环变量=初值
循环变量是否 超过终值?
Y
N
语句块1 是否执行到 Exit for语句?
N 语句块2
循环变量=循环变量+步长
Y
例:计算1+2+3+…+100。(不能用等差数列求和的计算公 式) Dim i, s As Integer s=0 ’在计算累加和时,存放和的变量的初值为0 For i = 1 To 100 s=s+i Next MsgBox("1+2+3+…+100的和为:" + Str(s), , "求和")