For循环控制结构
循环控制结构属于计数型循环,程序按照此种结构中指明的循环次数来执行循环体部分,采用For…Next循环语句,其语法格式如下:
For <循环变量> = <初始值> To <终值> [Step 步长]
[循环体]
[Exit For]
[循环体]
Next 循环变量
在此格式中,使用了这样几个参数:
1. 循环变量。用于统计循环次数,该变量为数值型变量。
2. 初始值。用于设置循环变量的初始值,该变量为数值型变量。
3. 终值。用于设置循环变量的终止值,该变量为数值型变量。
4. 步长。用于决定循环变量每次的增值,为数值型变量。当步长为1时,可以省略[Step 步长]选项。
5. 循环体。重复执行的部分。
6. Exit For。在某些情况下,可强制退出For循环。
7. Next循环变量。用于结束一轮For循环。根据终止值和当前循环变量的值的大小关系决定是否执行下一轮循环。
通常情况下,For循环的执行过程是先给循环变量赋初值,然后判断。若循环变量的值没有超出终值,则执行一轮循环体,然后将循环变量加上步长值,判断是否可以执行下一轮循环,接着重复上述过程;否则退出循环。
若循环体中存在Exit For语句,则在执行过程中,满足条件即可强制跳出For循环。若存在For循环嵌套,使用Exit For语句只能跳出最内层的循环,继续执行外层循环。
当For循环的循环体内没有任何具体语句时,该循环部分可作为延时工具使用。
【例6.7】编写程序,求1~n(正整数)的所有正整数之和。
(1) 分析。根据题意,n的值由用户输入。要求n个正整数的和,可看作n次加法操作,即加法操作被循环执行n次,其中,n是循环变量,控制循环次数。
(2) 在窗体的单击事件上编写下面的事件过程。
Private Sub Form_Click()
Dim s As Single,i As Integer
n=Val(InputBox("请输入n","提示"))
s=0
For i =1 To n step 1
s= s + i
Next i
Print "1到"; n; "之和为:"; s
End Sub
(3) 程序功能。运行程序后,单击窗体弹出一个输入框由用户输入n的值,然后在窗体上显示1到n这n个数的和。当输入100时,运行结果如图6-7所示。

6.2.2 当循环控制结构
虽然在For…Next结构中增加带条件的Exit For语句,可以在循环次数不确定只给出循环结束条件的情况退出循环结构,但是在这种情况下,使用当循环控制结构会更方便,当循环控制结构采用While…Wend循环语句,其讲法格式为:
While 条件
[循环体]
Wend
说明:
1.“条件”可以是关系表达式或逻辑表达式。While循环就是当给定的“条件”为True时,执行循环体,为False时不执行循环体。如果开始条件就不成立,则循环体一次也不执行。因此While循环出可直接称为当型循环。
2. 循环结构执行过程如下:
(1) 执行While语句,判断条件是否为真。
(2) 如果条件为真,就执行循环体;否则,转到④执行。
(3) 执行Wend语句,转到①执行。
(4) 执行Wend语句下面的语句。
(5) While循环语句本身不能修改循环条件,所以必须在While…Wend语句的循环体内设置相应的语句,使得整个循环趋于结束,以避免死循环。
【例6.8】用While循环语句计算1~100所有奇数的和。
Private Sub Command1_click()
Dim i%, sum&
i = 1
While i <= 100
sum = sum + i
i = i + 2
Wend
Text1.Text = sum
End Sub
【例6.9】用While循环语句求n!,n的值由用户输入。
Private Sub Command1_click()
Dim fact&, n&, i%
n = Val(Text1.Text)
fact = 1
i = 1
While i <= n
fact = fact * i
i = i + 1
Wend
Text2.Text = fact
End Sub
在循环体中应有使循环趋向于结束的语句。例如在求累加中循环结束的条件是i>100,因此在循环体中应该有使i增值以最终能使i>100的语句,例中使用i=i+1语句来表达到此目的。如果无此语句,则i的值始终不改变,循环永不结束,构成死循环,程序正常结束。
6.2.3 Do 循环控制结构
在已知循环次数的情况下,使用For…Next 语句完成循环比较方便,但如果循环次数未知,则要使用Do 循环控制结构来实现,该控制结构采用Do…Loop循环语句。Do…Loop循环比较灵活,可以根据需要决定是条件满足时执行循环体,还是一直执行循环体直到条件满足。Do…Loop循环可以有两种格式,既可以在初始位置判断条件是否成立,也可以在执行一轮循环体后再判断条件是否成立,能否进入下一轮循环。
Do…Loop循环的两种格式如下:
1. 语法格式一: Do
<语句块>
[Exit Do
语句块]
Loop { While|Until} <条件>
2. 语法格式二: Do { While|Until }<条件>
<语句块>
[Exit Do
语句块]
Loop

上述两种格式构成了Do循环的两种使用方法。这两种格式既有共同点又有明显的差异。上面2种格式有下面4种共同点。
(1) 均可以有一定的循环条件,但循环体部分为空。此种情况下,可以用于延时。
(2) 均可以在程序的执行过程中用“Exit Do”语句退出循环。
(3) 均可以嵌套使用,而且可以互相嵌套。
(4) 均有两种判断条件的格式:一种为“While <条件>”,判断时只要条件成立,则继续执行循环体,然后重复上述判断过程;否则退出循环。另一种为“Until <条件>”,判断时只要条件成立就退出循环,否则继续执行循环体,然后重复判断过程。
上述两种格式有下面两个不同点。
(1) 第一种格式中的判断条件“While或Until条件”的位置在整个循环体的最后,而第二种格式中的判断条件“While或Until 条件”的位置在整个循环体的起始位置。
(2) 第一种格式的执行过程是先执行一遍循环体,再进行判断;而第二种格式的执行过程是先对条件进行判断,判断为能够执行循环体时,才能进入循环体执行相应语句。所以第一种格式至少要执行一次循环体,而第二种格式则可能根本不执行循环体。
【例6.10】编程求两自然数m、n的最大公约数。
(1) 分析。可采用辗转相除法求得最大公约数。算法分析如下:
第一步 由m除以n得到余数r;
第二步 若r=0,则n为要求的最大公约数,算法结束;否则执行第三步;
第三步 n赋值给m,r赋值给n,再转到第一步执行。
(2) 在窗体上创建文本框Text1和Text2,用来供用户输入m和n的值;创建命令按钮Command1,并为Command1的单击事件编写下面过程。
Private Sub command1_Click()
Dim m As Integer, n As Integer, r As Integer
m = Val(Text1.Text)
n = Val(Text2.Text)
r = m Mod n
Do Until r = 0
m = n
n = r
r = m Mod n
Loop
Print " 它们的最大公约数是";n
End Sub
(3) 程序功能。执行程序后,用户在文本框Text1和Text2中输入m和n的值,单击Command1按钮,在窗体上输出m和n的最大公约数。例如,分别输入8和12时,运行结果如图6-12所示。

【例6.11】编程。目前我国人口约为13亿,按人口年增长0.8%计算,多少年后我国人口达到26亿。
(1) 分析。由题目可知,每年人口增长率相同,即由前一年人口数量求下一年人口数量的公式相同,经过若干年循环,人口达到26亿,由于循环次数未知,所以只能用Do…Loop循环实现。x表示人口数量初值,n表示年数。
(2) 创建Command1按钮,为Command1的单击事件编写下面的过程。
Private Sub Command1_Click()
Fontsize=12
x = 13
n = 0
Do While x < 26
x = x * 1.008
n = n + 1
Loop
Print n;"年后,我国人口将达到";x;"亿"
End Sub
(3) 程序功能。运行程序,在窗体上显示所求结果,如图6-13所示。
6.2.4 多重循环
多重循环又叫循环嵌套,如果在一个循环的循环体内又包括一个完整的循环结构,则称循环嵌套。嵌套可以继续下去形成多个层次。循环嵌套一般最常见的达到二重,其次是三重,三重以上一般不常见。
若结构A是一个循环结构,结构B是A的循环体,且B也一个完整的循环结构,则称A为B的外循环,B为A的内循环。
多重循环的执行机制是,外循环A每执行一次,其内循环B要执行多次直到循环B结束;如此继续,直到最外层的循环执行完毕,整个多重循环才结束。
多重循环既可以出现在For循环语句中,也可以出现在Do…Loop语句中。
【例6.12】输出100以内的所有素数。
算法分析:
(1) 判断某数m是否为素数最简单的方法是分别判断m能否被i整除,i=2,3,…,m-1。在判断过程中,只要遇到一个i能整除m,就说明m不是素数,否则m是素数。
(2) 对100以内的每个自然数进行素数的判断,若是由输出之。
(3) 上述步骤(1)用一个内循环实现,步骤②用一个外循环实现。
图片框Picture1的Click事件过程代码如下:
Private Sub Picture1_Click()
Dim m%, i%, k%, count%
count = 0
For m = 101 To 200 Step 2 '外循环
k = Sqr(m + 1) '加1是为避免在求m时可能出现的误差
For i = 2 To k '内循环
If (m Mod i) = 0 Then Exit For
'若m能被i整除,表明该m不是素数,退出内循环
Next i
If i >= k + 1 Then '块If是设计的输出格式
Picture1.Print m;
count = count + 1
If (count Mod 5) = 0 Then Picture1.Print
End If
Next m
Label1.Caption = "100~200之间的素数共有" & count & "个。"
End Sub
程序运行结果如图6-14所示。
该程序是由两层循环组成的循环嵌套结构,外层是自For m = 101 To 200 Step 开始到Next m 结束的语句,内层是由For i =2 To k 开始到Next结束的语句。外循环的步长为2而不是1,目的是将偶数减去,减少循环次数。
内层循环中If (m Mod i)=0 Then Exit For 语句的作用是一旦m能被i整除,强行结束内循环。例如当m=105时,由于105能被3整除,所以内层循环执行到i=3就强行结束,不再执行i=4, i=5……。
一般情况下,循环过程要从头到尾地执行,不能中途退出。在某些情况下,为了减少循环次数或便于程序调试,可能需要提前强制退出循环。VB为此提供了出口语句Exit。
一般编程时,多采用条件形式的出口语句:
If条件 Then Exit For
If条件 Then Exit Do
If条件 Then Exit Sub
If条件 Then Exit Function
使用出口语句除能减少循环次数结构外,其意义还在于它显式地标出了循环的出口点,这样改善某些循环的可读性,并易于代码的编写。
对于循环的嵌套,要注意下面事项:
① 在多重循环结构中,各层循环的循环控制变量不能同名。但并列循环的循环控制变量名可以相同,也可以不同。
② 外层循环必须完全包含内层循环,不能交叉。
小结:
循环结构是用来描述现实世界中循环现象的重要手段。所谓循环结构,表示在执行语句时,需要对其中的某些语句重复执行多次,被重复执行的语句块称为循环体。使用循环结构避免不必要的操作,简化程序结构,节省存储空间。
常用的循环语句有For…Next循环语句和Do…Loop循环语句两种格式。无论何种类型的循环结构,循环体的执行次数都由循环类型和条件决定,并且在某个时候得以终止循环。通常,循环结构从现实事物中抽象出一个计数器变量,在计数器变量的取值范围内,进行循环操作。
作业:
1、 列出所学的循环语句,试比较各种循环语句的功能。
2、如果知道循环次数,应选择哪种循环语句?如果不知道循环次数,应选择哪种循环语句?为什么?
3、循环结构允许嵌套吗?如果允许,在设计这种结构时应注意什么问题?
|