第3章控制语句与程序调试学习目标:掌握If条件语句和SelectCase选择语句掌握For…Next和Do…Loop循环语句掌握两重循环,了解多重循环了解Exit、End和Goto语句掌握程序的简单调试方法第3章控制语句与程序调试教学内容:3.1选择结构与相关语句3.2循环语句3.3其它语句3.4程序调试3.1选择结构选择结构:当设定条件成立时执行某些语句,条件不成立时则跳过这些语句或执行其它的语句。选择结构中要使用选择语句,有两路分支和多路分支两种情况,对应的选择语句有If语句(两路出口)和SelectCase语句(多路出口)。返回目录3.1选择结构-If条件语句1.If表达式Then语句其中,表达式是一个条件表达式或逻辑表达式例如,IfData=90ThenPrint“优秀”[例3.1]输入一个数,如果是3的倍数则通过消息框输出。PrivateSubForm_Click()DimDataAsIntegerData=InputBox(请输入一个值:)IfDataMod3=0ThenMsgBoxDataEndSub返回目录Data是3的倍数Data=90?输出“优秀”YesNoData=90?输出“优秀”YesNo输出“合格”输出“计算完毕”3.1选择结构-If条件语句2.If表达式Then语句1Else语句2例如,DimDataAsIntegerData=InputBox(“请输入成绩:)IfData=90ThenPrint“优秀”ElsePrint“合格”Print计算完毕上例的If语句可以改写为:IfData90ThenPrint合格ElsePrint优秀返回目录3.1选择结构-If条件语句3.块状If语句返回目录If条件表达式Then语句块EndIf[例3.2]If条件表达式Then语句块1Else语句块2EndIfA=InputBox(“A值”):B=InputBox(B值)PrintA,BIfABThenT=A:A=B:B=TEndIfPrintA,B3.1选择结构-If条件语句4.If语句嵌套If语句嵌套使用可形成多分支的条件语句结构If条件表达式1Then语句1ElseIf条件表达式2Then语句2Else语句3EndIf返回目录说明:ElseIf之间不要加空格。Else和位于其上方的最近的If配对3.1选择结构-If条件语句[例3.3]Weight=InputBox(输入西瓜重量:,计算西瓜款)IfWeight4ThenPrice=1ElseIfWeight=7ThenPrice=1.3ElsePrice=1.1EndIfMoney=Price*WeightMsgBox“西瓜重”&Weight&“公斤,单价”&_Price&元,应收瓜款&Money&_元,,计算西瓜款返回目录4公斤以下:1.00元/公斤4至7公斤:1.3元/公斤超过7公斤:1.1元/公斤IfWeight4ThenPrice=1IfWeight=4AndPrice=7ThenPrice=1.3IfWeight7ThenPrice=1.13.1选择结构-If条件语句[例3.4]Char=InputBox(输入一个字符,测试字符值)IfChar=0AndChar=9ThenMsgBox输入的字符是数字ElseIfChar=AAndChar=ZThenMsgBox输入的字符是大写字母ElseIfChar=aAndChar=zThenMsgBox输入的字符是小写字母ElseMsgBox输入的字符是其它符号EndIf返回目录判断输入的是大写字母、小写字母、数字还是其它符号3.1选择结构-If条件语句[例3.5]PrivateSubCommand1_Click()'单击“正确无误”按钮IfLen(TxtCode.Text)8ThenLblWarn.Caption=考核证号必须输入,长度为8位TxtCode.SetFocusElseIfLen(TxtName.Text)=0ThenLblWarn.Caption=考生姓名必须输入TxtName.SetFocusElseIfLen(TxtSeat.Text)=0ThenLblWarn.Caption=座位号必须输入TxtSeat.SetFocusElseLblWarn.Caption=Debug.PrintTxtCode.TextDebug.PrintTxtName.TextDebug.PrintTxtSeat.TextEndIfEndSub返回目录3.1选择结构-SelectCase选择语句语法格式:SelectCase测试表达式Case表达式1语句1Case表达式2语句2………[CaseElse语句n+1]EndSelect功能:根据测试表达式的值,决定程序的流向。返回目录测试表达式值的类型是数值型、字符串型、日期型等,一旦与某个Case后的表达式值相等,则执行这个Case中的语句,完成后执行EndSelect后的语句。如果所有的Case后的表达式都不与测试表达式项匹配,则执行CaseElse后的语句。3.1选择结构-SelectCase选择语句[例3.6]学生成绩分等Data=InputBox(请输入一个成绩,成绩分等)SelectCaseInt(Data/10)Case10MsgBox满分,,成绩分等Case9MsgBox优秀,,成绩分等Case8MsgBox良好,,成绩分等Case7MsgBox一般,,成绩分等Case6MsgBox合格,,成绩分等CaseElseMsgBox不合格,,成绩分等EndSelect返回目录单击窗体确定3.1选择结构-SelectCase选择语句[例3.7]测试输入的字符Char=InputBox(请输入一个字符,测试)SelectCaseCharCase0To9MsgBox字符是数字,,测试CaseaTozMsgBox字符是小写字母,,测试CaseAToZMsgBox字符是大写字母,,测试CaseElseMsgBox字符是其它符号,,测试EndSelect关于SelectCase语句的一些说明见教材返回目录确定单击窗体3.2循环语句程序的另一种结构是循环结构循环结构作用是重复执行一段程序循环是有条件的、次数是有限的VB的循环语句:For…Next、DoWhile…LoopForEach…Next、While…Wend应用最多的:For…Next与DoWhile…Loop返回目录3.2循环语句-For…Next循环For…Next循环一般应用于循环次数已知的场合For循环变量=初值To终值[Step步长]语句块(循环体)Next[循环变量]工作原理返回目录循环变量=初值循环变量超出范围?循环体循环变量增加一个步长NoYesStep缺省为13.2循环语句-For…Next循环[例3.8]求1+3+5+7+…+99PrivateSubForm_Click()DimSumAsInteger,IAsIntegerSum=0'保存累加和,先清零ForI=1To99Step2Sum=Sum+INextIMsgBox1+3+5+…+99=&Sum,,求和EndSub返回目录本例的特点是数据项之间相差2,即Step的值为2思考:例中当输出对话框出现时,I的值是多少?如果省略Step2,程序的结果如何?For语句能不能改写成ForI=99To1Step-2?3.2循环语句-For…Next循环[例3.11]求斐波那契级数的前20项PrivateSubForm_Click()DimA,B,I,TAsIntegerA=1:B=1'生成级数第一、二项PrintA;B;ForI=3To20T=A+B'产生级数新的一项A=B'让B成为下一组的AB=T'原来A+B的值成为下一组的BPrintB;IfIMod6=0ThenPrintNextIEndSub返回目录斐波那契级数:第一、二项为1第三项开始,每一项的值是前两项值之和每6个数一行3.2循环语句-Do…Loop循环1.当型循环返回目录DoWhile条件表达式循环体LoopDo循环体LoopWhile条件表达式条件表达式成立?循环体NoYes条件表达式成立?循环体NoYes先判断后执行先执行后判断特点:条件表达式成立执行循环体内容3.2循环语句-Do…Loop循环[例3.12]计算平均分PrivateSubForm_Click()DimDataAsInteger,SumAsInteger,NAsIntegerDimAverageAsSingleSum=0:N=0Data=InputBox(输入第&N+1&个同学的成绩,求平均分)DoWhileData-1'-1表示结束输入Sum=Sum+DataN=N+1Data=InputBox(输入第&N+1&个同学的成绩,求平均分)LoopAverage=Sum/NMsgBoxN&位同学的平均分为&Average,,求平均分EndSub返回目录3.2循环语句-Do…Loop循环[例3.13]Sum=1+2+3+…+N求Sum不超过10000的最大整数值和数据项数NPrivateSubForm_Click()DimSum,NAsIntegerN=0'开始时项数为0Sum=0'保存累加值的变量Sum清零DoWhileSum=10000N=N+1Sum=Sum+NLoopSum=Sum-NN=N-1PrintSum=;Sum,N=;NEndSub返回目录当Sum的值超出10000时循环才终止。因此Sum值要减去多加的一个N;而在循环过程中,N也被多加了一个1,需要减去。3.2循环语句-Do…Loop循环2.直到型循环返回目录DoUntil条件表达式循环体LoopDo循环体LoopUntil条件表达式特点:条件表达式不成立执行循环体内容先判断后执行条件表达式成立?循环体NoYes先执行后判断条件表达式成立?循环体NoYes3.2循环语句-Do…Loop循环[例3.14]计算平均分(要求同例3.12)PrivateSubForm_Click()DimDataAsInteger,SumAsInteger,NAsIntegerSum=0:N=0Data=InputBox(输入成绩,计算总分)DoUntilData=-1Sum=Sum+DataN=N+1Data=InputBox(输入数据,计算总分)LoopPrint全班平均分为:;Sum/NEndSub返回目录DoWhileData-1Sum=Sum+DataN=N+1Data=InputBox(输入数据,计算总分)Loop3.2循环语句-两重循环两重循环:在一个循环的循环体中还包含另一个循环[例3.15]在窗体上显示一个几何图形PrivateSubForm_Click()DimI,JAsInteger'I、J为循环变量ForI=1To8'I控制行数(8行)PrintTab(10-I);'定每行*的起始位ForJ=1ToI'J控制每行输出I个*Print*;NextJPrint'换行NextIEndSub返回目录注意:两重循环不能形成交叉3.2循环语句-两重循环[例3.16]输出乘法口诀表PrivateSubForm_Click()DimIAsInteger,JAsInteger,MAsIntegerForI=1To9ForJ=1ToIM=I*JPrintJ&*&I&=&M&;NextJPrint'打印换行NextIEndSub返回目录3.2循环语句-两重循环[例3.17]计算PrivateSubForm_Click()DimIAsInteger,JAsIntegerDimFAsLong'阶乘值用长整型保存DimeAsDoubleForI=0To10F=1'每个阶乘值先置1以便累乘ForJ=1ToIF=F*JNextJe=e+1/FNe