刘 伟
(江苏师范大学科文学院 江苏 徐州 221116)
Visual Basic程序设计语言提供了三种循环控制结构,For……Next、While……Wend和Do……Loop,分别用于解决不同特征的循环处理问题。今天我们主要讨论For……Next循环控制结构。
首先,我们需要理解什么叫循环?比如一个学生在操场上围着跑道一圈一圈的跑步,这个跑步的动作就是循环!一个人在食堂里一口一口的吃饭,吃饭的动作也是循环;一个学生静静的坐在教室里听课,这个听课的动作也是循环,……等等,现实生活中处处都是循环!所以,在计算机世界里,计算机重复执行的动作就被称为循环。
其次,我们得搞清楚循环能解决什么样的问题?比如,求5个数的和,我们可以用如下方式获得5个数,然后求它们的和:
Private Sub Form_Click()
Dim A As Integer, B As Integer, C As Integer
Dim D As Integer, E As Integer, Sum As Integer
A = InputBox("请输入第1个数")
B = InputBox("请输入第2个数")
C = InputBox("请输入第3个数")
D = InputBox("请输入第4个数")
E = InputBox("请输入第5个数")
Sum = A + B + C + D + E
Print Sum
End Sub
本程序中引入A、B、C、D、E 五个变量来保存输入的5个值,然后通过语句Sum = A + B + C + D + E求得这5个数据的和,是没有问题的,可是请大家想一想,如果求50个数据的和用这种方式行不行呢,求5000个甚至5万个数据的和还能用这样的程序吗?
所以,在计算机中,重复的或者是相似的操作都可以借助循环来实现!上面的程序中数据的输入可以转换成类似于:X = InputBox("请输入第i个数")的形式,Sum= A + B + C + D + E可以转换成Sum = Sum + X 的累加形式。
其次,我们需要考虑的问题是循环何时结束?比如在操场上跑步,可以有多种结束形式:
1)固定跑5圈,跑完5圈就结束;
2)不确定跑多少圈,跑到累了就结束;
3)跑完5000米就结束;
4)跑到天亮就结束;
……
由此我们可以得出,有的循环有固定的次数,有的循环虽然没有固定的次数,但是有明确的结束条件。而For……Next循环控制语句主要就是用于解决有固定循环次数的循环问题。其基本结构如下:
For 循环控制变量 = 初值 To 终值 [Step 步长]
语句组1
[Exit For]
语句组2
Next [循环控制变量]
几点说明:
加粗标注的部分是必不可少的控制语句,[]内的内容是可以省略的内容;
循环控制变量是某一合法的变量名;
初值 To 终值 用来决定循环控制变量的取值范围;
若Step 步长 省略,则默认的步长为1;
Exit For语句用于实现当满足一定条件时,提前退出当前For循环,执行Next之后的代码;
For和Next之间的代码叫循环体。
比如,用For……Next 循环结构输出1、2、3、……、10这10个数,程序如下:
Private Sub Form_Click()
Dim i As Integer
For i = 1 To 10 Step 1
Print i;
Next i
End Sub
1.当程序执行到For语句时,计算出初值、终值和步长,并且将初值赋值给循环控制变量。
2.判断循环控制变量的值有没有超过终值,如果没有超过终值就进入循环体执行,否则退出循环体,执行Next语句之后的代码。
3.当执行到Next语句的时候系统做如下工作:首先循环控制变量增加一个步长,然后转到第2步。
下面我们试着用For……Next循环结构输入5个数:
Private Sub Form_Click()
Dim i As Integer
For i = 1 To 5
x = InputBox("请输入一个数")
Print x;
Next i
End Sub
如果是输入5个数,输出这5个数的和呢?
首先介绍一条赋值语句: Sum = Sum + X
请大家回顾一下赋值的执行流程:先计算”=”右边表达式的值,然后赋给左边的变量。所以这条语句的功能是先计算Sum+X的值,结果放在Sum中,这条语句执行以后,Sum的新值比原值增加X,如果执行多次,就能实现累加的功能。
所以输入5个数,并输出这5个数的和的程序修改如下:
Private Sub Form_Click()
Dim i As Integer, x As Integer
Sum = 0 ‘Sum 的初始值为0
For i = 1 To 5
x = InputBox("请输入一个数")
Print x;
Sum = Sum + x ‘累加求和
Next i
Print "这些数的和="; Sum
End Sub
为了在输入的过程中能够清晰的知道当前输入的是第几个数,x = InputBox("请输入一个数")可以修改为:x = InputBox("请输入第" & i & "个数")。
请大家想一想,如果要求输入100个数,并输出这100个数的和,应该怎么修改程序呢?
只要把For循环的终值改为100就可以了。由于输入100个数比较慢,我们可以借助随机函数随机生成100个[1,9]范围内的数据进行测试,因为100个数一行显示不完,所以我们按每行输出20个的形式输出,代码修改如下:
Private Sub Form_Click()
Dim i As Integer, x As Integer
Randomize
Sum = 0 ‘Sum 的初始值为0
For i = 1 To 100
x = Int(9 * Rnd + 1)
Print x;
If i Mod 20 = 0 Then Print
Sum = Sum + x
Next i
Print "这些数的和="; Sum
End Sub
总结:通过这个例题我们可以看出,即使是求1000个10000个甚至更多数据的和,只要修改For语句的终值就可以了,不需修改其他代码。像这类重复处理的问题,不借助于循环结构,几乎无法实现问题的解。
接下来我们再看一个例题,求1+2+3+……+100的值。
通过观察我们可以发现,这是一个累加求和的问题,所以就得用到累加公式:Sum=Sum+X,这里的X不是一个随机数,而是有规律的一列数,1、2、3、……、100,对于这种初值为1,终值为100,步长是1的问题,很容易联想到用For循环的循环控制变量i依次取得1、2、3、……、100,然后累加i即可。代码如下:
Private Sub Form_Click()
Dim i As Integer, Sum As Integer
Sum = 0
For i = 1 To 100
Sum = Sum + i
Next i
Print "1+2+3+...+100="; Sum
End Sub
For循环的循环控制变量,不仅可以从小到大变化,也能从大到小变化,只要将步长设置为负数就可以。比如上例,可以将For语句修改为:
For i = 100 To 1 Step -1 ,其他代码不变,求得的就是100+99+98+……+1的和。
思考:求1+2+3+……+n的值。
与上例相比,唯一的变化是终值变为了n,n需要从键盘获得一个初始值。程序修改为:
Private Sub Form_Click()
Dim i As Integer, Sum As Integer
Dim n As Integer
n = Val(InputBox("请输入一个正整数"))
Sum = 0
For i = 1 To n
Sum = Sum + i
Next i
Print "1+2+3+...+"; n; "="; Sum
End Sub
解决了1+2+3+……+n的问题,那么如何求1×2×3×……×n的值。(n!)
类似1×2×3×……×n这样的表达式,我们称为累乘,如果引入一个变量F保存累乘的结果,则只需要将累加表达式转换成F = F * i 即可。这里必须考虑到F的初始值应该为1。所以只要把上面的程序做如下修改即可。
Private Sub Form_Click()
Dim i As Integer, F As Long
Dim n As Integer
n = Val(InputBox("请输入一个正整数"))
F = 1
For i = 1 To n
F = F * i
Next i
Print n; "!="; F
End Sub
总结:本文主要讨论了For循环语句结构,For循环主要用于解决有固定循环次数的问题,通过初值、终值和步长就能计算出循环次数。只要循环控制变量不在循环体内被重新赋值,循环的次数就是确定的((终值-初值)/步长+1)。