第4章分支结构.docx
- 文档编号:30404566
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:26
- 大小:529.62KB
第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
Printa;"、";b;"与";c;"之中最大值是:
"
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=")
Ifa a=b: b=t Ifa a=c: c=t Ifb b=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.Left Label1.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.Left Image1.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张公鸡的图片。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分支 结构