《第5章选择分支与循环.ppt》由会员分享,可在线阅读,更多相关《第5章选择分支与循环.ppt(65页珍藏版)》请在三一办公上搜索。
1、第 5 章 选择分支与循环,基本要求:熟练掌握if-then-else-end if select-case-end select do-loop、for-next语句 重点:if-then-else-end if select-case-end select do-loop、for-next语句 算法:累加、累乘(pg70)、穷举法、迭代法(pg77)难点:选择的嵌套、多重循环,5.1 选择结构 1.IfThen语句(单分支结构)If Then 语句块 End If 或 If Then,例:已知两个数x和y,比较它们的大小,使得x大于y.If xy Then t=x:x=y:y=t End
2、If 或 If xy Then t=x:x=y:y=t,2.IfThenElse语句(双分支结构)If Then Else End If 或 If Then Else,例如:输出x,y两个中值较大的一个值。IF XY Then Print XElse Print YEnd If也可以写成如下的单行形式:IF XY Then Print X Else Print Y,双分支选择结构执行过程,思考:设计一个求解一元二次方程的程序,3.IfThenElseIf语句(多分支结构)形式:If Then ElseIf Then Else 语句块 n+1 End If,例:输入一学生成绩,评定其等级。方法是
3、:90100分为“优秀”,8089分为“良好”,7079分为“中等”,6069分为“及格”,60分以为“不合格”,执行过程,使用IF语句实现的程序段如下:If x=90 then Print 优秀ElseIf x=80 Then Print 良好ElseIf x=70 Then Print 中等ElseIf x=60 Then Print 及格Else Print 不及格End If,5.2 Select Case语句(情况语句)形式:Select Case 变量或表达式Case 表达式列表1语句块1Case 表达式列表2语句块2Case Else语句块n+1End Select的下面三种形式
4、之一:(1)一组枚举表达式(用逗号分隔)2,4,6,8(2)表达式1 To 表达式2 60 to 100(3)Is 关系运算符表达式 is40,is 60(4)三种的组合 2,50 to 80,is 100,数值型或字符串表达式,例如:使用select case.语句来实现成绩评定的程序段如下:Select Case x Case 90 to 100 Print 优秀 Case 80 to 89 Print 良好 Case 70 to 79 Print 中等 Case 60 to 69 Print 及格 Case Else Print 不及格End Select,Y=,ex+e-x x0,X=
5、Val(Text1.Text)Select Case XCase Is 0 Y=Log(X)/Log(10)End SelectPrint Y=;Y,X=Val(Text1.Text)Select Case XCase X 0 Y=Log(X)/Log(10)End SelectPrint Y=;Y,求函数Y的值,5.3 选择结构的嵌套 在IF语句的Then分支和Else分支中可以完整地嵌套另一IF语句或Select Case语句,同样Select Case语句每一个Case分支中都可嵌套另一IF语句或另一Select Case语句。下面是两种正确的嵌套形式:(1)IF Then.IF The
6、n Else.End If.Else.IF Then.Else.End If.End IF,(2)IF Then.Select Case Case IF Then Else.End If Case.End Select.End IF,注意:只要在一个分支内嵌套,不出现交叉,满足结构规则,其嵌套的形式将有很多种,嵌套层次也可以任意多。对于多层IF嵌套结构中,要特别注意IF与Else的配对关系,一个Else必须与IF配结,配对的原则是:在写含有多层嵌套的程序时,建议使用缩进对齐方式,这样容易阅读和维护。,5.4.1 循环结构1.For循环语句(一般用于循环次数已知)For 循环变量初值 to 终值
7、 Step 步长 语句块Exit For 语句块 Next 循环变量,初值(终值)可以取以下值:(1)常量 当循环变量为整型,初值(终值)不是整数时则按照cint、clng函数方式转换(2)变量、表达式(一次计算始终不变),循环次数,例:For I=2 To 13 Step 3 Print I,Next I Print“I=“,I 循环次数,循环执行次数 输出I的值分别为:2 5 8 11 出了循环输出为:I=14,例:编程计算:S=1+2+3+100,Dim S%,I%S=0 累加前变量S为0For I=1 to 100 S=S+INext IPrint S=,S,当N=100,N=N+1,
8、打印S,S=0,N=1,S=S+N,算法流程图,例1.运行下面程序,第一行输出?第二行输出?,Private Sub Form_Click()Dim i As Integer,j As Integer Dim a As Integer,b As Integer a=5:b=1 For i=1 To a+b Step b i=i+b i=2,6 a=a+i a=7,13 b=b+i b=3,9 k=k+1 k=1,2 Next i Print a 13 Print b,k 9 2End Sub,一次计算始终不变!a+b=6,b=1,例2.Private Sub Form_Click()Dim i
9、%For i=0.5 To 5.5 Step 2.5 i=i+1 Print i;Spc(2);next I End Sub结果:1 4 7,Cint(0.5)=0Cint(5.5)=6Cint(2.5)=2,形式1:(当型循环)Do While|Until 语句块 Exit Do 语句块 Loop,5.4.2 DoLoop循环语句,形式2:(直到循环)Do 语句块 Exit Do 语句块Loop While|Until,Do UntilLoop执行过程 DoLoop Until执行过程,总结:(1)fornext循环适合:循环次数容易确定的情况;do.loop循环适合:循环条件容易给出的情况
10、;(2)当使用While构成循环时,当条件为“真”,则反复执行循环体。(3)当使用Until 构成循环时,当条件为“假”,则反复执行循环体。,(4)语句Exit Do的作用是退出它所在的循环结构,它只能用在DO/Loop结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。,例.求两个整数的最大公约数、最小公倍数,Dim n%,m%,nm%,r%m=Val(InputBox(m=)n=Val(InputBox(n=)nm=n*mIf m 0)m=n n=r r=m mod n LoopPrint 最大公约数=,n Print 最小公倍数=,nm/n,算法使用转
11、碾除法,流程图如右,实现的程序代码如下:,5.4.3 循环的嵌套多重循环结构 如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。上面介绍的几种循环控制结构可以相互嵌套,下面是几种常见的二重嵌套形式:,(1)For I=.For J=.Next J.Next I,(2)For I=.Do While/Until.Loop.Next I,(3)Do While.For J=.Next J.Loop,(4)Do While/Until.Do While/Until.Loop.Loop,例如:打印九九乘法表.F
12、or i=1 To 9 For j=1 To 9 se=i Next j Picture1.Print Next i,对于循环的嵌套,要注意以下事项:(1)内循环变量与外循环变量不能同名;(2)外循环必须完全包含内循环,不能交叉;(3)不能从循环体外转向循环体内,也不能从外循环转向内循环.正 确错 误,For i=1 To 10 For j=1 To 20 Next i Next j,For i=1 To 10 For i=1 To 20 Next i Next i,For i=1 To 10 For j=1 To 20 Next j Next i,5.4.4 几种循环语句比较,5.5.1 E
13、xit 语句,Exit 语句用于退出 Do.Loop、For.Next、Function或Sub代码块。对应的使用格式为:Exit Do、Exit For、Exit Function、Exit Sub。分别表示退出DO循环、For循环、函数过程、子过程。,例如:下面的例子是使用 Exit 语句退出 For.Next 循环、Do.Loop 循环及子过程。,Private Sub Form_Click()Dim I%,Num%Do While True 建立无穷循环。For I=1 To 100 循环 100 次。Num=Int(Rnd*100)生成一个099的随机数。Select Case Nu
14、m Case 10:Exit For 退出 For.Next 循环。Case 50:Exit Do 退出 Do.Loop 循环。Case 64:Exit Sub 退出子过程。End Select Next I LoopEnd Sub,Dim I%,Num%演示看看 Do While True 建立无穷循环。For I=1 To 100 循环 100 次。Num=Int(Rnd*100)生成一个099的随机数。Select Case Num Case 10 Print 10退出 For.Next 循环 Exit For Case 50 Print 50退出 Do.Loop 循环 Exit Do
15、Case 64 Print 64退出子过程 Exit Sub End Select Next I Loop,5.5.2 End 语句 形式:End 功能:结束一个程序的运行。在Visual Basic中还有多种形式的End语句,用于结束一个程序块或过程。其形式有:End If End Select End Type End With End Sub End Function等它们与对应的语句配对使用。,5.6 应用程序举例 算法:累加、累乘(pg70)、穷举法(水仙花数)、迭代法(pg77)、进制转换,例.判断一个给定的整数是否为素数。,算法思路:素数指除了能被1和自身外,不能被其他整数整除的
16、自然数。判断整数N是不是素数的基本方法是:将N分别除以2,3,N-1,若都不能整除,则N为素数。因为N=Sqr(N)*Sqr(N),所以,当N能被大于等于Sqr(N)的整数整除时,一定存在一个小于等于Sqr(N)的整数,使N能被它整除,因此只要判断N能否被2,3,Sqr(N)整除即可。,算法流程图如下:,Dim N%,I%,K%N=Val(InputBox(N=?)K=Int(Sqr(N)For I=2 To K If N Mod I=0 Then Exit ForNext IIf IK Then Print N;是素数Else Print N;不是素数End If,例5-4 求 1到10这十
17、个数的和与连乘积,求若干个数之和或连乘积,可采用“累加”或“累乘”法。累加法是设置一个存放和数的变量,称为“累加器”,初始值为0,累加过程通过循环实现;累乘的算法设置的是“累乘器”,初始值为1,在循环体内,乘数应与累乘器相乘。在求乘积时,应注意乘积的大小,设置适当的数据类型。程序代码,例5-4,例5-5 大写字母逆序输出的程序,从一个字符串中找出符合要求的字符是采取对字符串的每一个字符逐个筛选的方法实现的,本例利用Mid函数可以从字符串中提取出单个字符,利用循环控制处理过程,循环的终值使用Len函数;对于符合要求的字符采用连接运算组成新字符串;逆序输出则是通过从后往前逐个提取字符再连接。程序代
18、码,例5-5,例5-6 一个模拟摇奖的程序,设有100个人中签,要从中找出中奖人。由机器自动随机产生1000个1100间的数据,第1000个随机数据即为中奖人的号码。问题的关键是如何产生1100之间的随机整数。VB提供了一个可以产生01之间均匀分布的随机数的随机函数Rnd(x)。为了生成某个范围内的随机整数,可用以下公式:Int(ub-lb+1)*Rnd+lb)这里,ub、lb分别是随机整数范围的上下限。程序代码,随机函数Rnd(x),其中,可选的 x 参数是 Single 或任何有效的数值表达式 如果使用参数且参数 x 0,则得到随机序列的下一个随机数;参数 x=0,则返回上一次生成的随机数
19、。不使用x的结果与 x0相同。对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。调用 Rnd 之前,可先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有从系统计时器获得到的种子。,例5-6,5.3 程序示例,例5-7一个简易函数计算器程序 例5-8 个人收入调节税应用程序 例5-9 找出水仙花数例5-10利用牛顿迭代法求方程根例5-11 原码转换成反码的程序,例5-7 一个简易函数计算器程序,为了保证“计算器”在各种操作状况下都正常工作,程序需要考虑在用户没有在文本框中输入数据或输入的数据超出函数的定义域时的出错处理。
20、程序中使用的 IsNumeric()函数用于检测自变量s是否是一个可转换成数值的数字串,如果是,则返回逻辑值True,否则返回False。程序代码,例5-7,例5-8 个人收入调节税应用程序,按月收入额计个人收入调节税的计税公式式中,income为纳税人的月收入。程序代码,例5-8,例5-9 找出所有三位水仙花数,利用“穷举法”在三位数中查找具有“水仙花数”特征的数题中在判断一个数是否是“水仙花数”时采用了两种方法:一种是将三位数循环变量的各位数字拆开,然后进行比较;一种是采用三重循环,用三个循环变量来构成一个三位数,然后进行比较程序代码(1)程序代码(2),例5-9 方法一,Private
21、Sub Command1_Click()Dim I As Integer,a As Integer,b As Integer,c As Integer,st As String For I=100 To 999 a=I 100 b=(I Mod 100)10 c=I Mod 10 If I=a 3+b 3+c 3 Then st=I&=&a&3+&b&3+&c&3 List1.AddItem st End If Next IEnd Sub,例5-9 方法二,Private Sub Command1_Click()Dim I As Integer,a As Integer,b As Intege
22、r,c As Integer,st As String For a=1 To 9 For b=0 To 9 For c=0 To 9 I=a*100+b*10+c If I=a 3+b 3+c 3 Then st=I&=&a&3+&b&3+&c&3 List1.AddItem st End If Next c Next b Next aEnd Sub,例5-10 利用牛顿迭代法求方程根,利用牛顿迭代法求方程xex-1=0 在x0=0.5附近的一个根,要求精确到10-7 e=2.718281828459045235360287471353牛顿迭代法算法说明 程序代码,牛顿迭代法算法说明,牛顿迭代
23、法是求解一元超越方程的常用算法。设要求解的方程为f(x)=0,并已知一个不够精确的初始根x0,则有:上式称为牛顿迭代公式。式中,f(x)是f(x)的导函数。利用迭代公式,可以依次求出x1、x2、x3、,当|xn+1 xn时的xn+1即为要求的根。,xn+1=xn-f(xn)/f(xn)n=0,1,2,3,例5-10,Option ExplicitPrivate Sub cmd1_Click()Dim x As Single,x1 As Single,Eps As Singlex=InputBox(输入初始值x:,牛顿迭代法)Eps=InputBox(输入允许误差Eps:,牛顿迭代法)Do x1
24、=x x=x1-(x1*Exp(x1)-1)/(Exp(x1)*(x1+1)Loop Until Abs(x-x1)=Eps Text1.Text=Str(x)End SubPrivate Sub cmd2_Click()EndEnd Sub,例5-11 原码转换成反码的程序,Mid函数的功能除可提取字符串的指定位置的字符之外。也可以如同一个变量一样用在赋值语句中,其功能是用指定的字符替换字符串中指定位置的内容。本示例使用了Mid函数的这一功能。,Dim Source As String,I As Integer Dim D As String*1 Source=Text1.Text If M
25、id(Source,1,1)1 Then Text2.Text=Source Text3.Text=Source Else For I=Len(Source)To 2 Step-1 If Mid(Source,I,1)=1 Then Mid(Source,I,1)=0 Else Mid(Source,I,1)=1 End If Next I:Text2.Text=Source,例5-11,D=1 For I=Len(Source)To 2 Step-1 If Mid(Source,I,1)=1 And D=1 Then Mid(Source,I,1)=0 D=1 ElseIf Mid(Sour
26、ce,I,1)=0 And D=1 Then Mid(Source,I,1)=1 D=0 End If Next I Text3.Text=Source End If,Private Sub Command2_Click()Text1.Text=Text2.Text=Text3.Text=Text1.SetFocusEnd SubPrivate Sub Command3_Click()EndEnd Sub,本章小结:,1.单行结构条件语句If Then Else,2.块结构条件语句If Then ElseIf Then Else End If,3.多分支选择语句Select Case Case
27、 Case Case Else End Select,3.ForNext循环结构For=To Step Exit For Next,Do While|Until Exit Do Loop,Do Exit Do Loop While|Until,4.DoLoop循环结构,作业,习题P82 2、3、6,附加题:字符串处理,例.统计文本框中英文单词的个数。算法设计:(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量WT表示所取字符是否是单词内的字符,初值设为False。(2)若所取字符不是“空格”、“逗号”、“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True,则表
28、示新单词的开始,让单词数Nw=Nw+1;让WT=True。(3)若所取字符是“空格”、“逗号”、“分号”或“感叹号”等单词的分隔符,则表示字符不是单词内字符,让WT=False。(4)再依次取下一个字符,重复(2)(3)步直到文本结束。,Private Sub Command1_Click()Nw=0:Wt=False nL=Len(RTrim(Text1.Text)strI=Text1.Text For i=1 To nL strT=Mid$(strI,i,1)取第i个字符 Select Case strT Case,;,!,(,)Wt=False,Case Else If Not Wt T
29、hen Nw=Nw+1 Wt=True End If End Select Next i Print 单词数为:,NwEnd Sub,统计单词方法一,n=0strold=s=Text1.TextFor i=1 To Len(s)strnew=UCase(Mid(s,i,1)If(strold Z)And(strnew=A And strnew=Z)Thenn=n+1End Ifstrold=strnewNext iPrint 单词个数;n,统计单词方法二,例.字符的加密和解密加密算法是:将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式:c=chr(Asc(c)+k)例如:设
30、序数k为5,这时 A F,a f,B G 当加序数后的字母超过Z或z则 c=Chr(Asc(c)+k-26)例如:You are good Dtz fwj ltti 解密算法:解密为加密的逆过程 将每个字母C减(或加)一序数K,即 c=chr(Asc(c)-k),例如:序数k为5,这时 ZU,zu,YT当加序数后的字母小于A或a则 c=Chr(Asc(c)-k+26),i=1:strp=nL=Len(RTrim(Text1.Text)strI=Text1.Text Do While(i=A And strT Asc(Z)Then iA=iA-26 strp=strp&Chr$(iA)ElseI
31、f(strT=a And strT=z)Then iA=Asc(strT)+5,If iA Asc(z)Then iA=iA-26 strap=strp&Chr$(iA)Else strp=strp&strT End If i=i+1 Loop Print strpEnd Sub,迭代法在数学上也称“递推法”,凡是由一给定的初值,通过某一算法(公式)可求得新值,再由新值按照同样的算法又可求得另一个新值,这样经过有限次即可求得其解。,数学题:迭代法,例.用迭代法求某个数的平方根。已知求a的平方根的迭代公式为:,算法思想如下:设a的平方根的解为x,可假定一个初值x0=a/2(估计值),根据迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1x0,重新按原来的方法求x1,重复这一过程直到|x1-x0|(某一给定的精度)。此时可将x1作为问题的解。,程序代码见下页:,Private Sub Form_Click()Dim x As Single,x0 As Single,x1 As Single,a As Single a=Val(InputBox(输入一个数a=?)If Abs(a)0.00001 x0=x1 在这行后面加Print x1看看结果。x1=0.5*(x0+a/x0)Loop x=x1 End If,Print xEnd Sub,