• 沒有找到結果。

循环是客观世界普遍存在的一种现象。在茫茫宇宙之中,地球不停地围绕太阳循环运转;

滔滔江河也存在着回旋倒转的大大小小的旋涡;春夏秋冬来复去,白天黑夜去复来,就更是人 们司空见惯的了。

在人类社会,不但一般微观社会经济活动有时可抽象为某种循环往复的模式(例如,一 个工厂的整个经济活动,可以概括为供、产、销三环节周而复始的循环运动),而且整个宏观 经济活动,也可以概括为生产、分配、交换、消费四大环节的螺旋式循环运动。

同样,在我们所处理的问题中,常常遇到这样一些情况,它们的计算和处理方法完全一 样,只是要求重复计算多次,而每次使用的数据都按照一定的规则在改变。例如,需要对一个 班的 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 的程序运行界面

相關文件