3.3循环语句程序的另一种结构是循环结构循环结构作用是重复执行一段程序循环是有条件的、次数是有限的VB的循环语句:For…Next、DoWhile…LoopForEach…Next、While…Wend应用最多的:For…Next与DoWhile…Loop返回目录3.4循环语句-For…Next循环For…Next循环一般应用于循环次数已知的场合For循环变量=初值To终值[Step步长]语句块(循环体)Next[循环变量]工作原理返回目录循环变量=初值循环变量超出范围?循环体循环变量增加一个步长NoYesStep缺省为13.4循环语句-For…Next循环[例3.9]求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.4循环语句-For…Next循环[例3.10]求平均成绩ConstN=10'学生人数PrivateSubForm_Click()DimSumAsInteger,IAsIntegerDimDataAsInteger,AverageAsSingleSum=0'存放累加值的变量清零ForI=1ToN'循环40次,步长值为1省略Data=InputBox(输入第&I&位同学的成绩,求平均分)Sum=Sum+DataNextIAverage=Sum/NMsgBox全班&N&名学生的平均分为&Average,,求平均分EndSub返回目录确定本例的循环变量I控制人数3.5循环语句-Do…Loop循环1.当型循环返回目录DoWhile条件表达式循环体LoopDo循环体LoopWhile条件表达式条件表达式成立?循环体NoYes条件表达式成立?循环体NoYes先判断后执行先执行后判断特点:条件表达式成立执行循环体内容3.5循环语句-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.5循环语句-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.5循环语句-Do…Loop循环2.直到型循环返回目录DoUntil条件表达式循环体LoopDo循环体LoopUntil条件表达式特点:条件表达式不成立执行循环体内容先判断后执行条件表达式成立?循环体NoYes先执行后判断条件表达式成立?循环体NoYes3.5循环语句-Do…Loop循环[例3.14]计算平均分(要求同例4.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.6循环语句-两重循环两重循环:在一个循环的循环体中还包含另一个循环[例3.15]在窗体上显示一个几何图形PrivateSubForm_Click()DimI,JAsInteger'I、J为循环变量ForI=1To8'I控制行数(8行)PrintTab(10-I);'定每行*的起始位ForJ=1ToI'J控制每行输出I个*Print*;NextJPrint'换行NextIEndSub返回目录注意:两重循环不能形成交叉3.6循环语句-两重循环[例3.16]输出乘法口诀表PrivateSubForm_Click()DimIAsInteger,JAsInteger,MAsIntegerForI=1To9ForJ=1ToIM=I*JPrintJ&*&I&=&M&;NextJPrint'打印换行NextIEndSub返回目录3.6循环语句-两重循环[例3.17]计算PrivateSubForm_Click()DimIAsInteger,JAsIntegerDimFAsLong'阶乘值用长整型保存DimeAsDoubleForI=0To10F=1'每个阶乘值先置1以便累乘ForJ=1ToIF=F*JNextJe=e+1/FNextIPrinte=;eEndSub返回目录!101...!31!21!111e本循环计算F=I!3.6循环语句-多重循环多重循环:循环次数在两重以上的循环结构[例3.19]计算将1角钱兑换成零钱有多少种方案PrivateSubForm_Click()DimI,J,K,SAsIntegerS=0'统计兑换1角钱的方案数ForI=0To10'1分钱个数ForJ=0To10Step2'2分钱个数ForK=0To10Step5'5分钱个数IfI+J+K=10ThenS=S+1NextKNextJNextIMsgBox1角钱兑换成零钱的方案有&S&种,,兑换零钱EndSub返回目录1角钱以下的硬币有1分、2分和5分种1角钱全换成1分需10个1角钱全换成2分需5个1角钱全换成5分需2个3.7其他语句-Exit与End1.Exit语句ExitDo:跳出Do…Loop循环ExitFor:跳出For…Next循环[例4.20]判断一个正整数是否为素数(质数)N=InputBox(请输入一个正整数,验证素数)ForI=2ToN-1IfNModI=0ThenExitForEndIfNextIIfI=NThenMsgBoxN&是素数,,验证素数ElseMsgBoxN&不是素数,,验证素数EndIf返回目录素数:一个正整数N除了能被1和自身所整除外,不能被其它任何数所整除。3.7其他语句-Exit与End2.End语句End:终止程序的运行EndSub:终止一个过程;EndFunction:终止函数过程EndIf:终止条件语句EndType:终止类型声明EndSelect:终止情况语句EndProperty:终止属性过程EndWith:终止With语句返回目录例如:PrivateSubCommand1_Click()EndEndSub3.7其他语句-Goto功能:无条件转向格式:Gotolabellabel称为语句标号(数字或标识符)[例3.22]求若干个同学的成绩总分PrivateSubForm_Click()DimData,SumAsIntegerSum=0loop1:Data=InputBox(输入成绩)IfData=-1ThenGoToloop2ElseSum=Sum+DataGoToloop1EndIfloop2:Print总分=;SumEndSub返回目录Goto语句不符合结构化程序设计的要求,所以不提倡使用。程序调试-程序的错误类型语法错误运行错误返回目录中文逗号n未赋过值逻辑错误:算法不正确。显然系统不会报告这类出错信息。程序调试-简单调试方法:在程序中适当插入Print语句跟踪变量值的变化返回目录应该是6与24程序调试-使用调试工具1.断点调试断点:程序执行到该此自动暂停单击“继续”按钮,程序可继续执行。返回目录设置断点:在代码窗口中单击该语句左侧的阴影边框。暂停时,将鼠标指针移动到程序中的各个变量上略作停留,系统将以浮动标签的方式显示该变量的值。程序调试-使用调试工具2.逐语句执行启动逐语句执行:“调试→逐语句”或按F8终止逐语句执行:“调试→跳出”3.使用立即窗口程序运行处于暂停状态时,在立即窗口中输入:Print变量名或?变量名4.逐过程启动逐过程执行:“调试→逐过程”或按Shift+F8终止逐过程执行:“调试→跳出”返回目录