第4章分支结构.docx
《第4章分支结构.docx》由会员分享,可在线阅读,更多相关《第4章分支结构.docx(26页珍藏版)》请在冰豆网上搜索。
第4章分支结构
第4章分支结构
我们在处理问题的过程中,经常会碰到需要根据不同条件进行不同处理的事情
例如:
现在需要设计一个程序,处理下面问题:
求变量的x的绝对值
x当x>=0
|x|=
-x当x<0
分支结构有两种语句:
IF
Selectcase
§1单行结构条件语句
一、格式:
If<条件>Then<语句1>[Else<语句2>]
二、功能:
如果“条件”为True,执行“语句1”,否则执行“语句2”。
Else缺省时:
如果“条件”为True,执行“语句1”,否则执行后继语句。
三、说明:
1、其中“条件”通常是关系表达式或布尔表达式,也可以是数值表达式。
若为数值表达式,则非0为真,0为假。
2、单行条件结构语句要求在一行内书写完毕,即不能超过一行1023个字符的限度。
其中:
语句1和语句2可以是单个语句,也可以是冒号分隔的多个语句序列。
当语句1或语句2中又包含条件语句时,成为条件语句的嵌套,嵌套深度没有限制。
但受到语句行长度的限制。
四、举例
例4_1_1输入三个数a,b,c,输出三者之中最大者。
1.分析:
问题可以描述为:
1)输入三个数值
2)从中找出最大值
3)输出结果
2.细化:
1)界面设计
2)算法设计
1、用InputBox函数把三个数值输入到变量a,b,c中
2、首先假设a最大,放在变量max中,然后分别与b,c进行比较,保留其中最大的数在变量max中。
3、用Print方法输出max的值。
3)事件代码编写:
OptionExplicit
PrivateSubCommand1_click()
Dima!
b!
c!
max!
a=InputBox("请输入第一个数:
")
b=InputBox("请输入第二个数:
")
c=InputBox("请输入第三个数:
")
max=a'设a为最大值
Ifb>maxThenmax=b'比较后保留最大值
Ifc>maxThenmax=c
Print
Printa;"、";b;"与";c;"之中最大值是:
"
Print
Printmax
EndSub
PrivateSubCommand2_click()
End
Endsub
例4_1_2输入系数a,b编程序解方程ax+b=0
分析:
当a≠0时,x=-b/a;
当a=0,b≠0时,方程无解。
因为用0作除数会产生溢出的运行错误。
所以在计算x的值之前,要先判断a是否为0.
事件过程:
PrivateSubCommand1_Click()
Dima!
b!
x!
a=Val(InputBox("请输入系数a:
"))
b=Val(InputBox("请输入系数b:
"))
Ifa<>0Thenx=-b/a:
Print"x=";xElsePrint"方程无解"
EndSub
1X>0
例4_1_3计算SgnX=0X=0
-1X<0
事件过程:
PrivateSubCommand1_Click()
Dimx!
y%
x=Val(InputBox("请输入x的值:
"))
Ifx>=0Thenifx=0Theny=0elsey=1elsey=-1
Print“X=”;x,”Y=”;y
EndSub
五、使用IIF函数
可以用IIF函数实现一些较简单的分支结构。
1、格式:
IIF(<条件>,<表达式1>,<表达式2>)
2、功能:
条件为真时,返回<表达式1>的值,否则,返回<表达式2>的值。
例如,例4_1_3可以改为:
PrivateSubCommand1_Click()
Dimx!
y%
x=Val(InputBox("请输入x的值:
"))
y=IIf(x>=0,IIf(x=0,0,1),-1)
Print“X=”;x,”Y=”;y
EndSub
§2块结构条件语句
当行结构条件语句中,如果条件分支执行的操作比较复杂,不能在一个逻辑行内书写完毕,可以使用块结构条件语句。
一、一般格式:
If<条件1>Then
<语句块1>
[Elseif<条件2>Then‘elseif必须写在一起
<语句块2>]
[Elseif<条件3>Then
<语句块3>]
。
。
。
。
。
[Else
<语句块n>]
Endif
二、功能:
块结构条件语句的功能是:
如果“条件1”为True,执行“语句块1”;否则,如果“条件2”为True,执行“语句块2”;...;否则执行”语句块n”。
三、说明:
1.在VB中,通常把数值表达式看成为逻辑表达式的特例,非0值表示True,0表示False。
即条件语句中的“条件”不但可以是逻辑表达式或关系表达式,还可以是数值表达式。
例如:
If2then
Print“True”
Else
Print“False”
Endif
2.“语句块”中的语句不能与其前面的Then写在同一行上,否则VB认为是一个单行结构的条件语句。
对于块结构语句,必须以EndIF结束,而单行结构不需要Endif
3.当省略Elseif子句和Else子句时,块结构条件语句简化为:
If<>Then
<>
Endif
可见,块结构条件语句完全可以代替单行结构条件语句。
四、举例
例4_2_1例3_3_3、鸡兔同笼问题。
鸡有两条腿,兔子有四条腿。
已知鸡和兔子一共有h只,总腿数有f条,问鸡、兔各有多少只?
分析:
设鸡有x只,兔有y只,则
x+y=h
2x+4y=f
整理,得:
X=2H-F/2
Y=F/2-H
从上面的式子可看到,如果要保证X和Y是非负整数,F必是偶数,H是整数,而且要满足:
2H≤F≤4H
1.程序:
PrivateSubCommand1_Click()
DimhAsInteger,fAsInteger,xAsInteger,yAsInteger
h=InputBox("输入头数:
")
f=InputBox("输入脚数:
")
IffMod2=0And2*h<=fAndf<=4*hThen
x=2*h-f/2
y=f/2-h
Printh;"个头:
",f;"只脚:
"
Print"鸡有:
";x;"只"
Print"兔有:
";y;"只"
Else
Print“输入的值不能满足条件!
!
”
EndIf
Endsub
试输入:
51,176
例4_2_2从键盘上输入三个数,若这三个数能构成三角形的三条边,则求这个三角形的面积;否则打印相应的错误信息。
1.分析:
三个数能构成三角形的三条边长的充分必要条件是:
1)三个数均大于0
2)任意两条边的和大于第三边
2.程序:
PrivateSubCommand1_Click()
DimaAsSingle,bAsSingle,cAsSingle
DimpAsSingle,sAsSingle
DimtAsBoolean
Cls
a=InputBox("请输入三角形的第一条边:
")
b=InputBox("请输入三角形的第二条边:
")
c=InputBox("请输入三角形的第三条边:
")
t=a>0Andb>0Andc>0
t=tAnd(a+b>cAndb+c>aAnda+c>b)
IftThen
p=(a+b+c)/2
s=Sqr(p*(p-a)*(p-b)*(p-c))
Print"三角形的三条边长:
";a;b;c
Print"三角形的面积为:
";s
Else
Print"数据无效!
不能构成三角形!
"
EndIf
EndSub
例4_2_3求一元二次方程Ax2+Bx+C=0的根,A≠0
1.分析:
>0两个实根
b2-4ac=0两个相同实根
<0一对共轭复根
2.程序
PrivateSubcommand1_click()
Dima!
b!
c!
m!
n!
a=Val(InputBox("a="))
b=Val(InputBox("b="))
c=Val(InputBox("c="))
ifa<>0then
m=b^2-4*a*c
n=-b/2/a
Ifm>=0Then
Print"x1=";n+Sqr(m)/2/a
Print"x2=";n-Sqr(m)/2/a
Else
Print"x1=";n;"+i";Sqr(-m)/2/a
Print"x2=";n;"-i";Sqr(-m)/2/a
Endif
Else
Print“a=”;a;”错误!
!
”
EndIf
EndSub
例4_2_4输入一个数值(0~6),用中文显示是星期几。
分析:
使用日期函数WeekDayName()
程序:
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
Dimx$
x=Chr(KeyAscii)
Ifx<"0"Orx>"6"Then
Text1.Text=""
Label1.Caption="输入数字"&vbCrLf&"(0~6)"
Else
Text1.Text=""
Label1.Caption=WeekdayName(Val(x)+1)
EndIf
EndSub
PrivateSubForm_Load()
Label1.Caption="输入数字"&vbCrLf&"(0~6)"
EndSub
§3情况语句
当程序具有多个分支时,使用情况语句更为清晰。
一、格式:
SelectCase<测试条件>
[Case<表达式表列1>
[<语句块1>]]
[Case<表达式表列2>
[<语句块2>]]
……
[caseelse
[<语句块n+1>]]
EndSelect
二、功能:
根据”测试条件”值(亦称“测试表达式”),从多个语句块中选择符合条件的一个语句块执行.
先对”测试表达式”求值,然后顺序测试该值与哪一个case子句中的”表达式表列”相匹配;如果找到了,则执行该case分支有关的语句块,然后把控制转移到EndSelect后面的语句;如果没有找到,则执行caseelse分支有关的语句块,然后把控制转移到endselect后面的语句.
五、说明:
1.“测试条件”可以是数值表达式或字符串表达式,通常为变量.
2.“表达式表列”中的表达式必须与“测试条件”的类型相同
3.“表达式表列”称为域值,可以是下列形式或它们的组合
形式
示例
说明
表达式
Case100*a,1000
数值表达表或字符串表达式
表达式To表达式
Case1000To2000
Case“a”To“n”
指定一个值范围
Is关系式
CaseIs<3000
指定一个值范围
六、举例
例4_3_1求SgnX函数的值。
程序PrivateSubForm_Activate()
Dimx!
y%
x=Val(InputBox("x="))
SelectCasex
Case0
y=0
CaseIs>0
y=1
CaseIs<0
y=-1
EndSelect
Print"X=";x,"SgnX=";y
EndSub
例4_3_2(龚P82例4.3)已知输入某课程的百分制成绩mark,要求显示对应五级制的评定,评定条件如下:
优(mark>=90)
良(80<=mark<90)
等级=中(70<=mark<80)
及格(60<=mark<70)
不及格(mark<60)
程序PrivateSubForm_Activate()
Dimmark%,y$
mark=Val(InputBox("请输入成绩:
"))
SelectCasemark
CaseIs<60
y="不及格"
CaseIs<70
y="及格"
CaseIs<80
y="中"
CaseIs<90
y="良"
CaseElse
y="优"
EndSelect
Print"分数:
";mark
Print"等级:
";y
EndSub
例4_3_3(龚P83例4.4)将任意三个数按照大小顺序排列输出.
做法1:
穷举法
程序:
(P4_3_3a)
PrivateSubCommand1_Click()
Dima!
b!
c!
Cls
a=InputBox("a=")
b=InputBox("b=")
c=InputBox("c=")
Ifa>bAndb>cThenPrinta,b,c
Ifa>bAndb<=cAnda>cThenPrinta,c,b
Ifa>bAndb<=cAnda<=cThenPrintc,a,b
Ifa<=bAndb<=cThenPrintc,b,a
Ifa<=bAndb>cAnda>cThenPrintb,a,c
Ifa<=bAndb>cAnda<=cThenPrintb,c,a
EndSub
做法2:
起泡法
程序:
(P4_3_3c)
PrivateSubCommand1_Click()
Dima!
b!
c!
t!
Cls
a=InputBox("a=")
b=InputBox("b=")
c=InputBox("c=")
Ifaa=b:
b=t
Ifaa=c:
c=t
Ifbb=c:
c=t
Printa,b,c
EndSub
例4_3_4(龚P85例4.7)设计10以内四则运算题,当学生输入答案后,计算机能够判断答案是否正确,程序结束时给出成绩。
分析:
(1)操作数n1、n2和运算符n_op的值由RND函数随机给出;
(2)当给出答案后,在文本框中显示试题及答案正确与否;
(3)当结束计算时,显示得分结果。
(4)使用控件
label1:
显示题目
text1:
输入答案
text2:
显示题号、题目、计算结果、正确与否和最后显示得分
command1:
最后计算得分
(5)使用变量
n1、n2:
操作数
n_op:
运算符代码值
op:
运算符
r:
计算机运算结果值
t:
题号
n_c、n_e:
答案正确、错误的计数累加单元
程序:
Dimn_c%,n_e%,r#,t%
PrivateSubForm_Load()‘随机产生题目并在label1上显示
Dimn1%,n2%,n_op%,op$
Randomize
n1=Int(Rnd*10+1)
n2=Int(Rnd*10+1)
n_op=Int(Rnd*4+1)
SelectCasen_op
Case1
op="+":
r=n1+n2
Case2
op="-":
r=n1-n2
Case3
op="×":
r=n1*n2
Case4
op="÷":
r=n1/n2
EndSelect
Label1.Caption=n1&op&n2&"="
EndSub
'在Text1中输入答案后,计算机判断是否真确,并把结果显示在Text2上面
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
IfKeyAscii=13Then
t=t+1
Text2=Text2&"("&t&")"
IfVal(Text1.Text)=rThen
Text2=Text2&Label1.Caption&Text1&"√"&vbCrLf
n_c=n_c+1
Else
Text2=Text2&Label1.Caption&Text1&"×"&vbCrLf
n_e=n_e+1
EndIf
Text1=""
Text1.SetFocus
Form_Load
Text2.SelStart=Len(Text2)‘返回或设置所选择的文本的起始点
‘该属性在这里的作用是每当文本框内容改变时便以改变后的文本框的内容长度为起始点,即将输入焦点移动到文字最后
EndIf
EndSub
'单击Command1开始计分,并把得分结果显示在Text2上
PrivateSubCommand1_Click()
Label1=""
Text2=Text2&String(25,"_")&vbCrLf_
&"一共计算"&(n_c+n_e)&"道题,"_
&"得分:
"&Round(n_c/(n_c+n_e)*100)
Text2.SelStart=Len(Text2)
EndSub
§4计时器(P148)(龚P161)
VB可以利用系统内部的时钟计时,而且可以使用计时器(Timer)控件,由用户定制时间间隔(Interval),在每一个时间间隔触发一个计时器事件。
它的默认名称为TimerX(X=1、2、3…)。
一、属性
1.Interval
格式:
[<对象名>.]Interval[=<表达式>]
整数型。
用于返回或设定计时器触发事件的时间间隔。
时间间隔以毫秒为单位,取值范围0—65535毫秒。
因此,最大时间间隔不能超过65秒。
通常60000毫秒为1分钟,如果把Interval属性值设为1000,则表示每秒钟产生一个Timer事件。
如果希望每秒钟发生n个Timer事件,则Interval属性值为1000/n。
如果Interval属性值为0,则计时器无效。
2.Enabled
布尔型。
TrueTimer有效。
默认值
二、事件
Timer
计时器只支持Timer事件。
每当经过一个Interval属性规定的时间间隔,就触发一次Timer事件。
即自动执行一次Timer事件程序。
计时器主要用于在程序中监视和控制时间进程。
例4_4_1设计图形闪烁程序。
所谓闪烁,是指图形交替地显示和隐藏。
这可以通过
计时器的Timer事件过程,改变对控件的Visible属性达到目的。
程序:
PrivateSubCommand1_Click()
Timer1.Enabled=True‘Timer1.Interval=500
EndSub
PrivateSubCommand2_Click()
Timer1.Enabled=False
Picture1.Visible=True
EndSub
PrivateSubTimer1_Timer()
Picture1.Visible=NotPicture1.Visible
EndSub
例7.9(S7-9P162)用计时器控制蝴蝶动作
DimpickbmpAsBoolean
PrivateSubTimer1_Timer()
IfpickbmpThen
Image1.Picture=Image3.Picture
Else
Image1.Picture=Image2.Picture
EndIf
pickbmp=Notpickbmp
EndSub
PrivateSubCommand1_Click()
End
EndSub
例4_4_2设计流动字幕版(从右至左移动)。
分析:
设置两个命令按钮“开始”和“停止”,当按下“开始”,
将Timer1.Enabled=True,执行Timer事件程序,按下“停止”,
将Timer1.Enabled=False,停止执行Timer事件程序。
PrivateSubTimer1_Timer()
IfLabel1.Left+Label1.Width>0Then
Label1.Left=Label1.Left-50
Else
Label1.Left=Form1.Width
EndIf
EndSub
如果标签往右移动时,程序应改为:
(P4_4_2b)
PrivateSubTimer1_Timer()
IfLabel1.LeftLabel1.Left=Label1.Left+50
Else
Label1.Left=-Label1.Width
EndIf
EndSub
如果例7、9题使蝴蝶往右上方向飞,飞出窗体后,使它重定位到右下方再向右上方飞,程序怎样设计?
PrivateSubTimer1_Timer()
IfpickbmpThen
Image1.Picture=Image3.Picture
Else
Image1.Picture=Image2.Picture
EndIf
IfImage1.LeftImage1.Left=Image1.Left+Form1.Width/50
Image1.Top=Image1.Top-Form1.Height/50
Else
Image1.Left=-Image1.Width
Image1.Top=Form1.Height
EndIf
pickbmp=Notpickbmp
EndSub(S7-9P162a)
例4_4_3动画公鸡
分析:
设置两个计时器。
一个(Timer1)用于处理公鸡的图片变化。
设置8个图像框和7张公鸡的图片。