循环是客观世界普遍存在的一种现象。在茫茫宇宙之中,地球不停地围绕太阳循环运转;
滔滔江河也存在着回旋倒转的大大小小的旋涡;春夏秋冬来复去,白天黑夜去复来,就更是人 们司空见惯的了。
在人类社会,不但一般微观社会经济活动有时可抽象为某种循环往复的模式(例如,一 个工厂的整个经济活动,可以概括为供、产、销三环节周而复始的循环运动),而且整个宏观 经济活动,也可以概括为生产、分配、交换、消费四大环节的螺旋式循环运动。
同样,在我们所处理的问题中,常常遇到这样一些情况,它们的计算和处理方法完全一 样,只是要求重复计算多次,而每次使用的数据都按照一定的规则在改变。例如,需要对一个 班的 50 名学生的成绩进行处理,将不及格的学生名单打印出来等。
这些客观现象都有一个共同的特征,可以概括为“循环”。所谓循环,是指一个客观事物 在其发展过程中,从某一环节开始有规律地反复经历相似的若干环节的现象。循环的诸子环节 具有“同处同构”的性质,即它们“出现位置同处,构造本质同一”。
程序设计中的循环,是指在程序设计中,从某处开始有规律地反复执行某一操作块(或 程序块)的现象,并称重复执行的该操作块(或程序块)为它的循环体。
Visual Basic 提供了两种循环结构:当型循环和直到型循环。提供了 3 种循环语句:条件 循环 While…Wend;固定次数循环 For…Next;不固定次数循环 Do…Loop。
4.3.1 条件循环的程序实现 1.格式
While <条件>
<循环体>
Wend
其中的“条件”类似于选择结构中的条件,是一个逻辑量。While 和 Wend 之间的语句 构成循环体,是要重复执行的内容。
2.功能
当“条件”成立时,顺序执行循环体。当“条件”不成立时,脱离循环,程序转到 Wend 以后继续执行。其流程图如图 4-20 所示。
图 4-20 循环结构流程图 3.说明
(1)While 和 Wend 必须配对使用。
(2)为使程序正确执行,循环中必须有改变条件的语句。
(3)要想执行循环体,必须先执行 While。
【例 4.13】有一张面积足够大的纸,如果可能,你将它不断的对折。编写程序,计算对 折多少次以后可以超过珠穆朗玛峰的高度(珠穆朗玛峰的高度为 8844430mm)?
分析:假设程序中我们用 H 表示纸张的厚度,对折一次(用 N 记录对折的次数)其厚度 就扩大一倍,即 H=H*2,用条件控制循环,判断对折多少次以后可以超过 8844430。
控件的属性和作用如表 4-13 所示。
表 4-13 例 4.13 的属性设置
对象 属性 属性值 功能
Form1 Caption 例 4.13 折纸计算 显示程序的名称
(名称) lblPaper Caption
Label
Alignment 2-Center
显示纸的厚度
(名称) lblH
Caption Label
Alignment 2-Center
显示对折后纸的厚度 True
循环体
False
Wend 后 条件
续表
对象 属性 属性值 功能
(名称) cmdStart CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim H#, N%
Alignment 2-Center
显示最大的 N 值
(名称) lblResult2 Caption
Label
Alignment 2-Center
显示前 N 个数的和
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim S%, N%
Enabled False
输出自然数的反序数 CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
图 4-23 例 4.15 的程序运行界面
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim N&, M&, T&
Enabled False
输出求出的工程常量 e
(名称) cmdStart CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click()
Dim E#, N%, M&, Term!
E = 1: N = 1: M = 1
Term = Val(InputBox("", "输入精确度")) lblResult.Caption = "输入的精确度为:" & Term While 1 / M > Term
E = E + 1 / M N = N + 1 M = M * N Wend
txtE.Text = E End Sub
程序运行结果如图 4-24 所示。
图 4-24 例 4.16 的程序运行界面
4.3.2 固定循环次数的程序实现 1.格式
For <循环变量>=<初值> To <终值> Step <步长值>
<循环体>
[Exit For]
Next <循体变量>
其中<初值>、<终值>、<步长值>可以是数值型常量、变量和表达式。
2.功能
当循环变量不“超过”终值时,将一次增加一个步长值地重复执行循环体。其具体执行 过程是:执行到 For 语句时,循环变量先得到“初值”,然后与“终值”比较;如果循环变量 未“超过”终值,那就执行循环体。执行到 Next 语句时,循环变量累加一个步长值,之后再 与终值进行比较。若没有“超过”终值,则重复上述过程,直到循环变量“超过”终值才退出 循环而转到 Next 语句后继续执行。
Exit For 语句的功能是无条件退出循环转到 Next 语句后继续执行。
3.说明
(1)For 和 Next 必须配对使用。
(2)当步长值为 1 时,“Step 1”可省略。
(3)当步长值>0 时,“超过”就是“>”;
当步长值<0 时,“超过”就是“<”。
(4)循环变量应尽量使用整型变量,以免出现误差。
(5)循环结束后,循环变量的值不变。即保持当前值。
【例 4.17】编写程序,计算:
n
k 1
S k
分析:这是一个典型的固定循环次数的问题。
为了简单直观起见,假设程序中我们用 S 表示待求的和;用 K 表示累加的数据;用 N 表示累加的终值。
控件的属性和作用如表 4-17 所示。
表 4-17 例 4.17 的属性设置
对象 属性 属性值 功能
Form1 Caption 例 4.17 计算自然数的和 显示程序的名称
(名称) lblResult Caption
Label
Alignment 2-Center
显示计算的结果
(名称) cmdStart CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim N%, S&, K%
N = Val(InputBox("输入完成后单击“确定”按钮", "输入 N 的值")) S = 0
For K = 1 To N S = S + K Next K
lblResult.Caption = "前 " & N & " 个数的和为:" & S End Sub
程序运行结果如图 4-25 所示。
图 4-25 例 4.17 的程序运行界面
【例 4.18】相传古代印度国王舍罕要褒奖他聪明能干的宰相(国际象棋发明者)达依尔。
国王问达依尔需要什么,达依尔说:国王只要在国际象棋棋盘上的第一格放一粒麦子,第二格
放两粒麦子,第三格放四粒麦子,以后都按此比例每一格都是前一格的两倍,一直放到第 64
Private Sub cmdStart_Click() Dim I%, S#
上面程序中是用 S = S + 2 ^ I 来计算麦子的颗粒数的。实际上我们往往用连乘的方法来 实现高次幂的乘方:
Private Sub cmdStart_Click() Dim I%, S#, K#
Enabled False
显示输入的数据
(名称) cmdStart CommandButton
Caption 判断 开始处理
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“判断”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim I&, Num&
Dim Sign As Boolean Sign = False
Num = Val(txtNum.Text) For I = 2 To Sqr(Num)
If Num / I = Int(Num / I) Then Sign = True
Exit For End If Next I If Sign Then
lblResult.Caption = "不是素数"
Else
lblResult.Caption = "是素数"
End If End Sub
程序运行结果如图 4-27 所示。
图 4-27 例 4.19 的程序运行界面
说明:程序中设置了一个逻辑型变量 Sign,其初始值为 False。循环体中的选择语句用来 判断 Num 能否整除循环变量 I。如果能整除,则 Num 不为素数。此时,令 Sign 取值 True。
当确认了 Num 不为素数以后,循环就不需要再继续下去了。因此,程序中可以使用 Exit For 语句退出循环。
循环结束后,对 Sign 进行判断,如果 Sign 的值为 True,则在标签控件 lblResult 的 Caption 中显示“不是素数”;否则就显示“是素数”。
【例 4.20】一个皮球从 10 米的高度自由落下,假定每次落地后反弹到原高度的一半,再 落下。如此下去,编写程序,计算它第五次反弹时的高度。
分析:假设程序中我们用 H 表示高度,则每次的反弹高度都是其一半,则有 H=H/2。如 此循环 5 次即可得到所求的反弹高度。
控件的属性和作用如表 4-20 所示。
表 4-20 例 4.20 的属性设置
对象 属性 属性值 功能
Form1 Caption 例 4.20 球的反弹 显示程序的名称
(名称) lblResult Label
Caption 显示计算的结果
(名称) cmdStart CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim H!, I%
H = 10
For I = 1 To 5 H = H / 2 Next I
lblResult.Caption = "第五次反弹时的高度为: " & H End Sub
程序运行结果如图 4-28 所示。
图 4-28 例 4.20 的程序运行界面 请读者考虑:
(1)如果题目中要求不仅计算出落地五次后的反弹高度,而且还要计算皮球从放手到第 五次落地共经过了多少米?应如何修改程序?
(2)如果题目中的下落高度、反弹次数都不固定,又应该如何修改程序?
4.3.3 不固定循环次数的程序实现 1.格式
格式 1:
Do [While|Until <条件>]
<循环体>
[Exit Do]
Loop 格式 2:
Do
<循环体>
[Exit Do]
Loop [While|Until <条件>]
2.功能
格式中如果选择了“While <条件>”,则表示“当”条件成立时执行循环(当型循环),类 似 While-Wend 循环;格式中如果选择了“Until <条件>”,则表示“直到”条件成立才不执行 循环(直到型循环),条件为假时执行循环。
其中格式 1 是先测试条件(如果有[While|Until <条件>]选项的话),再根据测试的结果决 定是否执行循环;格式 2 是先执行循环然后再测试条件(如果有[While|Until 条件]选项的话),
根据测试的结果决定是否继续执行循环。
3.说明
该循环的常用格式为:
Do
<循环体>
If <条件> Then Exit Do Loop
注意:这种格式中必须要有一个条件语句决定是否退出 Do 循环,否则它就是一个“死循环”。
【例 4.21】编写程序, 求两个正整数的最大公约数。
分析:我们用辗转相除的方法求出两个数 A、B 的最大公约数。辗转相除的方法就是求 A 除以 B 的余数,当这个余数为 0 时,除数即为最大公约数。
我们可以通过利用求模运算 Mod 得到 A/B 的余数的方法求出 A/B 的余数 R,即:
R = A Mod B
如果 R≠0,我们将 B 的值赋给 A,将 R 的值赋给 B,然后再求新得到的 A、B 的余数;
如此下去,直到 R=0 为止,此时除数 B 的值就是 A、B 的最大公约数。
我们用具体的数据来说明一下处理过程。
例如:A 为 72,B 为 28
因此,4 即为 72 与 28 的最大公约数。
为了简单直观起见,假设程序中我们用 A、B 表示两个正整数,R 表示余数。
控件的属性和作用如表 4-21 所示。
A B R
72 Mod 28 = 16 ≠0
28 Mod 16 = 12 ≠0
16 Mod 12 = 4 ≠0
12 Mod 4 = 0 =0 即为所求
表 4-21 例 4.21 的属性设置
对象 属性 属性值 功能
Form1 Caption 例 4.21 计算最大公约数 显示程序的名称
(名称) txtA TextBox
Text 输入数据 A 的值
(名称) txtB TextBox
Text 输入数据 B 的值
(名称) lblResult Label
Caption 显示计算的结果
(名称) lblPromptA Label
Caption 数据 A 提示信息
(名称) lblPromptB Label
Caption 数据 B 提示信息
(名称) cmdStart CommandButton
Caption 计算 开始计算
(名称) cmdClose CommandButton
Caption 关闭 关闭窗口
“计算”命令按钮(cmdStart)的程序源代码如下:
Private Sub cmdStart_Click() Dim A%, B%, R%
A = Val(txtA.Text) B = Val(txtB.Text) Do
R = A Mod B
If R = 0 Then Exit Do A = B
B = R Loop
lblResult.Caption = "A、B 两数的最大公约数是:" & B End Sub
程序运行结果如图 4-29 所示。
图 4-29 例 4.21 的程序运行界面
图 4-29 例 4.21 的程序运行界面