第05章循环结构程序设计.ppt

上传人:本田雅阁 文档编号:2576578 上传时间:2019-04-11 格式:PPT 页数:102 大小:349.01KB
返回 下载 相关 举报
第05章循环结构程序设计.ppt_第1页
第1页 / 共102页
第05章循环结构程序设计.ppt_第2页
第2页 / 共102页
第05章循环结构程序设计.ppt_第3页
第3页 / 共102页
亲,该文档总共102页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第05章循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第05章循环结构程序设计.ppt(102页珍藏版)》请在三一文库上搜索。

1、Visual Basic,第五章 循环结构程序设计,四种基本结构,结构化程序设计方法的四种基本结构: 顺序 分支 循环 过程(函数和子程序) 仅使用四种基本的控制结构来编写程序。 每种控制结构只有一个入口和一个出口。,循环结构,在实际工作中,经常遇到一些操作过程并不复杂,但又需要反复进行相同处理的问题,比如,统计本单位所有人员的工资,求全班同学各科的平均成绩等等。解决这些问题从逻辑上说并不复杂,但如果单纯用顺序结构来处理,那将得到一个非常乏味和冗长的程序。,循环结构,ForNext 语句。 WhileWend 语句。 DoLoop 语句。,For循环语句,语法: For 循环变量初值 to 终

2、值 Step 步长 语句块 Exit For 循环体 语句块 Next 循环变量 其中:循环变量,必须为数值型变量。 初值、终值、步长,均为数值型表达式。 省略Step子句则步长为1。 For语句、Next语句中的循环变量必须相同。,功能: For: 循环变量置初值、确定终值和步长。 判断是进入循环还是跳过循环。 Next:实现循环变量“增值”。 判断是继续循环还是跳出循环。 循环终止条件: 循环变量的值沿变化方向“超过”终值。,For循环语句,For循环的流程图,循环变量赋初值、 计算终值、步长。,执行循环体,循环变量增值,For语句,Next语句,是,是,否,否,看几个简单的例子,例1:

3、Dim i As Integer For i = 1 To 5 Print i, Next i 注意:在 For 语句中没有 Step 子句,缺省的步长是 1 。 循环变量 i 的变化方向是从小到大,“超过”终值指的是大于终值。,让我们走一走程序,看几个简单的例子,例2: Dim i As Integer For i = 5 To 1 Step -2 Print i, Next i 注意:步长不是 1 , For 语句中不能省略 Step 子句。 循环变量 i 的变化方向是从大到小,“超过”终值指的是小于终值。,让我们走一走程序,看几个简单的例子,例3: Dim i As Integer Fo

4、r i = 1 To 5 Step -3 Print i, Next i,循环体一次也不执行 !,循环次数的计算,在For循环中,循环体的循环次数由初值、终值和步长三个表达式的值确定,计算公式为: 循环次数 = Int( 终值 - 初值 ) / 步长 ) + 1 For循环主要用于循环次数已知或可以用一个表达式计算出来的题目中。,循环变量的用法,循环变量的两个主要作用: 用于控制循环的次数; 用作数组元素的下标。 先看一个例子: Dim i As Integer For i = 1 TO 5 Print i, i = i + 1 Next i,让我们 走一走 程序,一个原则,在For循环的循环

5、体中 只引用循环变量的值; 不改变循环变量的值。,求 S=1+2+10,题目分析:累加类型的题目,使用累加结构的赋值语句。 程序如下: Dim s As Integer, i As Integer s = 0 For i = 1 To 10 s = s + i Next i Print “S=”; s,求 T=1*2*10,题目分析:累乘类型的题目,使用累乘结构的赋值语句。 程序如下: Dim t As Double, i As Integer t = 1 For i = 1 To 10 t = t * i Next i Print “T=”; t,Exit For 语句,语法: Exit F

6、or 功能: 退出当前循环。 Exit For 语句一般与 If 语句一起使用。 For i = If 逻辑表达式 then Exit For Next i,例题:将1100间各奇数(1、3、5、7)顺序累加,直到其和大于100时为止。 Dim s As Integer, i As Integer s = 0 For i = 1 To 100 Step 2 s = s + i If s 100 then Exit For Next i Print “S=”; s,Exit For 语句,WhileWend语句,语法: While 逻辑表达式 循环体 Wend 功能: 如果逻辑表达式的值为 Tr

7、ue,则执行循环体,一直执行到 Wend 语句。然后再回到 While 语句,并再一次检查逻辑表达式的值,如果 还是为 True,则重复执行。如果不为 True,执行Wend语句的下一句。,例题:将1100间各奇数(1、3、5、7)顺序累加,直到其和大于100时为止。 Dim s As Integer, i As Integer s = 0 i = 1 While s = 100 s = s + i i = i + 2 Wend Print “S=“; s,WhileWend语句,让我们 走一走 程序,DoLoop语句,语法: Do While 逻辑表达式 | Until 逻辑表达式 循环体

8、Loop While 逻辑表达式 | Until 逻辑表达式 功能: Do语句标志循环的起点。 Loop语句标志循环的终点。 While子句:当逻辑表达式为True时进入或继续循环。 Until子句:直到逻辑表达式为True时结束循环。,DoLoop语句的三种主要用法: 1、Do If 型循环 Do 循环体 If 逻辑表达式 Then Exit Do 循环体 Loop,DoLoop语句,例题:将1100间各奇数(1、3、5、7)顺序累加,直到其和大于100时为止。 Dim s As Integer, i As Integer s = 0 : i = 1 Do s = s + i If s 10

9、0 then Exit Do i = i + 2 Loop Print “S=“; s,DoLoop语句,让我们 走一走 程序,DoLoop语句的三种主要用法: 2、当型Do循环 Do While 逻辑表达式 循环体 Loop 注意:当型Do循环是前测试型,循环体有可能一次也不执行。,DoLoop语句,DoLoop语句,例题:将1100间各奇数(1、3、5、7)顺序累加,直到其和大于100时为止。 Dim s As Integer, i As Integer s = 0 : i = 1 Do While s =100 s = s + i i = i + 2 Loop Print “S=“; s

10、,让我们 走一走 程序,DoLoop语句,DoLoop语句的三种主要用法: 3、直到型Do循环 Do 循环体 Loop Until 逻辑表达式 注意:直到型Do循环是后测试型,循环体最少执行一次。,DoLoop语句,例题:将1100间各奇数(1、3、5、7)顺序累加,直到其和大于100时为止。 Dim s As Integer, i As Integer s = 0 : i = -1 Do i = i + 2 s = s + i Loop Until s 100 Print “S=“; s,让我们 走一走 程序,循环的五种结构,For If 型循环 While Wend 型循环 Do If 型

11、循环 当型 Do 循环 直到型 Do 循环,For If 型循环,For 循环变量初值 to 终值 Step 步长 If 逻辑表达式 Then Exit For Next 循环变量,WhileWend 型循环,While 逻辑表达式 Wend,Do If 型循环,Do If 逻辑表达式 Then Exit Do Loop,当型 Do 循环,Do While 逻辑表达式 Loop,直到型 Do 循环,Do Loop Until 逻辑表达式,循环的嵌套,在一个循环体内又包含了一个完整的循环,这样的结构称为多重循环或循环的嵌套。在程序设计时,许多问题要用二重或多重循环才能解决。 For循环、Whil

12、e循环、Do循环 都可以互相嵌套。 多重循环的执行过程是外循环执行一次,内循环执行一遍,在内循环结束后,再进行下一次外循环,如此反复,直到外循环结束。,循环嵌套的规则,只许嵌套,不许交叉; 只许转出,不许转入。,For ii =1 To 10 For jj=1 To 20 Next ii Next jj,For ii =1 To 10 For ii=1 To 20 Next ii Next ii,For ii =1 To 10 For jj=1 To 20 Next jj Next ii,For ii =1 To 10 Next ii For ii =1 To 10 Next ii,循环嵌套的

13、规则,一个简单的二重循环,Dim i As Integer, j As Integer For i = 1 To 4 Print “, For j = 1 To 4 Print i; j, Next j Print Next i,一个简单的二重循环,打印九九乘法表,打印九九乘法表,Private Sub Form_Click() Dim i As Integer, j As Integer, str As String Print : Print : Print Print Tab(40); “九九乘法表“ : Print For i = 1 To 9 Print Tab(6); For j

14、= 1 To 9 str = i Next j : Print Next i End Sub,有一个问题,81次! 记住: 内循环的执行次数 外循环的循环次数内循环的循环次数,内循环总共执行了多少次?,1、Go To 语句 形式: Go To 标号|行号 作用:无条件地转移到标号或行号指定的语句。 标号是一个标识符,行号是一个整数。 2、Exit 语句 多种形式:Exit For、Exit Do、Exit Sub、Exit Function 等。 作用:退出某种控制结构的执行。 3、End 语句 多种形式: End、 End If、 End Select、 End With、 End Type

15、、 End Sub、 End Function 等。 作用:End 结束一个程序的运行;其余表示某个结构的结束,与对应的结构语句配对出现。,其他辅助控制语句,With语句,语法: With 对象名 语句块 End With 功能:对某个对象执行一系列的操作,而不用重复对象名称。 With Label1 .Height = 200 Label1.Height = 200 .Width = 200 Label1.Width = 200 .FontSize=22 Label1.FontSize=22 .Caption = “MyLabel“ Label1.Caption = “MyLabel“ En

16、d With,循环,习题课,程序设计三剑客,穷举法 递推法 迭代法,穷举法,穷举法的基本思路: 穷举所有可能出现的情况,逐一进行测试,判断其是否满足给定的条件。 穷举法实现的关键: 建立正确的穷举,一般用循环来实现。 注意:1、有意义的选项,一项不能少。 2、尽量排除无意义的选项,以减少循环的次数。,递推法,递推法的基本思路: 利用已知的一项或多项数据,推算出新的数据项。然后,再利用这个新的数据项推算出下一个数据项。重复此过程,直到推算出最后结果时为止。 递推法实现的关键: 确定递推初值; 建立递推公式。,递归法,递归的概念: 递归定义 对象利用自己定义自己。 递归调用 过程或函数自己调用自己

17、。 递归调用又分为: 直接递归调用 过程或函数直接调用自己。 间接递归调用 过程或函数通过其它过程或函数调用自己。 注意:递归调用一般要用 if 语句来进行控制,使递归过程到某一条件满足时结束。,递归法的基本思路: 递归法类似于数学证明中的反推法,一般是从结果出发,归纳出后一结果与前一结果的关系,寻找其规律性。 递归法实现的关键: 建立递归函数; 确定递归终止条件。,递归法,题型:累加,题目:求 S = 1 + 2 + 3 + +10。 程序如下: Dim s As Integer, i As Integer s = 0 For i = 1 To 10 s = s + i Next i Pri

18、nt “S=”; s,题型:累加,题目:求 S = 1 + 2 + 2 + 3 + 18 + 19 + 19 + 20。,程序如下: Dim s As Integer, i As Integer s = 0 For i = 1 To 19 s = s + i + (i+1) Next i Print “S=”; s,题型:累加,题目:求,程序如下: Dim s As Double, i As Integer, t AS Integer s = 0 : t = -1 For i = 1 To 100 t = t * -1 s = s + t / i Next i Print “S=”; s,题型

19、:累乘,题目:求 T = 1 * 2 * 3 * * 10。 程序如下: Dim t As Double, i As Integer t = 1 For i = 1 To 10 t = t * i Next i Print “T=”; t,题型:累乘,题目:,程序如下: Dim t As Double, i As Integer t = 1 For i = 1 To 10 t = t * i / (i+1) Next i Print “T=”; t,题型:累加累乘,程序的基本架构: s = 0 : t = For i = 程序段,将 t 置为下一项的值 s = s + t Next i Pri

20、nt “S=”; s,题型:累加累乘,题目:求 S = 1! + 2! + 3! + +10!。 程序如下: Dim s As Long, t As Long Dim i As Integer, j As Integer 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 “S=“; s,题型:累加累乘,题目:求 S = 1! + 2! + 3! + +10!。 使用递推法来做: 1、确定递推初值 T 1 2、建立递推公式 N项(N1)项n,题型:累加累乘,题目:求 S = 1!

21、+ 2! + 3! + +10!。 程序如下: Dim s As Long, t As Long, i As Integer s = 1 : t = 1 For i = 2 To 10 t = t * i s = s + t Next i Print “S=“; s,例题:求 S = 20 + 21 + 22 + + 2n,n = 63。,递推初值: 20 =1。 递推公式:n项 = (n-1)项 * 2 。 Dim s As Double, t As Double, i As Integer s = 1 : t = 1 For i = 1 To 63 t = 2i/t*2 s = s + t

22、 Next i Print “S=“; s,题型:累加累乘,题型:判断m能否被n整除,注意 VB 中两个独特的算术运算符: Mod 取余 整除 例如: 10 Mod 3 运算结果 1 10 3 运算结果 3 判断 m 能否被 n 整除的方法: m Mod n 0,题型:判断m能否被n整除,例题:求出 100 以内所有能被 3 和 4 同时整除的数。 程序如下: Dim i As Integer For i = 1 To 100 If i Mod 3 = 0 And i Mod 4 = 0 Then Print i; Next i,例题:求20002050年之间的所有闰年。闰年的条件是: (1)

23、能被4整除,但不能被100整除的年份是闰年; (2)能被100整除,又能被400整除的年份是闰年。 程序如下: Dim i As Integer For i = 2000 To 2050 If i Mod 4=0 And i Mod 1000 Then Print i; If i Mod 100=0 And i Mod 400=0 Then Print i; Next i,题型:判断m能否被n整除,VB的取子串函数,语法: Left(串表达式, n) 函数值 功能:取字符串左边 n 个字符。 示例: Left(“ABCDEFG”, 3) “ABC” 语法: Mid(串表达式, n1 ,n2)

24、功能:在字符串中从 n1 开始向右取 n2 个字符。 示例: Mid(“ABCDEFG”, 2, 3) “BCD” 语法: Right(串表达式, n) 功能:取字符串右边 n 个字符。 示例: Right(“ABCDEFG”, 3) “EFG”,题型:打印图形,题型:打印图形,Private Sub Form_Click() Dim s As String * 8, i As Integer s = “*“ Print: Print For i = 1 To 8 Print Tab(10 + i); s Next i End Sub,题型:打印图形,分析:1)首先确定图形中心线位置第20个字

25、符处。 2)将第 n 行的起始打印位置,表示为行号 n 的函数,起始打印位置 = F(21 - n) 。 3)将第 n 行打印星号的个数,表示为行号 n 的函数, 星号个数 = F(2 * n - 1) 。 4)可先将一个有十五个星号的字符串赋给串变量 S,打印时取其子串输出。,题型:打印图形,程序如下: Private Sub Form_Click() Dim s As String, i As Integer s = “*“ For i = 1 To 8 Print Tab( 21 i ); Left( s, 2 * i 1 ) Next i End Sub,题型:打印图形,题型:打印图形

26、,程序如下: Private Sub Form_Click() Dim s As String, i As Integer s = “0123456789“ Print: Print For i = 1 To 10 Print Tab(21 - i); String(2 * i - 1, Mid(s, i, 1) Next i End Sub,题型:打印图形,题型:打印图形,程序如下: Private Sub Form_Click() Dim i As Integer Print: Print For i = 1 To 10 Print Tab(21 - i); String(2 * i -

27、1, Chr(47 + i) Next i End Sub,VB中的取整函数,语法: Int( 数值表达式 ) Fix( 数值表达式 ) Round( 数值表达式 ,小数点右边应保留的位数) 功能:1)如果数值表达式的值为正, Int 和 Fix 都会删除其小数部份而返回剩下的整数。 2)如果数值表达式的值为负,则 Int 返回小于或等于其值的第一个负整数,而 Fix 则会返回大于或等于其值的第一个负整数。 3)Round将数值表达式的值四舍五入到 n 位小数。,例如: Int( 3.4 ) 3 Fix( 3.4 ) 3 Int( -3.4 ) -4 Fix( -3.4 ) -3 Round(

28、 -3.3456, 1 ) -3.3 Round( -3.3456, 2 ) -3.35,VB中的取整函数,0,3,4,-3,-4,题型:分拆数字,例题:求0999之间所有的“水仙花”数。 例如:153=13+53+33 。 Dim i As Integer, a As Integer, b As Integer, c As Integer For i = 0 To 999 a = Int(i / 100) b = Int(i - a * 100) / 10) c = i - a * 100 - b * 10 If i = a * a * a + b * b * b + c * c * c T

29、hen Print i; Next i,题型:分拆数字,思考题 求1100之间所有的“同构数”。 “同构数”是这样一种数:它出现在它的平方数的右端。例如:5的平方是25,5是25中右端的数,5就是同构数。25也是一个同构数,它的平方是625。,题型:数列,例题:求裴波那契数列 1,1,2,3,5,8, 的前20项。 递推初始条件: F1 = 1,F2 = 1 。 递推公式: Fn = Fn-2 + Fn-1 。 递推过程: a=1 b=1 c=2 a=1 b=2 c=3 a=2 b=3 c=5 ,例题:求裴波那契数列 1,1,2,3,5,8, 的前20项。 Dim a As Integer,

30、b As Integer, c As Integer a = 1 : b = 1 Print a; b; For i = 3 To 20 c = a + b Print c; a = b : b = c Next i,题型:数列,例题:求e,直到前后两项之差小于104为止。 Dim e As Double, m1 As Double, m2 As Double,n As Integer e = 2: m2 = 1: n = 1 Do n = n + 1 m1 = m2 m2 = m1 / n e = e + m2 Loop Until m1 - m2 0.0001 Print “e=“; e,

31、题型:级数,例题:求 S = 20 + 21 + 22 + + 2n,n = 63。 递推初值: 20 =1。递推公式:n项 = (n-1)项 * 2 。 Dim s As Double, t As Double, i As Integer s = 1 : t = 1 For i = 1 To 63 t = t * 2 s = s + t Next i Print “S=“; s,第一步: 求出通项公式。 第二步: 求出第 n 项与 n-1 项之比 k 。 第三步: 建立递推公式:n 项 = k * ( n-1 )项。,题型:级数,例题:求 Sin(x) = x/1 x3/3! + x5/5!

32、 x7/7! + ,n = 20。 第一步,通项公式。第n项 = 第二步,第n项与n-1项之比。k = 第三步,递推公式。n项 = (n-1)项,题型:级数,Dim SinX As Double, x As Double, t As Double Dim i As Integer x = InputBox(“X=”, “输入框“) SinX = x : t = x For i = 2 To 20 t = t * (-1) * x * x / (2 * i - 2) / (2 * i - 1) SinX = SinX + t Next i Print “x=“; x, “Sin(x)=“; Si

33、nX,题型:级数,随机函数,Rnd函数 语法: Rnd 功能: Rnd函数返回均匀分布在 0,1) 区间上的随机数,类型为Single 。( 0 Rnd 1 ) Randomize语句 语法: Randomize 功能:利用系统计时器的值初始化随机数生成器。,随机函数,Dim i As Integer Print: Print For i = 1 To 50 If i Mod 5 = 0 Then Print Round(Rnd, 4) Else Print Round(Rnd, 4), End If Next i,随机函数,两次运行程序得到的随机数,其序列是相同的。,随机函数,Dim i A

34、s Integer Print: Print Randomize 随机函数初始化语句 For i = 1 To 50 If i Mod 5 = 0 Then Print Round(Rnd, 4) Else Print Round(Rnd, 4), End If Next i,随机函数,第一次运行程序得到的随机数:,第二次运行程序得到的随机数:,随机函数,使用以下公式可产生均匀分布在某个区间上的随机整数: Int(UpperBound - LowerBound + 1) * Rnd + LowerBound) 这里,UpperBound 是随机数范围的上限,而 LowerBound 是随机数范

35、围的下限。例如: 0,10 Int(11 * Rnd) 100,120 Int(21 * Rnd + 100) 10,99 Int(90 * Rnd + 10),随机函数,随机函数,题目:利用随机函数求。(辅助图形:1/4 单位圆),1,1,0,0,随机函数,1/4 单位圆的面积: R*R* / 41*1* / 4 单位正方形的面积: 1*11 另外: 落在圆内的点数m,总点数n 因此: 4 * m / n,随机函数,Dim m As Long, n As Long, i As Long Dim x As Single, y As Single n = InputBox(“N=“, “输入对话

36、框“): m = 0 For i = 1 To n x = Rnd: y = Rnd If x * x + y * y = 1 Then m = m + 1 Next i Print “PI=“; 4 * m / n,题型:素数,例题:判断用户输入的整数是否是素数。,Dim x As Integer, i As Integer, b As Boolean x = Text输入.Text b = True For i = 2 To Sqr(x) If x Mod i = 0 Then b = False Exit For End If Next i,题型:素数,If b Then MsgBox

37、“是素数! “, vbOKOnly, “判断结果“ Else MsgBox “不是素数!“, vbOKOnly, “判断结果“ End If,题型:素数,找出100200之间的全部素数,Dim n As Integer, i As Integer, flag As Boolean For n = 101 To 200 Step 2 flag = True For i = 2 To Sqr(n) If n Mod i = 0 Then flag = False Exit For End If Next i If flag Then Print n; Next n,最大公约数和最小公倍数,例题:用

38、辗转相除法求两自然数的最大公约数和最小公倍数。 求最大公约数的算法: (1) 对于已知两数 m,n,使得 m n ; (2) m 除以 n 得余数 r ; (3) 若 r = 0,则 n 为最大公约数,结束;否则执行(4); (4) m n,n r,再重复执行(2)。 求最小公倍数的算法: 原始的 m 和 n 的乘积除以最大公约数,就得到它们的最小公倍数。,最大公约数和最小公倍数,M N R 12 9 3 M N R 9 3 0,最大公约数和最小公倍数,Private Sub Command计算_Click() Dim m As Integer, n As Integer, r As Inte

39、ger m = TextM.Text n = TextN.Text If m n Then r = m m = n n = r End If,最大公约数和最小公倍数,r = m Mod n Do While (r 0) m = n n = r r = m Mod n Loop Label最大公约数.Caption = “最大公约数 = “ & n r = n : m = TextM.Text : n = TextN.Text Label最小公倍数.Caption = “最小公倍数 = “ & m * n / r End Sub,最大公约数和最小公倍数,百钱买百鸡,例题:鸡翁一、值钱五;鸡母一,

40、值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? For x = 0 To 100 For y = 0 To 100 For z = 0 To 100 If x + y + z = 100 And 5 * x + 3 * y + z / 3 = 100 Then Print x, y, z End If ,Dim x As Integer, y As Integer, z As Integer Print “cock“, “hen“, “chick“ For x = 0 To 19 For y = 0 To 33 z = 100 - x - y If 5 * x + 3 * y + z / 3 = 100 Then Print x, y, z End If Next y Next x,百钱买百鸡,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1