《循环结构教学》PPT课件.ppt
第五章第五章 循环结构循环结构教学内容教学内容循环语句Timer控件和滚动条的使用教学目标教学目标掌握循环语句掌握Timer控件和滚动条5.1 循环语句循环语句VB.Net主要提供了三种循环控制方式:uForNextuWhileEnd WhileuDoLoop5.1.1ForNext循环For循环语句通常用于将一组语句重复执行指定的次数。For循环的重复次数,可以由设定一个计数变量及其上、下限来决定。语句形式如下(方括号中的内容为可选项):For 循环变量循环变量=初值初值 To 终值终值 Step 步长步长 语句块语句块 Exit For 语句块语句块 Next 循环变量循环变量 其中:其中:循环变量为必选项。其类型通常是Integer,但也可以是支持大于号()、小于号()和加号(+)的任何基本数值类型。步长,每次循环后循环变量的增量。一般为正,初值小于终值;若为负,这时初值大于终值;如果省略了该项,则步长的默认值为1。语句块是放在For和Next之间的一条或多条语句,亦被称为循环体。它们将被执行指定的次数。ExitFor,当遇到该语句时,退出循环(无论是否执行完指定次数),执行Next语句后面的语句。例如:编写一个计算正整数的阶乘的程序。对任意正整数K,K!符号代表阶乘表达式,我们有:为了解决这个问题,可以用一个For循环中的循环变量表示K的变化范围,在循环体中计算当前K值的阶乘。新建工程Factorial,在窗体上添加一个Button和一TextBox控件。为BtnStart按钮的click事件过程,添加下面的代码:PrivateSubBtnStart_Click(ByVal_senderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesBtnStart.ClickDimlngResultAsLongDimiAsIntegerTxtOutput.Clear()lngResult=1Fori=1To15lngResult=lngResult*iTxtOutput.Text+=i.ToString()+!=+lngResult.ToString()_+vbCrLfNextEndSub阶乘程序的运行结果如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数称该数为水仙花数。编一程序求出所有的水仙花数。显然,水仙花数要在100999的范围内去找。我们对于这个范围内所有的数一一检验其是否符合水仙花数的定义。项目的建立同上,代码如下:PrivateSubBtnStart_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesBtnStart.ClickDimintMumberAsIntegerDimintHandredAsIntegerDimintTenAsIntegerDimintSingleAsIntegerTxtOutput.Clear()ForintMumber=100To999intHandred=intMumber100intTen=(intMumber10)Mod10intSingle=intMumberMod10IfintMumber=intHandred3+intTen3+intSingle3ThenTxtOutput.Text+=intMumber.ToString()+=+_intHandred.ToString()+3+intTen.ToString()_+3+intSingle.ToString()+3+vbCrLfEndIfNextEndSub水仙花数的运算5.1.2 While.End While 循环循环While.EndWhile循环用于对一条件表达式进行计算,如果值为True,则执行循环体。每一次循环结束后,重新计算条件表达式。While.EndWhile与For循环的差别差别在于:For循环循环次数是不变的,执行一定次数后结束循环。While循环的循环次数依赖与条件表达式的值,在不同情况下循环次数不一样。While型循环结构使用While语句实现,语句形式如下:While 语句块语句块 End While其中:其中:条件表达式的值必须为True或False。如果表达式的值为Nothing,则结果将作为False处理。当表达式的值True时,则执行While后的循环体直到遇到EndWhile语句。随后控制返回到While语句并再次检查表达式结果。如果表达式仍为True,则重复上面的过程。如果为False,则从EndWhile语句后面的语句开始执行。在设计While型循环时要注意在其循环体内应该在适当的时候使条件表达式的值为False,确保在执行了一定次数之后可以退出循环,否则就成了“死循环”,一旦程序进入这里,将永远在循环结构中反复执行而无法结束。编写一程序,计算1到100的整数和(1+2+3+100)。这道题非常简单,可以通过公式(1+100)*100/2立刻计算出结果。但这里采用逐项累加算法。新建和Factorial同样界面的项目,为BtnStart的Click事件编码如下:PrivateSubBtbStart_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesBtbStart.ClickDimintSumAsIntegerDimiAsIntegerintSum=0i=1Whilei=100intSum=intSum+ii=i+1EndWhileTxtOutput.Text=1+2+3+.+100=+intSum.ToString()EndSub累加程序的运行结果5.1.3 DoLoop循环循环Do循环同样也是通过一个条件表达式来控制循环次数的循环结构。此种语句有两种语法形式,条件前置的DoLoop结构和条件后置的DoLoop结构:Do While|Until 语句块语句块 Exit Do 语句块语句块LoopDo 语句块语句块 Exit Do 语句块语句块Loop While|Until 其中:其中:当条件表达式前置条件表达式前置时,先计算表达式的值,因此当表达式的值在第一次计算时就为False时,循环体一次也不执行。当条件表达式后置条件表达式后置时,先执行一次循环体再计算表达式的值,因此循环体至少被执行一次。关键字While 和和 Until必选其一且只能选一个必选其一且只能选一个。While用于指明条件表达式的值为True时就执行循环体中的语句;Until正好相反。ExitDo语句将执行Loop语句后面的语句。也就是使得循环立即结束。可以在Do循环中的任何位置放置任何数量的ExitDo语句。利用Do循环求的近似值。利用公式:计算,直到最后一项的绝对值小于104为止。新建和前面一样的项目,为BtnStart的Click事件编写如下代码:PrivateSubBtnStart_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesBtnStart.ClickDimdblPIAsDouble=0DimdblToleranceAsDouble=1DimintTermAsInteger=1DimshortSignAsShort=1DodblPI+=dblToleranceintTerm+=2shortSign=-shortSigndblTolerance=shortSign/intTermLoopWhileMath.Abs(dblTolerance)0.0001dblPI*=4TxtOutput.Text=pi=+dblPI.ToString()EndSubPi值的计算结果5.2 Exit 语句语句在程序中强制改变程序流程。如:强制跳转至某个程序,或强制脱离循环。VB.Net提供了Exit语句来满足这些要求。语句形式如下:Exit Do|For|Function|Property|Select|Sub|Try|While 使用中途跳转语句,可以为某些循环体或过程设置明显的出口,能够增强程序的可读性,符合结构化程序设计的要求。Exit For立即退出所在的For循环。继续执行Next语句后面的语句。只能在For.Next或ForEach.Next循环内使用ExitFor。当在嵌套的For循环中使用ExitFor时,ExitFor会将控制传送到ExitFor所在循环的外层循环。Exit While立即退出所在的While循环。继续执行EndWhile语句后面的语句。只能在While循环内使用ExitWhile。当在嵌套的While循环中使用ExitWhile时,ExitWhile将控制传送到ExitWhile所在循环的外层循环。Exit Do立即退出所在的Do循环。继续执行Loop语句后面的语句。只能在Do循环内使用ExitDo。在嵌套的Do循环中使用ExitDo时,ExitDo会将控制传送到ExitDo所在循环的外层循环。Exit Sub立即退出所在的Sub过程。继续执行调用Sub过程的语句后面的语句。只能在Sub过程内使用ExitSub。Exit Function立即退出所在的Function过程。继续执行调用Function过程的语句后面的语句。只能在Function过程内使用ExitFunction。Exit Property立即退出所在的Property过程。继续执行调用Property过程的语句,即继续执行请求或设置属性值的语句。只能在Property过程内使用ExitProperty。Exit Select立即退出所在的SelectCase。继续执行EndSelect语句后面的语句。只能在SelectCase语句内使用ExitSelect。Exit Try立即退出所在的Try或Catch块。如果有Finally块,则继续执行Finally块,否则继续执行EndTry语句后面的语句。只能在Try.Catch.Finally语句内使用ExitTry。5.3 多重循环多重循环多重循环:一个循环体内包含一个完整的循环结构,内嵌的循环中还可以包含其他循环。前面介绍的三种循环语句都可以嵌套。例如,要统计用1、2、3、4这四个数可以组成的四位数。列出所有可能组成的四位数(四位数字可以相同),并统计出四位数的个数。这个问题可以用四重循环来解决每层循环的初值为1,终值为4,总的循环次数就是所有四位数的个数。新建一个和前面一样的项目,并将ScrollBars的属性设置为VerticalBtnStart(目的是添加一个垂直滚动条)。BtnStrat的Click事件代码如下:PrivateSubBtnStart_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_HandlesBtnStart.ClickDimiAsIntegerDimjAsIntegerDimkAsIntegerDimlAsIntegerDimintSumAsInteger=0DimintNumberAsIntegerFori=1To4Forj=1To4Fork=1To4Forl=1To4intNumber=1000*i+100*j+10*k+lintSum+=1TxtOutput.Text+=intNumber.ToString()+IfintSumMod6=0ThenTxtOutput.Text+=vbCrLfEndIfNextNextNextNextTxtOutput.Text+=vbCrLf+sum=+intSum.ToString()EndSub4个数字可以组合成的4位数又例:公元5世纪末,我国古代数学家张丘建在他编写的算经里提出了一个不定方程问题,世界数学史上称为“百鸡问题”。题目是这样的:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,间鸡翁、母、雏各几何?译成现代汉语就是说每只公鸡价值5个钱,每只母鸡价值3个钱,每3只小鸡价值1个钱。现有100个钱想买100只鸡,问公鸡、母鸡和小鸡各应买几只?根据题意,设x,y分别为鸡翁,鸡母,鸡雏的数目,则可得如下方程:5x+3y+z3100 x+y+z160三个未知数,只有两个方程,因此这是一个不定方程问题。新建一个和前面同样界面的项目HundredCock,为BtnStart添加下列代码;PrivateSubBtnStart_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesBtnStart.ClickDimintCockAsIntegerDimintHenAsIntegerDimintChickenAsIntegerForintCock=1To20ForintHen=1To34-intCockintChicken=100-intCock-intHenIfintCock*5+intHen*3+intChicken/3=100ThenTxtOutput.Text+=Cock:+intCock.ToString()+_Hen:+intHen.ToString()+Chicken:_+intChicken.ToString()+vbCrLfEndIfNextNextEndSub百鸡问题通过验证每一个可能的解,最终找到全部正确的解。因为20只公鸡的价钱是100元,33.3只母鸡的价钱是100元。就是说,100元钱最多能买20只公鸡或者34只母鸡。因此,循环的次数最大分别取到20以及34公鸡数。程序的运行结果如右。5.4 其它辅助控制语句其它辅助控制语句5.4.1 GoTo语句语句