1、 采用循环程序可以解决一些按一定规则重复执行的问题。采用循环程序可以解决一些按一定规则重复执行的问题。例如,统计一个班几十名学生,甚至全校几千名学生的学期例如,统计一个班几十名学生,甚至全校几千名学生的学期成绩,如求平均分、不及格人数等。成绩,如求平均分、不及格人数等。本章主要内容 循环语句循环语句 For.Next/Do.Loop/While.Wend 循环出口语句循环出口语句(Exit)多重循环多重循环 程序举例程序举例 4.3 4.3 循环结构设计循环结构设计 循环循环是指在指定的条件下多次重复执行一组是指在指定的条件下多次重复执行一组语句。被重复执行的一组语句称为语句。被重复执行的一组
2、语句称为循环体循环体。VB提供的循环语句有提供的循环语句有:For.Next Do.Loop While/Until Do While/Until.Loop While.Wend 最常用的是最常用的是For.Next和和Do.Loop语句语句 按指定次数执行循环体按指定次数执行循环体 4.3.1 For.Next4.3.1 For.Next循环循环循环变量超过终值?循环变量超过终值?FT循环变量增加步长循环变量增加步长循环体循环体循环变量获得初值循环变量获得初值 格式:格式:For 循环变量初值循环变量初值 To 终值终值 Step 步长值步长值 循环体循环体 Next 循环变量循环变量功能:
3、功能:当循环变量的值在初值到终值范围内时,执行当循环变量的值在初值到终值范围内时,执行一次循环体的语句代码,并使初值增加一个步长。当一次循环体的语句代码,并使初值增加一个步长。当循环变量的值不在初值到终值范围内时,就退出循环,循环变量的值不在初值到终值范围内时,就退出循环,执行执行Next后面的语句。后面的语句。说明:说明:循环变量是一个数值变量,初值、终值和步长循环变量是一个数值变量,初值、终值和步长值都是数值表达式,步长值可以是正数值都是数值表达式,步长值可以是正数(称为递增循称为递增循环环),也可以是负数,也可以是负数(称为递减循环称为递减循环);若步长值为;若步长值为1,则则Step
4、1可以省略。可以省略。说明说明:G循环次数的一般计算公式:循环次数的一般计算公式:Int(终值-初值)/步长)+1G事先已知事先已知循环次数,则可使用,则可使用For-Next循环结构语句循环结构语句计数循环 Private Sub Form_Load()ShowDim sum As Integer计算计算1 1至至100100的和,存放在的和,存放在sum中中显示结果显示结果 Print sum=;sum End Subsum=sum+1 sum=sum+1 sum=sum+2 sum=sum+2 sum=sum+100sum=sum+100sum=sum+i采用采用Print直接在窗体上输
5、出结果直接在窗体上输出结果 Private Sub Form_Load()Show Dim sum As Integer Dim i As Integer For i=1 To 100 sum=sum+i Next i Print sum=;sum End SubYesNosum=sum+ii=1i=100i=i+1执行过程执行过程:For i=1 To 100 sum=sum+i Next i示例示例2 2:求求T=8!=1238 采用采用Print直接在窗体上输出结果,程序代码:直接在窗体上输出结果,程序代码:Private Sub Form_Load()Show t=1 For c=1
6、To 8 t=t*c Next c Print T=;t End Sub 程序运行结果是:程序运行结果是:T40320 语句语句t=t*c也称累乘器。先将也称累乘器。先将t置置1(不能置不能置0)。在循环程序中,常用累加器和累乘器来完成各种计算任务。在循环程序中,常用累加器和累乘器来完成各种计算任务。如果要求如果要求N!呢呢?思考:思考:x=5 For i=1 To 20 Step 5 x=x+i5 Next i思考:思考:s=5 For i=2.6 To 4.9 Step 0.6 s=s+1 Next i思考:思考:Private Sub Form_Click()x=5:k=5 For k=
7、1 To 10 Step-2 x=x+k Next k Print k;x End Sub思考:思考:Private Sub Form_Click()Dim sum As Double,x As Double sum=0 n=0 For i=1 To 5 x=n/i n=n+1 sum=sum+x Next i End Sub 下面采用下面采用“穷举法穷举法”来解此题。来解此题。其做法是:从所有可能解中,逐个进行试验,若其做法是:从所有可能解中,逐个进行试验,若满足条件,就得到一个解,否则不是。直到条件满满足条件,就得到一个解,否则不是。直到条件满足或判别出无解为止。足或判别出无解为止。令母鸡
8、为令母鸡为x只,小鸡为只,小鸡为y只,根据题意可知只,根据题意可知 y=100 x 开始先让开始先让x初值为初值为1,以后逐次加,以后逐次加1,求,求x为何值时,为何值时,条件条件3x+y/3=100成立。如果当成立。如果当x达到达到33时还不能使条时还不能使条件成立,则可以断定此题无解。件成立,则可以断定此题无解。示例示例3 3:100 100 元买元买100 100 只鸡,母鸡只鸡,母鸡3 3元元1 1只,小鸡只,小鸡1 1元元3 3只,问各应买多少只只,问各应买多少只?采用采用Print直接在窗体上输出结果,程序代码:直接在窗体上输出结果,程序代码:Private Sub Form_Lo
9、ad()Dim x As Integer,y As Integer Show For x=1 To 33 y=100-x If 3*x+y/3=100 Then Print 母鸡只数为母鸡只数为:;x,Print 小鸡只数为小鸡只数为:;y End If Next x End Sub 运行结果:运行结果:母鸡只数为:母鸡只数为:25 小鸡只数为:小鸡只数为:75 For.Next循环主要是用在知道循环次数的情况循环主要是用在知道循环次数的情况下,若事先不知道循环次数,可以使用下,若事先不知道循环次数,可以使用Do.Loop 循环。循环。Do.Loop两种格式:两种格式:前测型循环结构前测型循环
10、结构和和后测型循后测型循环结构环结构。两者区别在于判断条件的先后次序不同。两者区别在于判断条件的先后次序不同。4.3.2 Do.Loop 4.3.2 Do.Loop循环语句循环语句循环体循环体F条件条件T先判断循环条件,再先判断循环条件,再执行循环体语句。执行循环体语句。1.1.前测型前测型Do.LoopDo.Loop循环循环 格式:格式:Do While|Until 条件条件 循环体循环体 Loop Do While.Loop语句的功能:语句的功能:当条件成立当条件成立(为真为真)时,执行循环体;当条件不成立时,执行循环体;当条件不成立(为假时为假时),终止循环。,终止循环。Do Until
11、.Loop语句的功能:语句的功能:当条件不成立当条件不成立(为假为假)时,执行循环体,直到条件时,执行循环体,直到条件成立成立(为真为真)时,终止循环。时,终止循环。1.1.前测型前测型Do.LoopDo.Loop循环循环Private Sub Form_Load()Dim sum As Integer,i As Integer Show i=1 Do While i=30 Print Number;sEnd SubA)0 1 B)30 30 C)4 30 D)3 182运行下列程序,单击窗体,则执行结果是()Private Sub Form_Click()b=1 a=2 Do While b
12、 10 b=2*a+b Loop Print bEnd SubA)13 B)17 C)21 D)33 运行下列程序,单击窗体,则执行结果是()Private Sub Form_Click()E=1:F=1 For j=1 To 3 E=E+F:F=F+E Next j print E;F End Sub A)6 6 B)5 8 C)13 21 D)34 55l分析:本题可用分析:本题可用“累加累加”的方法来完成,设累加的和为的方法来完成,设累加的和为变量变量s,累加项为累加项为i2,则累加的语句可写为:则累加的语句可写为:s=s+i2l采用采用Do WhileLoop语句:语句:Private
13、 Sub Form_Click()Dim i As Integer,s As Long i=1 s=0 Do while i=10 s=s+i 2 i=i+1 Loop Print“s=”;s End Sub 示例示例5 5:用用DoloopDoloop语句求语句求s=1s=12 2+2+22 2+10+102 2 “辗转相除法辗转相除法”算法:算法:求出求出m/n余数余数p,若,若p0,n即为即为最大公约数;若最大公约数;若p非非0,则把原来的分母,则把原来的分母n作为新的分子作为新的分子m,把,把余数余数p作为新的分母作为新的分母n继续求解。继续求解。设计步骤如下:设计步骤如下:(1)创建
14、应用程序的用户界面和设置对象属性创建应用程序的用户界面和设置对象属性示例示例6 6:输入两个正整数,求它们的最大公约数输入两个正整数,求它们的最大公约数 编写的编写的“计算计算”按钮按钮Click事件过程代码如下:事件过程代码如下:Private Sub Command1_Click()Dim m As Integer,n As Integer,p As Integer m=Val(Text1.Text):n=Val(Text2.Text)If m=0 Or n=0 Then MsgBox 数据错误数据错误!End End If Do p=m Mod n m=n n=p Loop While
15、p 0 Text3.Text=m End Sub 若输入的若输入的m和和n的值为的值为85和和68,则运行结果如上图,则运行结果如上图 用于提前退出循环用于提前退出循环 格式:格式:Exit For|Do 功能:功能:直接从直接从For循环或循环或Do循环中退出。循环中退出。当程序运行时遇到当程序运行时遇到Exit语句时,就不再执行循语句时,就不再执行循环体中的任何语句而直接退出,转到循环语句环体中的任何语句而直接退出,转到循环语句(Next、Loop)的下面继续执行。的下面继续执行。4.3.3 4.3.3 循环出口语句循环出口语句 示例示例5的循环语句可改为的循环语句可改为:Do p=m M
16、od n If p=0 Then Exit Do End If m=n n=p Loop While p 0 Text3.Text=m n 格式格式:While 条件条件 循环体循环体 Wend功能:功能:当条件成立当条件成立(为真为真)时,执行循环体;当条件时,执行循环体;当条件不成立不成立(为假为假)时,终止循环。时,终止循环。本语句与上述本语句与上述Do While.Loop循环语句相似循环语句相似4.3.4 While.Wend4.3.4 While.Wend循环语句循环语句 用下面的公式求用下面的公式求的近似值的近似值(直到最后一项的绝对值小直到最后一项的绝对值小于于1010-6-6
17、为止为止):):分析分析l先计算等式右边的和先计算等式右边的和l累加求和:累加求和:pi=pi=pipi+t+tl当当|t|=0.000001 pi=pi+t n=n+2 s=-s 交替改变加、减号交替改变加、减号 t=s/n Loop Print=;pi*4 End Sub 程序运行结果是:程序运行结果是:3.141575 示例示例7 7:求求的近似值的近似值思考:思考:Private Sub Form_Click()For I=7 to 90 step 5 print I next I End Sub上述程序共执行执行循环体的次数是()A)14 B)15 C)16 D)17运行下列程序,单
18、击窗体,则执行结果是()Private Sub Form_Click()For j=1 To 15 a=a+j Mod 3 Next j Print a End Sub A)1 B)15 C)90 D)120运行下列程序,单击窗体,则执行结果是()Private Sub Form_Click()For j=1 To 3 Print Tab(3*j);(2*j-1)*(2*j-1)Next j Print End Sub A)1 B)1 6 10 C)1 9 25 D)1 6 9 10 25运行下列程序,单击窗体,则执行结果是Private Sub Form_Click()s=0 i=1 Do
19、While i=100 If(i 5)*5=i Then s=s+1 i=i+1 End If Loop Print sEnd Sub运行下列程序,单击窗体,则执行结果是Private Sub Form_Click()s=0 i=1 Do While i=100 If(i 5)*5=i Then s=s+1 i=i+1 else i=i+1End if Loop Print sEnd Sub 在窗体上放置一个命令按钮,然后编写如下事件过程:Private Sub Command1_Click()x=5 For i=1 to 20 Step 2 x=x+i 5 next i Print x En
20、d Sub程序运行后,单击命令按钮,输出结果为()A)21 B)22 C)23 D)24运行下列程序,单击窗体,则执行结果是()Private Sub Form_Click()For j=1 To 10 a=a+j 3+j Mod 3 Next j Print a End Sub A)20 B)25 C)30 D)35习题:依次输入5、4、3、2、1、-1Private Sub Command_Click()X=0Do Until x=-1 a=InputBox(“请输入A的值”)a=Val(a)b=InputBox(“请输入B的值”)b=Val(b)x=InputBox(“请输入X的值”)x
21、=Val(x)a=a+b+x print aLoopEnd Sub习题:依次输入5、4、3、2、1、-1Private Sub Command_Click()X=0Do Until x=-1 a=InputBox(“请输入A的值”)a=Val(a)b=InputBox(“请输入B的值”)b=Val(b)x=InputBox(“请输入X的值”)x=Val(x)a=a+b+xLoop print aEnd Sub给定VB程序的功能是计算并输出100以内的所有能被3整除且个位数是6的所有整数,请将程序补充完整。Private Sub Form_Click()Dim i,j As Integer Fo
22、r i=0 To _ j=i*10+6 If _ Then Print j End If Next i End Sub 设计一个设计一个“加法器加法器”程序程序,把每次输入的数累加,直到输把每次输入的数累加,直到输入非数值数据为止。入非数值数据为止。Private Sub Form_Click()Dim Sum As Double,x As String,y As Double Sum=0 Do While True 条件为真,循环无终止进行下去条件为真,循环无终止进行下去 x=InputBox(请输入要加入的数请输入要加入的数,输入数据输入数据)If IsNumeric(x)=False T
23、hen Exit Do End If y=Val(x)Sum=Sum+y Text1.Text=Sum Loop MsgBox 累加运算结束累加运算结束”End Sub 示例示例8 8:设计一个设计一个“加法器加法器”程序程序 当一个循环里面包含有另一个完整的循环时,称为循环当一个循环里面包含有另一个完整的循环时,称为循环的嵌套。循环的嵌套对的嵌套。循环的嵌套对For循环和循环和DoLoop循环均适用。循环均适用。多重循环程序示例多重循环程序示例 程序运行结果程序运行结果 Private Sub Form_Load()1 5 Show 1 6 For i=1 To 3 外循环外循环 1 7 F
24、or j=5 To 7 内循环内循环 2 5 Print i,j 2 6 Next j 2 7 Next i 3 5 End Sub 3 6 3 7 4.3.5 4.3.5 循环的嵌套循环的嵌套-多重循环结构多重循环结构嵌套循环应注意的问题嵌套循环应注意的问题Do ForDo Loop NextLoop二重循环二重循环三重循环三重循环For和和Do循环可以混合嵌套,循环可以混合嵌套,但是各循环间但是各循环间不得交叉不得交叉。下。下例是非法的循环嵌套。例是非法的循环嵌套。For IFor JNext INext J就和我们就和我们一层层的一层层的包裹东西包裹东西是一样的!是一样的!错错!这些都对
25、了!这些都对了!思考:运行下列程序,单击窗体,则运行结果是_。Private Sub Form_Click()For x=1 To 2 a=0 For y=1 To x+1 a=a+1 Next y Print a;Next x End Sub运行下列程序,单击窗体,则运行结果是_。Private Sub Form_Click()N=0 For I=1 To 3 For J=5 To 1 Step-1 N=N+1 Next J,IPrint N;J;I 本例可采用本例可采用两重循环两重循环来实现。外循环控制输出来实现。外循环控制输出7行,行,内循环控制每行输出要求的字符数。内循环控制每行输出要
26、求的字符数。在进入内循环之前,使用在进入内循环之前,使用Tab()来对起始输出位置来对起始输出位置定位,退出内循环后,使用定位,退出内循环后,使用Print来控制换行。来控制换行。示例示例9 9:编一程序,输出下列所示的图形编一程序,输出下列所示的图形 采用采用Print直接在窗体上输出结果,程序代码如下:直接在窗体上输出结果,程序代码如下:Private Sub Form_Load()Show For i=1 To 7 Print Tab(8-i);For j=1 To 2*i-1 Print CStr(i);Next j Print Next i End Sub 注意:注意:内循环变量和外
27、循环变量不能同名内循环变量和外循环变量不能同名 ForNext 前测型前测型 s=0 s=0:k=1 For k=1 to 10 Do While k=10 s=s+k s=s+k Next k k=k+1 Print s Loop Print s s=0:k=1 do s=s+k k=k+1 Loop While k=3)Private Sub Form_Click()Dim x As Integer,a As Integer,c As Integer Dim count As Integer count=0 For x=100 To 999 a=x 100:b=x 10 Mod 10:c=
28、x Mod 10 If a b And a c And b c Then count=count+1 Print x;If count Mod 10=0 Then Print End If End If Next xEnd Sub示例示例11 11 统计无重复的三位数,如统计无重复的三位数,如102102、103103示例示例12 12 求最大值或最小值问题求最大值或最小值问题 求班级学生某一门课成绩的最高分 这就是一个求最大值的问题。先假设第一个成绩就是班级最高分,然后从第二个成绩开始依次与假设的最高分比较,若有高于它的,则更新最高分,否则继续下一个成绩的比较,直至最后一个成绩 Privat
29、e Sub Form_Click()Dim score As Single,max as single score=Val(InputBox(请输入第请输入第&1&个学生的成绩:个学生的成绩:)Max=score For i=2 To 20 假设班级人数为假设班级人数为20人人 score=Val(InputBox(请输入第请输入第&i&个学生的成绩:个学生的成绩:)If score Max Then Max=score Next i Print Print 最高分为最高分为;MaxEnd Sub Private Sub Form_Click()Dim i As Integer,j As In
30、teger For i=100 To 200 For j=2 To i-1 If i Mod j=0 Then Exit For End If Next j If j=i Then Print i;End If Next i End Sub示例示例13 13 输出输出100-200100-200之间的所有素数之间的所有素数 示例示例1414:打印打印“九九乘法表九九乘法表”两重循环;两重循环;采用采用Print直接在窗体上输出结果直接在窗体上输出结果Private Sub Form_Load()Show FontSize=12 Print Tab(55);九九乘法表九九乘法表 Print Tab(55);-Print For i=1 To 9 For j=1 To 9 If i*j=10 Then Print i;*;j;=;i*j;Space(1);Else Print i;*;j;=;i*j;Space(2);End If Next j Print Next iEnd Sub 示例示例1414:打印打印“九九乘法表九九乘法表”?示例示例1414:打印打印“九九乘法表九九乘法表”