第3章选择结构主要内容:1:关系运算及关系表达式2:逻辑运算及逻辑表达式3:If语句4:SelectCase语句5:框架、单选按钮、复选框例2.3求三角形面积题目:根据海伦公式计算任意三角形的面积。海伦公式为2/)(,))()((cbatctbtattsPrivateSubCommand1_Click()DimaAsSingle,bAsSingle,cAsSingleDimtAsSingleDimsAsSinglea=Val(Text1.Text)b=Val(Text2.Text)c=Val(Text3.Text)t=(a+b+c)/2s=Sqr(t*(t-a)*(t-b)*(t-c))Text4.Text=sEndSub分析思考上述程序代码是否存在问题?有问题!问题是:用户输入的三个数值是否一定能构成三角形?答案是:不一定三角形三边的关系:任意两边之和大于第三边如何在程序中表示上述判断对应的VB语言描述如下:a+bcAndb+caAndc+ab这是一个逻辑表达式,其中包含了关系运算和逻辑运算关系运算符与关系表达式关系运算符运算符含义举例=等于45=45结果是True大于5060结果是False=大于等于7=14/2结果是True小于catbat结果是False=小于等于16-2=14结果是True不等于3030结果是FalseLike字符串匹配abcLikea*结果是TrueIs对象比较Form1IsForm2结果是False关系运算符与关系表达式说明1)关系运算又称比较运算,是计算参与运算的两个量之间是否满足指定关系,若满足,则关系运算结果为True,或关系表达式的值为True;反之若不满足,关系运算结果为False,或关系表达式的值为False2)关系表达式就是用关系运算符将常量、变量、函数或算术表达式连接起来的式子。3)关系运算符优先级相同关系运算符与关系表达式说明4)数值类型的数据直接比较大小5)字符串类型的数据按其ASCII码值比较。比较时,从两字符串的第一个字符开始逐一比较,第一个字符值大的字符串大,若相同,则比较第二个字符,依次类推,直到得到结果常见字符值的大小规律:空格0…9…A…Z…a…z汉字6)日期型数据看成“yyyymmdd”的8位整数比较大小,即后面的日期大于前面的日期32486597逻辑运算符与逻辑表达式逻辑运算符运算符含义举例Not逻辑非Not(ab)结果是FalseAnd逻辑与34And36结果是FalseOr逻辑或56Or51结果是TrueXor逻辑异或56Xor51结果是FalseEqv逻辑等于abEqvcd结果是TrueImp逻辑蕴涵103Imp1015结果是False逻辑运算符与逻辑表达式说明1)逻辑运算也称布尔运算。运算结果为True或False。其运算的规则如下页逻辑运算真值表所示。其中,a、b表示两个逻辑量2)逻辑表达式就是用逻辑运算符将若干逻辑量连接起来的式子。逻辑量主要是关系表达式,特别的也可以常量、变量、算术表达式。逻辑运算符与逻辑表达式逻辑运算真值表abaAndbaOrbNotaaXorbaEqvbaImpbTrueTrueTrueTrueFalseFalseTrueTrueTrueFalseFalseTrueFalseTrueFalseFalseFalseTrueFalseTrueTrueTrueFalseTrueFalseFalseFalseFalseTrueFalseTrueTrue逻辑运算符与逻辑表达式说明3)逻辑运算符的运算优先级Not→And→Or→Xor→Eqv→Imp4)逻辑表达式的求值逻辑表达式中可能含有逻辑运算、关系运算和算术运算,那么它们的运算优先级如何呢?从高到低:算术运算→关系运算→逻辑运算小测验:计算下列逻辑表达式的值题目:4*22Or2^39AndNot5-42第一步:82Or89AndNot12第二步:TrueOrFalseAndNotTrue第三步:TrueOrFalseAndFalse第四步:TrueOrFalse第五步:True小测验:用VB语言描述下列命题a比b小或者比c小a和b中有一个小于ca和b中只有一个小于ca是奇数a不能被b整除abOracacOrbcaMod2=1aModb0acAndb=cOrbcAnda=c小测验写出数学不等式2≤x≤3对应的VB表达式错误:2=x=3在VB中,相当于(2=x)=3,其值固定为True原因:所有非0数可视为True,0视为False;反之,True视为-1,False视为0正解:x=2Andx=3写出下列表达式的值352531其值为:True其值为:False选择结构可将例2.3部分改写为:如果a+bcAndb+caAndc+ab那么计算t计算s输出s否则显示信息输入有误结束上述文字描述转化为VB语句为Ifa+bcAndb+caAndc+abThent=(a+b+c)/2s=Sqr(t*(t-a)*(t-b)*(t-c))Text4.Text=sElsePrint输入有误!EndIf上述我们称其为If语句,它是选择结构语句选择结构在执行选择结构语句时,需要先对某个条件进行判断,再根据判断结果为真或为假而执行相应分支的语句好像路人在岔路口时面临选择的情况,故名选择结构,又名分支结构特点多次执行该程序时,两个分支都有可能被执行到;但每一次执行时,只能有一个分支被执行条件语句序列A语句序列BTrueFalse语句X语句YIf语句格式一:If条件Then语句1[Else语句2]格式二:If条件Then语句序列1[Else语句序列2]EndIf行If语句块If语句说明1)行If是所有语句都写在一行上,故名。它没有EndIf部分;块If是多行书写格式,故名,EndIf不能缺少2)条件部分通常是关系表达式或逻辑表达式,并统称它们为条件表达式。特别的,也可以是算术表达式,此时非0值为真,0为假。3)执行If语句时,首先测试条件表达式的值,然后根据其值来选择Then或Else部分的分支执行,最后执行If语句后面的语句。4)Else部分可以省略,表示当条件不成立时不执行任何语句5)如果分支中语句只有一句,则通常写成行If语句;若分支中语句较多,则写成块If语句小测验题目:执行下列程序段后,变量X的值是多少DimxAsInteger,yAsIntegerx=100y=30IfxyThenx=x-yElsex=x+y变量x的值为130题目:下列程序段运行的结果是DimAAsInteger,IAsIntegerA=75IfA60ThenI=1IfA70ThenI=2IfA80ThenI=3IfA90ThenI=4PrintI=;I运行结果是:I=2例3.1求三个数中最大数题目:输入三个数a、b、c,求出它们中间的最大值。程序运行界面如下图所示。分析思考(画出流程图)程序源代码PrivateSubCommand1_Click()DimaAsInteger,bAsIntegerDimcAsInteger,mAsIntegera=Val(Text1.Text)b=Val(Text2.Text)c=Val(Text3.Text)IfabThenm=a'm用来存放较大值Elsem=bEndIfIfcmThenm=cText4.Text=mEndSub思考:如何求4个数的最大值?5个数?N个数?例3.2三个数排序题目:输入三个数,将它们从大到小排序。程序界面如下图所示:分析思考(画出流程图)程序源代码PrivateSubCommand1_Click()DimaAsSingle,bAsSingle,cAsSingle,tAsSinglea=Val(Text1.Text)b=Val(Text2.Text)c=Val(Text3.Text)IfabThen'本If语句实现a=bt=a:a=b:b=tEndIfIfacThen'本If语句实现a=ct=a:a=c:c=tEndIfIfbcThen'本If语句实现b=ct=b:b=c:c=tEndIfText4.Text=a&,&b&,&cEndSub例3.3分段函数题目:有如下数学函数要求输入x,输出相应的y。分析思考(画出流程图)y=1(x0)0(x=0)-1(x0)程序源代码PrivateSubCommand1_Click()DimxAsSingle,yAsSinglex=Val(Text1.Text)Ifx0Theny=1ElseIfx=0Theny=0Elsey=-1EndIfEndIfText2.Text=yEndSubIf嵌套:在If语句的Then部分或Else部分包含其他If语句带有ElseIf的If语句当出现多层If语句嵌套时,程序会显得冗长,可以使用带有ElseIf的If语句来处理。格式如下:If条件1Then语句序列1ElseIf条件2Then语句序列2…[Else其他语句序列]EndIf说明1)格式中,ElseIf子句部分可以有任意多个,Else子句部分可以省略,若有则必须在所有ElseIf子句之后,表示无条件执行2)执行该If语句时,首先测试条件1,若成立,则执行对应的Then部分语句,然后跳出If语句,继续执行EndIf后面的语句;反之,若条件1不成立,则测试条件2,如其成立则执行对应语句,若不成立则测试条件3,依此类推。若所有条件都不成立,则执行Else部分语句改写例3.3PrivateSubCommand1_Click()DimxAsSingle,yAsSinglex=Val(Text1.Text)Ifx0Theny=1ElseIfx=0Theny=0ElseIfx0Theny=-1EndIfText2.Text=yEndSub或者写为Ifx0Theny=1ElseIfx=0Theny=0Elsey=-1EndIf分析思考X的取值情况Y=-1Y=0Y=10=00说明上页的流程图其实有三个分支。其实很多实际问题中不是仅仅包括两个分支,而是存在多分支的选择。例如百分制成绩转换为五级制通常,双分支问题用If语句处理;三分支问题用If语句嵌套处理;多分支问题则用带有ElseIf子句的If语句处理。此外,还可以用SelectCase语句处理。SelectCase语句格式SelectCase测试表达式Case值1语句序列1[Case值2语句序列2]……[CaseElse其他语句序列]EndSelect说明1)测试表达式可以是任何变量、常量、算术表达式、关系表达式、逻辑表达式。2)以Case开头的部分称为Case子句,它举出了测试条件可能的取值或取值范围,以及对应的需要执行的语句序列。Case子句列举值的方式有三种Case值1,值2,…如Case1,3,5,7Case值1To值2如Case1To7CaseIs关系运算符值1如CaseIs7也可以在方式1中包含方式2和方式3,如Case1,2To6,Is9注意:各Case子句所举值范围不能有重复!说明3)Case子句的个数不确定,根据实际问题而定。CaseElse可有可无,若有则一定放在整个SelectCase语句的最后,即EndSelect的前面,表示其他未列出的测试条件取值。4)执行时,先计算测试条件的值,然后将该值依次与每个Case子句列举的值进行比较,如果符合某个Case子句列举的值,就执行该Case子句的对应的语句序列,然后跳出Select语句,执行EndSelect后面的语句。如果没有相符合的Case值,则执行CaseElse中的语句序列,然后跳出Select语句。如果也没有CaseElse部分,则不执行任何语句,跳出Select语句。用Select语句改写例3.