江苏省二级VB第五章 选择分支与循环嵌套.docx
《江苏省二级VB第五章 选择分支与循环嵌套.docx》由会员分享,可在线阅读,更多相关《江苏省二级VB第五章 选择分支与循环嵌套.docx(25页珍藏版)》请在冰豆网上搜索。
江苏省二级VB第五章选择分支与循环嵌套
第五章选择分支与循环嵌套
5.1分支结构与分支结构语句(2个例子)
5.2循环结构与循环结构语句(6个例子)
5.3程序实例(10个例子)
习题练习(11个例子)
5.1分支结构与分支结构语句
5.1.1IF-Then-Else-EndIf结构语句
结构一般如下:
IfeThen
[A组语句]
Else
[B组语句]
EndIf
e为判决条件,可以是逻辑变量,关系表达式或逻辑表达式。
当A组语句仅有一个时,可简化为:
IfeThen<语句>
例如,程序代码:
IfText1.Text=“”Then
Text1.SetFocus
EndIf
可以简化为:
‘当文本框中文本为空时,则使得文本框成为焦点。
IfText1.Text=“”ThenText1.Setfocus(省去EndIf)
较为复杂的结构如下:
Ife1Then‘如果e1为True,则执行A1组语句
A1组语句
ElseIfe2Then‘如果e2为True,则执行A1组语句
A2组语句
…
EndIf
[例题5-1]已知三角形的三边长度,设计求此三角形面积的程序。
问题分析:
a+b>c&a+c>b&b+c>a,S=sqr(p(p-a)(p-b)(p-c)),p=(a+b+c)/2
算法设计:
开始——输入a、b、c——判断a+b>c&a+c>b&b+c>a,通过则求p,求S,否则提示:
“输出数据错误信息”——结束。
设计程序代码如下:
PrivateSubCommand1_Click()
DimaAssingle,bAssingle,cAssingle
a=Val(Text1.text)‘Text属性为字符串型,转为数值型
b=Val(Text2.text)
c=Val(Text3.text)
Ifa+b>canda+c>bandb+c>aThen
p=(a+b+c)/2
s=sqr(p*(p-a)*(p-b)*(p-c))
Text4.text=CStr(s)‘数值型,转为字符串型,不使用,则自动强制转换
Else
Text4.text=“数据错误”
EndIf
EndSub
PrivateSubCommand2_Click()‘结束程序
End
EndSub
PrivateSubCommand3_Click()‘清除原有数据
Text1.text=“”
Text2.text=“”
Text3.text=“”
Text4.text=“”
Text1.SetFocus
EndSub
[例题5-2]一个有多个分支的示例程序数学表达式:
,试写出该程序。
程序界面设计:
两个文本框和一个命令按钮及相应的说明标签,文本框1中输入测试数据,单击命令按钮,在文6本框2给出测试结果。
PrivateSubCommand1_Click()
DimxasInteger
x=Val(Text1.Text)
Ifx<1Then
Text2.Text=“这是小于1的数”
ElseIfx<=10Then
Text2.Text=“这是1到10之间的数”
EndIf
EndSub
5.1.2Select-Case-End-Select结构语句
一般形式如下:
SelectCasee‘e为测试表达式
Casec1‘c1是测试项,可取
(1)具体数值(当表达式为算数表达式时)
A组语句
(2)连续的数据范围(8To20,BToH)
Casec2(3)满足某个判决条件(Is>20,Is<“P”)
B组语句(4)多个范围的组合
…
CaseElse
n组语句
EndSelect
例题5-2的程序代码也可用本结构语句实现:
PrivateSubCommand1_Click()
DimxasInteger
x=Val(Text1.text)
SelectCasex
CaseIs<1
Text2.Text=“这是小于1的数”
Case1To10
Text2.Text=“这是1到10之间的数”
CaseElse
Text2.Text=“这是大于10的数”
EndSelect
EndSub
5.2循环结构与循环结构语句
循环语句按结构分:
当型结构和直到型
True
False
True
False
结构的区别仅仅是False和True位置交换,下为当型的两种结构:
A
5.2.1Do-Loop循环语句结构
四种结构形式:
(1)DoWhilee
(2)Do
……
[ExitDo][ExitDo]
……
LoopLoopWhilee
(3)DoUntile(4)Do
……
[ExitDo][ExitDo]
……
LoopLoopUntile
前两种为当型结构,后两种为直到型结构,Do语句Loop语句之间为循环体语句,循环体语句包含一条或多条ExitDo语句,如果程序执行到ExitDo语句,就会直接退出循环,转而执行Loop语句的下一条语句。
[ExitDo]语句最常用的形式是与If-Then结合,即为:
IfeThenExitDo
在执行循环体时,如果条件e被满足,则执行ExitDo语句,直接退出循环。
[例题5-3]设计采用欧几里得算法求解两个自然数的最大公约数的程序。
问题分析及界面设计:
界面参照例题5-1,算法如下:
@例题2-1求两个自然数的最大公约数的算法。
(辗转相除法)
S1.输入两个自然数M、N;
S2.求M除以N的余数R;
S3.使得M=N,即为N替换M;
S4.使得N=R,即为R替换N;
S5.如果R
0,则重复执行S2、S3、S4(循环),否则转S6
S6.输出M,M即为M、N的最大公约数。
程序设计如下:
PrivateSubCommand1_Click()
DimmasLong,nasLong
DimrasLong
m=Val(Text1.Text)‘取数据m
Basic实现
INPUTm,n
DO
r=mMODn
m=n
n=r
LOOPUNTILr=0
PRINTm
END
n=Val(Text2.Text)‘取数据n
Ifm<1Orn<1Then‘检验数据合法性
Text3.Text=“数据错误!
”
Else
Do‘求最大公约数
r=mModn
m=n
n=r
LoopUntilr=0
Text3.Text=Csr(m)
EndSub
PrivateSubCommand3_Click()‘清除原有数据
Text1.text=“”
Text2.text=“”
Text3.text=“”
Text4.text=“”
Text1.SetFocus
EndSub
PrivateSubCommand3_Click()
End
EndSub
5.2.2For-Next循环结构语句
如果事先知道循环次数,则可使用For-Next循环结构语句,它的一般形式如下:
Forv=e1toe2[Stepe3]
…
[ExitFor]‘e1为初值,判别v是否超过e2,若超过,退出循环,执行Next语句的下条。
…
Nextv‘执行Next语句,系统执行下述操作:
v=v+e3
‘v是循环控制变量,应为整型或单精度型;e1、e2、e3为控制循环的参数。
e1为初值,e2为终值,e3为步长(e1=1时可省)。
For-Next循环的正常循环次序可用下式计算:
循环次数=Int((e2-e1)/e3)+1
如下面程序代码:
PrivateSubForm_Click()
Fori=1To10Step2
Printi;
Nexti
Print“i=”;i
EndSub
[例题5-4]求1~10这十个数的和与连乘积的程序。
OptionExplicit
PrivateSubForm_Click()
DimiAsInteger,sAsInteger
s=0
Print"s=";
Fori=1To10
s=s+i
Ifi<10Then
Printi;"+";
Else
Printi;"=";
EndIf
Nexti
Prints
f=1
Print"f=";
Fori=1To10
f=f*i
Ifi<10Then
Printi;"*";
Else
Printi;"=";
EndIf
Nexti
Printf
EndSub
[例题5-5]一个从由字母、数字组成的字符串中找到所有大写字母并逆序输出。
界面设计:
两个文本框,三个按钮,一筛选,一清除,一结束
思路分析:
从一个字符串找出符合要求的字符是采取对字符串的每一个字符逐个筛选的方法实现的,利用Mid函数可从字符串中提取单个字符,循环控制处理过程,循环的终值使用Len函数;对于符合要求的字符采用连接运算组成新字符串;逆序输出则是过从后往前逐个提取字符再连接
OptionExplicit
PrivateSubCmd1_Click()
DimaasString,dasString,tasString’
DimIasInteger
Text1.setFocus
a=Text1.Text‘前期准备
ForI=1toLen(a)
IfMid(a,I,1)>=“A”AndMid(a,I,1)<=“Z”Then
t=t&Mid(a,I,1)‘从字符串a左边第I个位置开始向右取一个字符
EndIf
NextI
ForI=Len(t)to1Step-1
d=d&Mid(t,I,1)
NextI
Text2.Text=d
EndSub
PrivatesubCmd2_Click()
Text1.Text=“”
Text2.Text=“”
Text1.SetFocus
EndSub
PrivatesubCmd3_Click()
End
EndSub
PrivatesubForm_Load()
MsgBox“本程序的功能是将一个从由字母、数字组成的字符串中找到所有大写字母并逆序输出”,“示例程序”
EndSub
5.2.3循环嵌套
大循环套小循环,小循环一定包含在大循环之内,而不得相互交叉。
程序示例:
PrivateSubForm_Click()
Fori=1to9
Forj=1to9
Printi;“*”;j;“=”;i*j
Nextj
Print
Nexti
EndSub
[例题5-6]一个模拟摇奖器的程序。
设有100个人中签,要从中找出中奖人。
由机器自动产生1000个1~100间的数据,第1000个随机数据即为中奖人的号码。
问题分析:
产生0~1之间随机数的函数Rnd(x),其中0=在调用Rnd(x)函数之前,可先使用无参数的Randomize语句初始化随机数生成器,该生成器具有从系统计时器获得的种子。
为生成某个范围内的随机整数,可使用下列公式:
Int((upperbroad-lowerbroad+1)*Rnd+lowerbroad),则产生1~100随机数:
Int((100-1+1)*Rnd+1)
界面及算法设计:
两个按钮,一产生随机数,一退出,对应一个文本输出PrivateSubComd1_Click()
DimImAsInteger,iAsInteger,jAsInteger,aAsInteger
Randomize
Fori=1To1000‘取第1000个随机数
Im=Int(100*Rnd)+1‘产生1~100之间的随机数
a=0
Forj=1To1000‘产生1000次随机数
a=a+1
Nextj
Text1.Text=CStr(Im);
Text1.Refresh‘刷新前999次,保留最后一次
Nexti
Text1.Text=CStr(Im)
EndSub
PrivateSubComd2_Click()
End
EndSub‘本程序采用两重嵌套的循环
5.3程序示例
[例题5-7]一个简单的函数计算器程序。
设计思路:
一个是设计基本函数程序,包括输入按钮和两个文本边框;一个是设计出错提示,包括未输入值和数据超出定义域的情况。
程序中使用的IsNumeric(s)函数用于检测自变量是否是一个可转化成数值的数字串,如果是返回逻辑值True,否则返回False
函数:
Exp、Log()、Sqr(求开方)、Sgn(求x的符号)
程序代码如下:
OptionExplicit
DimXasSingle
模块模板如下:
PrivateSubCmd1_Click()
IfText1.Text=””Then
MsgBox””
Text1.SetFocus
ElseIfIsNumeric(Text1.Text)Then
X=Val(Text1.Text)
Else
MsgBox”输入数据错误!
”,48+vbOKOnly,”程序示例”
Text1.Text=””
EndIf
EndSub
PrivateSubCmd1_Click()‘求Exp(X)
IfText1.Text=“”Then
MsgBox”请输入X的值!
”,48+vbOKOnly,”程序示例”
Text1.SetFocus
ElseIfIsNumeric(Text1.Text)Then
X=Val(Text1.Text)
Label2.Caption=“Exp(X)=:
”
Text2.Text=Str(Exp(X))
Else
MsgBox”输入数据错误!
”,48+vbOKOnly,”程序示例”
Text1.Text=“”
EndIf
EndSub
PrivateSubCmd2_Click()‘求Log(X)
IfText1.Text=“”Then
MsgBox”请输入X的值!
”,48+vbOKOnly,”程序示例”
Text1.SetFocus
ElseIfIsNumeric(Text1.Text)AndVal(Text1.Text)>0Then
X=Val(Text1.Text)
Label2.Caption=“Log(X)=”
Text2.Text=Str(Log(X))
Else
MsgBox”输入数据错误!
”,48+vbOKOnly,”程序示例”
Text1.Text=“”
Text1.SetFocus
EndIf
EndSub
PrivateSubCmd3_Click()‘求Sqr(X)
IfText1.Text=“”Then
MsgBox”请输入X的值!
”,16+vbOKOnly,”程序示例”
Text1.SetFocus
ElseIfIsNumeric(Text1.Text)AndVal(Text1.Text)>0Then
X=Val(Text1.Text)
Label2.Caption=“Sqr(X)=”
Text2.Text=Str(Sqr(X))
Else
MsgBox”输入数据错误!
”,48+vbOKOnly,”程序示例”
Text1.Text=“”
Text1.SetFocus
EndIf
EndSub
PrivateSubCmd4_Click()‘求Sgn(X)
IfText1.Text=“”Then
MsgBox”请输入X的值!
”,48+vbOKOnly,”程序示例”
Text1.SetFocus
ElseIfIsNumeric(Text1.Text)AndVal(Text1.Text)>0Then
X=Val(Text1.Text)
Label2.Caption=“Sgn(X)=”
Text2.Text=Str(Sgn(X))
Else
MsgBox”输入数据错误!
”,48+vbOKOnly,”程序示例”
Text1.Text=“”
Text1.SetFocus
EndIf
EndSub
PrivateSubCmd5_Click()
Text1.Text=“”
Text2.Text=“”
Label2.Caption=“”
Text1.SetFocus
EndSub
PrivateSubCmd6_Click()
End
EndSub
[例题5-8]编写一个按月收入额计算个人收入调节税的应用程序。
计税公式如下:
Tax=
式子中,income为纳税人的月收入。
界面设计与思路:
输入、输出文本框各一个,选择框一个,按钮三个。
设计代码如下:
OptionExplicit
PrivateSubCommand1_Click()
DimTaxAsSingle,incomeAsSingle
income=Val(Text1.Text)
IfCheck1.Value=1Orincome<=1600Then
Tax=0
ElseIfincome<=2100Then
Tax=(income-1600)*0.05
ElseIfincome<=3600Then
Tax=(income-1600)*0.1-25
ElseIfincome<=6600Then
Tax=(income-1600)*0.15-125
ElseIfincome<=21600Then
Tax=(income-1600)*0.2-375
ElseIfincome<=41600Then
Tax=(income-1600)*0.25-1375
ElseIfincome<=61600Then
Tax=(income-1600)*0.3-3375
ElseIfincome<=81600Then
Tax=(income-1600)*0.35-6375
ElseIfincome>101600Then
Tax=(income-1600)*0.45-15375
EndIf
Text2.Text=Tax
EndSub
PrivateSubCommand2_Click()
Text1.Text=""
Text2.Text=""
Text1.SetFocus
EndSub
PrivateSubCommand3_Click()
UnloadMe
EndSub
[例题5-9]编写程序,找出所有三位数水仙花数。
所谓水仙花数,是指各位数字的立方和等于该数本身的数。
例如:
153=1
+3
+5
,所以153是一个水仙花数。
改错:
PrivateSubCommand1_Click()
DimiAsinteger,aAsInteger,bAsInteger,cAsInteger,eAsLong
Fori=100To999‘取三位数
a=Int(Val(i/100))
b=Int(Val(i-a*100)/10)
c=i-a-b
e=a^3+b^3+c^3
Ife=ithen
Text1.Text=CStr(e)
Nexti
Text1.Text=CStr(e)
EndSub
PrivateSubCommand2_Click()
End
EndSub
方法一:
(三位数依次循环)
PrivateSubCommand1_Click()
DimiAsLong,aAsLong,bAsLong,cAsLong,eAsLong,fAsString
Fori=100To999
a=i\100
b=(i-a*100)\10
c=i-a*100-b*10
e=a^3+b^3+c^3
Ifi=eThen
f=I&”=”&”^3+”&b&”^3+”&c&”3”
List1.AddItemf
EndIf
Nexti
EndSub
方法二:
(三位数每位循环一次)
OptionExplicit
PrivateSubCommand1_Click()
DimiAsInteger,aAsInteger,bAsInteger,cAsInteger,eAsInteger,fAsString
Fora=1To9
Forb=0To9
Forc=0To9
e=a^3+b^3+c^3
i=100*a+