2010-5-18 1
Visual Basic程序设计
第十讲
第四章 程序流程
(二)
2010-5-18 2
4.4 循环结构
For …Next 循环 Do…Loop 循环
2010-5-18 3
4.4 循环结构
循环结构是算法语言中一种重要的
结构,它的应用非常广泛,把要重复执行
的语句放在循环结构中,就可避免多次重
复输入。在使用循环结构时,有些循环的
次数事先可以确定,这种循环称为确定性
循环。有些循环的循环次数是不能事先确
定,需要根据条件来决定是否继续循环,
我们称这种循环为不确定循环。
2010-5-18 4
在 VB程序设计语句中有二种形
式的循环结构。
其中 For循环结构用来设计循环次
数可以事先确定的循环结构。即循
环次数已知循环结构。
而 Do…Loop 循环结构一般用来设计
循环次数无法事先确定的循环结构。
2010-5-18 5
4.4.1 For循环结构
? For 循环结构的一般形式:
For 循环控制 变量 = 初值 To 终值 [Step 步长 ]
[语句组 1]
[Exit For] 循环体
[语句组 2]
Next [ 循环控制 变量 ]
2010-5-18 6
For 循环结构 ---格式
? 说明:
For循环以 For语句开始,以 Next语句结束 。
循环变量用来控制循环次数;
初值代表循环变量的初始被赋的值;
终值代表循环变量最终能继续进行循环的值;
步长代表每循环一次循环变量增长的值。
2010-5-18 7
循环的次数可以从循环初值、终值、和步
长计算出来:
R=INT((终值 -初值 +步长 )/步长 )
例如, For I=1 To 10 Step 2
循环次数 R=INT((10-1+2)/2)=INT(5,5)=5
For I=5.0 To 25,Step 0.5
R=INT((25.-5.0+0.5)/0.5)=INT(41.0)=41
For循环结构
-----循环次数的计算
2010-5-18 8
For循环结构 -循环结构的一些规定
1、循环变量初值,终值和步长分别可以是常数、
变量和表达式。如果是变量,则它应是预先被赋
值。如果是表达式,则应先计算表达式的值。
2、初值,终值和步长的值可以为正或负,初值,
终值可以为零。但步长不能为零。
例如, For I= -1 To –3 Step -1的循环次数为,
R=INT((-3-(-1)+(-1))/-1)=3。
2010-5-18 9
即当 I的值为 -1,-2,-3时,执行正常
循环,当 I的值变成 -4时不再执行循环时。
3,脱离循环的条件是,
循环变量沿变化的方向超过终值 。 如
果步长的值为正,则, 超过, 意味着, 大
于,,如果步长为负,则, 超过, 意味着
,小于, 。
For 循环结构
--循环结构的一些规定
2010-5-18 10
4、如果计算出循环次数 R<0,按 R=0处理,
即一次也不执行循环体。
5、如果循环变量的初值,终值和步长类
型和循环变量的类型不一致,则按赋值的
规则处理,即先将其类型化成循环变量的
类型,然后进行处理,即先将初值,终
值和步长的类型化成循环变量的类型,然
后进行处理。
For 循环结构
--循环结构的一些规定
2010-5-18 11
1、执行 For循环语句时 先将初值赋给循环控制
变量。
2、再利用公式计算循环次数。
计算循环次数的公式,
R=Int((终值 -初值 +步长) /步长)
For循环结构
-----循环结构的执行过程
2010-5-18 12
3、检查循环次数,若 R=0(或 R<0),则跳
出循环体,执行 Next语句的下一个语句,若
R>0,则执行循环体。
4、执行 Next语句时,循环变量增值步长。
循环次数 R-1。
5、返回前面步骤 3,重复执行步骤 3,4。
For循环结构
---循环结构的执行过程
2010-5-18 13
6、其中 Exit For为在满足一定条件下退出
For循环结构。
若 For循环的语句为,
For 循环变量 =e1 To e2 Step e3
循环体
Next 循环变量
则其执行过程可用下页的流程图表示:
For循环结构
-----循环结构的执行过程
2010-5-18 14
图 4-15
For循
环执行
过程流
程图,
计算 e1,e2,e3的值
e1=>循环变量
计算应循环次数 R
R>0
执行循环体
循环次数 R减 1
循环变量增值 e3
执行 Next语句的下一个语句
N
Y
当 R<=0时
则循环变量
的值就超过
终值,若步
长为负值时,
超过终值则
表示小于终
值。
2010-5-18 15
【 例 4-7】 输入一个正整数, 利用 For循环来判
断是否为素数 。
分析:所谓素数是指除了 1和它本身之外,不
能被其他的数整除的数。判断一个自然数 n
( ≥3)是否为素数的方法是:依次用 2 ~ 各
数作除数去除,如果余数都不为 0,则为素
数。
工程设计步骤如下:
( 1)启动 VB,选“新建工程”中“标准 EXE”
工程。在出现的窗体上添加 1个文本框、两
个标签和两个命令按钮。如图 4-16左图所示。
n
2010-5-18 16
( 2) 设置窗体和控件的属性如图 4-16右图所示 。
其中标签 Label2的 Caption属性开始设置
为“输出判断结果:”在工程运行后应输出具
体的判断结果。
图 4-16判断素数工程设计界面和属性设置
2010-5-18 17
在文本框中输入一个自然数 n
j =,i = 2
n
当 i <=
n
求 n / i 的余数 r
余数 r = 0
退出循环
i > jY N
输出 n为素数 输出 n为非素数
i = i+1
图 4-17
判断自然数 n
是否为素数的
程序流程 Y N
2010-5-18 18
( 3) 编写代码
编写单击 Command1命令按钮, 判断, 所
执行的代码
Private Sub Command1_Click()
Dim i As Long,j As Long,n As Long
n = Val(Text1.Text)
j = Clng(Sqr(n))
Debug.Print j
2010-5-18 19
For i = 2 To j
If n Mod i = 0 Then Exit For
Next i
Debug.Print i
If i > j Then
Label2.Caption = Text1.Text & "为素数 "
Else
Label2.Caption = Text1.Text & "为非素数 "
End If
End Sub
2010-5-18 20
编写单击 Command2命令按钮, 退出, 所
执行的代码
Private Sub Command2_Click()
Unload Me
End Sub
编写 Form_Activate()事件发生时所执行的
代码
Private Sub Form_Activate()
Text1.SetFocus
End Sub
2010-5-18 21
( 4)运行结果。按 F5键运行工程,当出
现运行画面时在提示的文本框中输入 1个
自然数例如 137,然后单击“判断”按钮,
就会在标签 2中显示,137为非素数”的
信息。如图 4-16所示。
图 4-16 判断素数工程运行结果
2010-5-18 22
4.4.2 多重循环
通常把循环体内不含有循环语句的
循环称为单层循环,而把循环体内含有
循环语句的循环称为多重环。例如在一
个循环体内含有一个循环语句的称为二
重循环。多重循环又称为多层循环和循
环的嵌套。下面通过例题来讲解多重循
环的应用。
2010-5-18 23
【 例 4-8】 我国古代数学家张丘建在, 算经,
里提出一个世界数学史上有名的百鸡问
题:鸡翁一, 值钱五, 鸡母一, 值钱三,
鸡雏三, 值钱一, 百钱买百鸡, 问鸡翁,
母, 雏各几何?
分析:若公鸡 x只,母鸡 y只,小鸡 z只,
依题意可以列出以下方程组:
??
?
?
?
???
???
100
3
35
100
x
yx
zyx
2010-5-18 24
在上面的两个方程中,有 3个未知
数,属于不定方程,无法直接求解。下
面我们用“穷举法”求解。穷举法是将
各种可能的组合全部一一测试,将符合
条件的组合输出。这里使用二层循环结
构。即将公鸡数从 1变化到 100,母鸡数
也从 1变化到 100,对于每一组公鸡和母
鸡数,从 100中减去公鸡和母鸡数就得到
小鸡的个数,然后再计算买三种鸡的总
钱数是否为 100元。若是就得到一组解,
然后再继续。
2010-5-18 25
再仔细分析一下,若 100元钱全部都买公鸡
最多买 20只,如果全部买母鸡最多买 33只,
所以穷举法外循环中公鸡数可从 1 变到 19,
内循环中母鸡数可从 1 变化到 33,小鸡个数
应 100中减去公鸡数和母鸡数得到。
工程设计步骤如下:
( 1) 新建, 标准 EXE”工程, 在出现的窗体
上添加四个标签, 一个列表框, 一个框架和
两个命令按钮 。 其中标签 1是放在框架内 。
2010-5-18 26
( 2)标签 1的 Caption属性设为“公鸡五元、
母鸡三元、小鸡一元钱三只。 100元钱买
100只鸡。问公鸡、母鸡、小鸡各多少
只?”标签 2-标签 4的 Caption属性分别设
置为“公鸡”、“母鸡”、“小鸡”。
如下图所示。
2010-5-18 27
( 3) 代码编写如下:
编写单击命令按钮, 计算, 所执行的代码如下 。
Private Sub Command1_Click()
List1.Clear
For x = 1 To 19 '外循环求公鸡数
For y = 1 To 33 '内循环求母鸡数
z = 100 - x – y '小鸡数
If 5 * x + y * 3 + z / 3 = 100 Then
p = Format(x,"@@@") & Format(y,_
"@@@@@@")& Format(z,"@@@@@@")
Format
是格式化
一个表达
式。
2010-5-18 28
Rem 把满足条件的一种情况添加到列表框中 。
List1.AddItem p
End If
Next y
Next x
End Sub
编写单击命令按钮, 退出, 所执行的代码如下 。
Private Sub Command2_Click()
End
End Sub
在列表框中
使用
AddItem方
法添加项目
2010-5-18 29
( 4)运行结果。按 F5键运行工程出现运
行界面后按“计算”按钮后,得到结果
如下图所示。
图 4-17 百钱买百鸡问题的运行结果
2010-5-18 30
[例 4-10]在窗体上输出下列图案
2010-5-18 31
问题分析:
该图案共有十行,每行有十个星号。要
想输出该图案应使用 For 循环结构,可以先用
变量 a存放这十个星号。使用语句:
a=“**********”
由于要输出的是一个平行四边形,每一
行的起始位置比上一行位置多 2列。因此要使
用 Tab函数来确定每一行输出的起始位置。
语句 Print Tab(2* i) ;表示从第 2* i 列开
始输出内容。编写代码如下:
2010-5-18 32
Option Explicit
Private Sub Command1_Click()
Dim a As String,i As Integer,j As Integer
a = "**********"
Form1.FontSize = 14
For i = 1 To 10
Print Tab(2 * i);
Print a
Next i
End Sub
表示从每
一行的第
2* i 列开
始输出变
量 a的值。
2010-5-18 33
[例 4-11]在窗体上输出下列图案
2010-5-18 34
问题分析:
该图案共有十行,每行有不同的星号。
第一行有一个,*”,第二行有三个,*”,
第三行有五个,*” ……,要想输出该图案
应使用双层 For 循环结构,外层循环决定输出
的行数,内层循环决定每行输出的星号数。
可以先用变量 a存放一个星号。使用语句:
a=“*”
由于要输出的是一个等腰三角形,每一
行的起始位置比上一行位置少一列。因此要
使用 Tab函数来确定每一行的起始位置。
语句 Print Tab(18- i) ;表示从第 18-i 列开始
输出内容。编写代码如下:
2010-5-18 35
编写代码如下:
Option Explicit
Private Sub Form_Click()
Dim a As String
Dim i As Integer,j As Integer
a = "*"
Form1.FontSize = 14
2010-5-18 36
For i = 1 To 10
Print Tab(18 - i);
For j = 1 To 2 * i - 1
Print a;
Next j
Print
Next i
End Sub
外循环决定
共输出几行
内循环决定每行共
有几个,*”第一行
是 1个,*”,第二
行是 3个
,*”,…… 第 n是
2*n-1个,*”。
输出的位置
2010-5-18 37
[例 4-12]在窗体上输出乘法九九表
2010-5-18 38
Option Explicit
Private Sub Form_Click()
Dim i As Integer,j As Integer,k As Integer
Dim m As Integer
FontSize = 12
Print Tab(25); "乘法九九表 "
Print,Print
Print "* ";
For i = 1 To 9
Print Tab(i * 6); i;
Next i
Print
输
出
表
头
2010-5-18 39
For j = 1 To 9
Print j; " ";
For k = 1 To j
Print Tab(k * 6); j * k; " ";
Next k
Print
Next j
End Sub
内
循
环
决
定
输
出
乘
积
及
个
数
外
循
环
决
定
共
输
出
几
行
2010-5-18 40
[例 4-13]打印下列图案
分析:上面的图案可分成两个等腰三角形。
上面的三角形有 5行第 1行为一个,*”,第
2行为三个,*”,第 3行为五个 …… 第 5行
有 2*5-1个,*”。代码编写如下页所示。
2010-5-18 41
Option Explicit
Private Sub Form_Click()
Dim i As Integer,j As Integer
Dim a As String
For i = 1 To 5
Print Tab(20 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Print
Next i
输
出
上
三
角
形
2010-5-18 42
For i = 4 To 1 Step -1
Print Tab(20 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Print
Next i
End Sub
输
出
下
三
角
形
2010-5-18 43
4.4.3 Do ……Loop 循环结构
Do …… Loop循环结构也是常用的循
环结构 。 对于一些无法事先确定循环次数
的程序, 可用 Do …… Loop型循环结构 。
1,它的格式有两种:
格式 1:先测型
Do [While| Until ] <条件 >
[<语句组 1>]
[ Exit Do ]
[<语句组 2> ]
Loop
2010-5-18 44
格式 2:后测型
Do
[<语句组 1>]
[ Exit Do ]
[<语句组 2> ]
Loop [While | Until ] <条件 >
2010-5-18 45
2,说明:
( 1)格式 1中,Do While<条件
>…… Loop 语句”,是先测型当型
循环。即先判断 While后面的条件
是否为“真”,如果为“真”则执
行循环体里面的各语句,如果为
“假”,则退出循环,循环直到条
件为“假”终止。
2010-5-18 46
( 2)格式 2中,Do …… Loop While< 条
件 > 语句”是后测型当型循环。与前
者的区别在于,它不管条件的真假,
都会先执行,Do”后面的语句,也就是
循环体,当执行到 Loop While<条件 >
语句时,再判断 <条件 >的真假,如果
为“真”则返回执行循环体里面的各
语句,如果为“假”,则退出循环,
循环直到条件为“假”终止。也就是
说,它至少执行循环体一次。
2010-5-18 47
在两种格式中 While语句都可以用 Until
语句代替,它是直到条件为真时则终止循
环。注意 While 语句后面的条件和 Until语
句的条件正好互补。
例如:求 5!
如果使用当型循环则 While 后的条件
是( N<=5)。
而如果用 Until语句,则后面的条件为
( N>5)。为了避免混淆,所以我们建议只
用 Do While循环即可。
2010-5-18 48
( 3) 格式中 [ Exit Do ]为可选项, 在上面两种 Do
循环结构中, 可以有一个或多个 Exit Do语句,
以便在满足一定的条件下, 随时退出循环体 。
下页中分别给出前测型 Do While…Loop 和
Do Until …Loop 循环结构的逻辑框图。同学们
可自己画出后测型的两种逻辑框图。
2010-5-18 49
开始
计算“条件”值
“条件”为真吗?
执行循环体
结束
Y
N
开始
计算“条件”值
“条件”为真吗?
执行循环体
结束
N
Y
Do While…Loop 循环逻辑框图 Do Until…Loop 循环逻辑框图
2010-5-18 50
【 例 4-14】 任意输入一个自然数, 编
程输出其各个因子 。 工程设计步骤
如下:
( 1)新建“标准 EXE”工程,在出现
的界面上添加三个标签、一个文本
框、和两个命令按钮如图 4-18所示。
Do……Loop 循环举例
2010-5-18 51
( 2)设置窗体及控件的属性。标签 1
的 Caption属性为“请输入一个自然
数”;标签 2的 Caption属性为,N的
因子是:”;标签 3的 Caption属性为
空,在运行时赋值。另外标签 3的
Autosize属性为 True,以便在运行时
赋值能根据实际内容自动适应。其
他属性如下页图 4-18所示。
2010-5-18 52
图 4-18求自然数因子的工程界面及属性设置
2010-5-18 53
输入一个数 y
图 4- 19 输出某个自然数 y的所有因子流程图
i=2
y Mod i=0
While y <>1
输出 i
y =y \ i
i = i +1
Y N
2010-5-18 54
( 3) 编写代码如下:
编写单击命令按钮, 计算, 所执行的代码
Private Sub Command1_Click()
Dim x As String,y As Single
y = Val(Text1.Text)
i = 2
x = ""
2010-5-18 55
Do While y <> 1
If y Mod i = 0 Then
x = x & "* " & Str(i) & Chr(13)
y = y \ i
Else
i = i + 1
End If
Loop
Label3.Caption = x
Label2.Caption = Text1.Text & "的因子是,"
End Sub
为找下一个
因子做准备。
2010-5-18 56
( 4)运行结果。按 F5执行工程,当
出现运行界面时,从文本中输入一
个自然数,然后单击命令按钮“计
算”就会得到如图 4-20所示的结果。
即在标签 3中输出了自然数的各个因
子相乘的结果;另外,标签 2的内容
也根据输入的数自动改变如图 4-20
所示。
2010-5-18 57
图 4-20 求自然数因子的运行结果
2010-5-18 58
【 例 4-15】 用牛顿迭代法求方程的根 。 所求的方程
为:
分析:用牛顿迭代法求方程 f (x ) = 0在 x0 附近的实
根的方法如下 。
( 1) 选一个接近 x的真实根 x1 ;
( 2) 通过 x1 求出 f( x1 )。 在几何中就是作 x ? x1,
交 f (x )于 f ( x1 )见图 4-21所示 。
( 3) 过 f( x1 )作 f (x )的切线, 交 x 轴于 x2,可以用
公式求出 x2。 由于
21
1
1
)(
)('
xx
xf
xf
?
?
0?? xe x
2010-5-18 59
)('
)(
1
1
12 xf
xfxx ??
( 4)通过 x2 求出 f(x2 )。
( 5)再通过 f( x2 )作 f (x )的切线,交 x 轴于
x3 。
( 6)再通过 x3 求出 f( x3 )。再通过 f( x3 )作 f (x )
的切线,交 x 轴于 x4 。 … 一直求下去,直到接
近真正的根。当两次求出的根之差 | xn+1-xn |≤ε
就认为 xn+1足够接近于真实的根。
故
2010-5-18 60
牛顿迭代公式是,
)('
)(
1
n
n
nn xf
xfxx ??
?
f(x)
x1x2x3x4
f(x1)
f(x2)
f(x3)
f(x4)
y
x
图 4-21牛顿迭代法几何原理图
2010-5-18 61
工程设计步骤如下:
( 1) 新建, 标准 EXE”工程, 在出现的界面上
添加两个标签, 一个文本框, 一个图片框和两
个命令按钮 。 如图 4-22左图所示 。
( 2)设置窗体及控件的属性如图 4-22左图所示。
4-22牛顿迭代法求方程根工程界面设计及运行结果
2010-5-18 62
( 3) 编写代码如下
编写单击 Command1命令按钮, 求根, 所执
行的代码
Private Sub Command1_Click()
Dim f As Double,f1 As Double
Const eps = 0.0001
Dim x0 As Double,x1 As Double
x1 = Val(Text1.Text)
2010-5-18 63
Do
x0 = x1
f = Exp(-x0) - x0
f1 = -Exp(-x0) - 1
x1 = x0 - f / f1
Loop While (x1 - x0) > eps
Picture1.Cls
Picture1.Print x1
End Sub 根从图片框上输出
牛顿迭代法
求根
2010-5-18 64
编写单击 Command2命令按钮, 退出, 所执
行的代码
Private Sub Command2_Click()
End
End Sub
编写单击窗体所执行的代码
Private Sub Form_Click()
Text1.Text = " "
Picture1.Cls
End Sub
2010-5-18 65
编写文本框变化时所执行的代码
Private Sub Text1_Change()
Const Tile = "牛顿迭代法求方程根程序 "
If Text1.Text <> " " And_
Not IsNumeric(Text1.Text) Then
MsgBox "输入的不是数字 ! ",vbOKOnly,Tile
Text1.Text = " "
Text1.SetFocus
End If
End Sub
2010-5-18 66
( 4) 运行工程 。 按 F5键运行工程 。 当
出现运行画面时在文本框中输入方程
的初始根, 然后单击, 计算, 命令按
钮, 就可在下面的图片框中输出方程
的根如下页图 4-23所示 。
注意:在程序中,对于文本框中输入
的不是数字的其他情况给出了必要的
提示。
2010-5-18 67
图 4-23 牛顿迭代法求方程根程序运行结果
2010-5-18 68
4.4.3 For… Next 循环和
Do …Loop 循环的关系
前面已经提出,对于已知循环次数的
循环使用 For… Next 循环结构来设计比较
方便,而对于循环次未知的情况最好使用
Do …Loop 循环,其实在很多情况下,同
一个问题可以使用两种循环结构的任意一
种形式来设计。例如例 4-7判断 1个数是否
为素数的程序中,编写单击命令按钮“判
断”所执行的代码原来是 For… Next 循环
结构来设计的,也可用 Do …Loop 循环结
构来设计。
2010-5-18 69
改写如下:
Private Sub Command1_Click()
Dim i,j,n As Long
n = Val(Text1.Text)
j = Clng(Sqr(n))
i=2
Do while(i<=j and n mod i <>0)
i=i+1
loop
2010-5-18 70
Debug.Print i
If i > j Then
Label2.Caption = Text1.Text & "为素数 "
Else
Label2.Caption = Text1.Text & "为非素数
"
End If
End Sub
程序运行结果完全正确 。
同样使用 Do …Loop 循环结构设计的程序也
可以改为 For… Next 循环结构来设计。
2010-5-18 71
但从上面的例题中可以看出对于需满足
多个条件才能循环的程序使用 Do … Loop循
环结构更方便一些 。 而对于只需满足一个条
件, 且循环次数已知的循环, 最好使用
For… Next循环结构来设计 。 因为在 For…
Next循环结构中, 循环控制变量可以自动增
值, 不需在程序中再考虑 。 而在 Do … Loop
循环结构中, 既要考虑满足什么条件才能进
入循环, 同时还要考虑如何退出循环, 也就
是说循环体中要有能使条件不满足退出循环
的语句 。 这些因素都是在设计循环结构时应
考虑的问题 。
Visual Basic程序设计
第十讲
第四章 程序流程
(二)
2010-5-18 2
4.4 循环结构
For …Next 循环 Do…Loop 循环
2010-5-18 3
4.4 循环结构
循环结构是算法语言中一种重要的
结构,它的应用非常广泛,把要重复执行
的语句放在循环结构中,就可避免多次重
复输入。在使用循环结构时,有些循环的
次数事先可以确定,这种循环称为确定性
循环。有些循环的循环次数是不能事先确
定,需要根据条件来决定是否继续循环,
我们称这种循环为不确定循环。
2010-5-18 4
在 VB程序设计语句中有二种形
式的循环结构。
其中 For循环结构用来设计循环次
数可以事先确定的循环结构。即循
环次数已知循环结构。
而 Do…Loop 循环结构一般用来设计
循环次数无法事先确定的循环结构。
2010-5-18 5
4.4.1 For循环结构
? For 循环结构的一般形式:
For 循环控制 变量 = 初值 To 终值 [Step 步长 ]
[语句组 1]
[Exit For] 循环体
[语句组 2]
Next [ 循环控制 变量 ]
2010-5-18 6
For 循环结构 ---格式
? 说明:
For循环以 For语句开始,以 Next语句结束 。
循环变量用来控制循环次数;
初值代表循环变量的初始被赋的值;
终值代表循环变量最终能继续进行循环的值;
步长代表每循环一次循环变量增长的值。
2010-5-18 7
循环的次数可以从循环初值、终值、和步
长计算出来:
R=INT((终值 -初值 +步长 )/步长 )
例如, For I=1 To 10 Step 2
循环次数 R=INT((10-1+2)/2)=INT(5,5)=5
For I=5.0 To 25,Step 0.5
R=INT((25.-5.0+0.5)/0.5)=INT(41.0)=41
For循环结构
-----循环次数的计算
2010-5-18 8
For循环结构 -循环结构的一些规定
1、循环变量初值,终值和步长分别可以是常数、
变量和表达式。如果是变量,则它应是预先被赋
值。如果是表达式,则应先计算表达式的值。
2、初值,终值和步长的值可以为正或负,初值,
终值可以为零。但步长不能为零。
例如, For I= -1 To –3 Step -1的循环次数为,
R=INT((-3-(-1)+(-1))/-1)=3。
2010-5-18 9
即当 I的值为 -1,-2,-3时,执行正常
循环,当 I的值变成 -4时不再执行循环时。
3,脱离循环的条件是,
循环变量沿变化的方向超过终值 。 如
果步长的值为正,则, 超过, 意味着, 大
于,,如果步长为负,则, 超过, 意味着
,小于, 。
For 循环结构
--循环结构的一些规定
2010-5-18 10
4、如果计算出循环次数 R<0,按 R=0处理,
即一次也不执行循环体。
5、如果循环变量的初值,终值和步长类
型和循环变量的类型不一致,则按赋值的
规则处理,即先将其类型化成循环变量的
类型,然后进行处理,即先将初值,终
值和步长的类型化成循环变量的类型,然
后进行处理。
For 循环结构
--循环结构的一些规定
2010-5-18 11
1、执行 For循环语句时 先将初值赋给循环控制
变量。
2、再利用公式计算循环次数。
计算循环次数的公式,
R=Int((终值 -初值 +步长) /步长)
For循环结构
-----循环结构的执行过程
2010-5-18 12
3、检查循环次数,若 R=0(或 R<0),则跳
出循环体,执行 Next语句的下一个语句,若
R>0,则执行循环体。
4、执行 Next语句时,循环变量增值步长。
循环次数 R-1。
5、返回前面步骤 3,重复执行步骤 3,4。
For循环结构
---循环结构的执行过程
2010-5-18 13
6、其中 Exit For为在满足一定条件下退出
For循环结构。
若 For循环的语句为,
For 循环变量 =e1 To e2 Step e3
循环体
Next 循环变量
则其执行过程可用下页的流程图表示:
For循环结构
-----循环结构的执行过程
2010-5-18 14
图 4-15
For循
环执行
过程流
程图,
计算 e1,e2,e3的值
e1=>循环变量
计算应循环次数 R
R>0
执行循环体
循环次数 R减 1
循环变量增值 e3
执行 Next语句的下一个语句
N
Y
当 R<=0时
则循环变量
的值就超过
终值,若步
长为负值时,
超过终值则
表示小于终
值。
2010-5-18 15
【 例 4-7】 输入一个正整数, 利用 For循环来判
断是否为素数 。
分析:所谓素数是指除了 1和它本身之外,不
能被其他的数整除的数。判断一个自然数 n
( ≥3)是否为素数的方法是:依次用 2 ~ 各
数作除数去除,如果余数都不为 0,则为素
数。
工程设计步骤如下:
( 1)启动 VB,选“新建工程”中“标准 EXE”
工程。在出现的窗体上添加 1个文本框、两
个标签和两个命令按钮。如图 4-16左图所示。
n
2010-5-18 16
( 2) 设置窗体和控件的属性如图 4-16右图所示 。
其中标签 Label2的 Caption属性开始设置
为“输出判断结果:”在工程运行后应输出具
体的判断结果。
图 4-16判断素数工程设计界面和属性设置
2010-5-18 17
在文本框中输入一个自然数 n
j =,i = 2
n
当 i <=
n
求 n / i 的余数 r
余数 r = 0
退出循环
i > jY N
输出 n为素数 输出 n为非素数
i = i+1
图 4-17
判断自然数 n
是否为素数的
程序流程 Y N
2010-5-18 18
( 3) 编写代码
编写单击 Command1命令按钮, 判断, 所
执行的代码
Private Sub Command1_Click()
Dim i As Long,j As Long,n As Long
n = Val(Text1.Text)
j = Clng(Sqr(n))
Debug.Print j
2010-5-18 19
For i = 2 To j
If n Mod i = 0 Then Exit For
Next i
Debug.Print i
If i > j Then
Label2.Caption = Text1.Text & "为素数 "
Else
Label2.Caption = Text1.Text & "为非素数 "
End If
End Sub
2010-5-18 20
编写单击 Command2命令按钮, 退出, 所
执行的代码
Private Sub Command2_Click()
Unload Me
End Sub
编写 Form_Activate()事件发生时所执行的
代码
Private Sub Form_Activate()
Text1.SetFocus
End Sub
2010-5-18 21
( 4)运行结果。按 F5键运行工程,当出
现运行画面时在提示的文本框中输入 1个
自然数例如 137,然后单击“判断”按钮,
就会在标签 2中显示,137为非素数”的
信息。如图 4-16所示。
图 4-16 判断素数工程运行结果
2010-5-18 22
4.4.2 多重循环
通常把循环体内不含有循环语句的
循环称为单层循环,而把循环体内含有
循环语句的循环称为多重环。例如在一
个循环体内含有一个循环语句的称为二
重循环。多重循环又称为多层循环和循
环的嵌套。下面通过例题来讲解多重循
环的应用。
2010-5-18 23
【 例 4-8】 我国古代数学家张丘建在, 算经,
里提出一个世界数学史上有名的百鸡问
题:鸡翁一, 值钱五, 鸡母一, 值钱三,
鸡雏三, 值钱一, 百钱买百鸡, 问鸡翁,
母, 雏各几何?
分析:若公鸡 x只,母鸡 y只,小鸡 z只,
依题意可以列出以下方程组:
??
?
?
?
???
???
100
3
35
100
x
yx
zyx
2010-5-18 24
在上面的两个方程中,有 3个未知
数,属于不定方程,无法直接求解。下
面我们用“穷举法”求解。穷举法是将
各种可能的组合全部一一测试,将符合
条件的组合输出。这里使用二层循环结
构。即将公鸡数从 1变化到 100,母鸡数
也从 1变化到 100,对于每一组公鸡和母
鸡数,从 100中减去公鸡和母鸡数就得到
小鸡的个数,然后再计算买三种鸡的总
钱数是否为 100元。若是就得到一组解,
然后再继续。
2010-5-18 25
再仔细分析一下,若 100元钱全部都买公鸡
最多买 20只,如果全部买母鸡最多买 33只,
所以穷举法外循环中公鸡数可从 1 变到 19,
内循环中母鸡数可从 1 变化到 33,小鸡个数
应 100中减去公鸡数和母鸡数得到。
工程设计步骤如下:
( 1) 新建, 标准 EXE”工程, 在出现的窗体
上添加四个标签, 一个列表框, 一个框架和
两个命令按钮 。 其中标签 1是放在框架内 。
2010-5-18 26
( 2)标签 1的 Caption属性设为“公鸡五元、
母鸡三元、小鸡一元钱三只。 100元钱买
100只鸡。问公鸡、母鸡、小鸡各多少
只?”标签 2-标签 4的 Caption属性分别设
置为“公鸡”、“母鸡”、“小鸡”。
如下图所示。
2010-5-18 27
( 3) 代码编写如下:
编写单击命令按钮, 计算, 所执行的代码如下 。
Private Sub Command1_Click()
List1.Clear
For x = 1 To 19 '外循环求公鸡数
For y = 1 To 33 '内循环求母鸡数
z = 100 - x – y '小鸡数
If 5 * x + y * 3 + z / 3 = 100 Then
p = Format(x,"@@@") & Format(y,_
"@@@@@@")& Format(z,"@@@@@@")
Format
是格式化
一个表达
式。
2010-5-18 28
Rem 把满足条件的一种情况添加到列表框中 。
List1.AddItem p
End If
Next y
Next x
End Sub
编写单击命令按钮, 退出, 所执行的代码如下 。
Private Sub Command2_Click()
End
End Sub
在列表框中
使用
AddItem方
法添加项目
2010-5-18 29
( 4)运行结果。按 F5键运行工程出现运
行界面后按“计算”按钮后,得到结果
如下图所示。
图 4-17 百钱买百鸡问题的运行结果
2010-5-18 30
[例 4-10]在窗体上输出下列图案
2010-5-18 31
问题分析:
该图案共有十行,每行有十个星号。要
想输出该图案应使用 For 循环结构,可以先用
变量 a存放这十个星号。使用语句:
a=“**********”
由于要输出的是一个平行四边形,每一
行的起始位置比上一行位置多 2列。因此要使
用 Tab函数来确定每一行输出的起始位置。
语句 Print Tab(2* i) ;表示从第 2* i 列开
始输出内容。编写代码如下:
2010-5-18 32
Option Explicit
Private Sub Command1_Click()
Dim a As String,i As Integer,j As Integer
a = "**********"
Form1.FontSize = 14
For i = 1 To 10
Print Tab(2 * i);
Print a
Next i
End Sub
表示从每
一行的第
2* i 列开
始输出变
量 a的值。
2010-5-18 33
[例 4-11]在窗体上输出下列图案
2010-5-18 34
问题分析:
该图案共有十行,每行有不同的星号。
第一行有一个,*”,第二行有三个,*”,
第三行有五个,*” ……,要想输出该图案
应使用双层 For 循环结构,外层循环决定输出
的行数,内层循环决定每行输出的星号数。
可以先用变量 a存放一个星号。使用语句:
a=“*”
由于要输出的是一个等腰三角形,每一
行的起始位置比上一行位置少一列。因此要
使用 Tab函数来确定每一行的起始位置。
语句 Print Tab(18- i) ;表示从第 18-i 列开始
输出内容。编写代码如下:
2010-5-18 35
编写代码如下:
Option Explicit
Private Sub Form_Click()
Dim a As String
Dim i As Integer,j As Integer
a = "*"
Form1.FontSize = 14
2010-5-18 36
For i = 1 To 10
Print Tab(18 - i);
For j = 1 To 2 * i - 1
Print a;
Next j
Next i
End Sub
外循环决定
共输出几行
内循环决定每行共
有几个,*”第一行
是 1个,*”,第二
行是 3个
,*”,…… 第 n是
2*n-1个,*”。
输出的位置
2010-5-18 37
[例 4-12]在窗体上输出乘法九九表
2010-5-18 38
Option Explicit
Private Sub Form_Click()
Dim i As Integer,j As Integer,k As Integer
Dim m As Integer
FontSize = 12
Print Tab(25); "乘法九九表 "
Print,Print
Print "* ";
For i = 1 To 9
Print Tab(i * 6); i;
Next i
输
出
表
头
2010-5-18 39
For j = 1 To 9
Print j; " ";
For k = 1 To j
Print Tab(k * 6); j * k; " ";
Next k
Next j
End Sub
内
循
环
决
定
输
出
乘
积
及
个
数
外
循
环
决
定
共
输
出
几
行
2010-5-18 40
[例 4-13]打印下列图案
分析:上面的图案可分成两个等腰三角形。
上面的三角形有 5行第 1行为一个,*”,第
2行为三个,*”,第 3行为五个 …… 第 5行
有 2*5-1个,*”。代码编写如下页所示。
2010-5-18 41
Option Explicit
Private Sub Form_Click()
Dim i As Integer,j As Integer
Dim a As String
For i = 1 To 5
Print Tab(20 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Next i
输
出
上
三
角
形
2010-5-18 42
For i = 4 To 1 Step -1
Print Tab(20 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Next i
End Sub
输
出
下
三
角
形
2010-5-18 43
4.4.3 Do ……Loop 循环结构
Do …… Loop循环结构也是常用的循
环结构 。 对于一些无法事先确定循环次数
的程序, 可用 Do …… Loop型循环结构 。
1,它的格式有两种:
格式 1:先测型
Do [While| Until ] <条件 >
[<语句组 1>]
[ Exit Do ]
[<语句组 2> ]
Loop
2010-5-18 44
格式 2:后测型
Do
[<语句组 1>]
[ Exit Do ]
[<语句组 2> ]
Loop [While | Until ] <条件 >
2010-5-18 45
2,说明:
( 1)格式 1中,Do While<条件
>…… Loop 语句”,是先测型当型
循环。即先判断 While后面的条件
是否为“真”,如果为“真”则执
行循环体里面的各语句,如果为
“假”,则退出循环,循环直到条
件为“假”终止。
2010-5-18 46
( 2)格式 2中,Do …… Loop While< 条
件 > 语句”是后测型当型循环。与前
者的区别在于,它不管条件的真假,
都会先执行,Do”后面的语句,也就是
循环体,当执行到 Loop While<条件 >
语句时,再判断 <条件 >的真假,如果
为“真”则返回执行循环体里面的各
语句,如果为“假”,则退出循环,
循环直到条件为“假”终止。也就是
说,它至少执行循环体一次。
2010-5-18 47
在两种格式中 While语句都可以用 Until
语句代替,它是直到条件为真时则终止循
环。注意 While 语句后面的条件和 Until语
句的条件正好互补。
例如:求 5!
如果使用当型循环则 While 后的条件
是( N<=5)。
而如果用 Until语句,则后面的条件为
( N>5)。为了避免混淆,所以我们建议只
用 Do While循环即可。
2010-5-18 48
( 3) 格式中 [ Exit Do ]为可选项, 在上面两种 Do
循环结构中, 可以有一个或多个 Exit Do语句,
以便在满足一定的条件下, 随时退出循环体 。
下页中分别给出前测型 Do While…Loop 和
Do Until …Loop 循环结构的逻辑框图。同学们
可自己画出后测型的两种逻辑框图。
2010-5-18 49
开始
计算“条件”值
“条件”为真吗?
执行循环体
结束
Y
N
开始
计算“条件”值
“条件”为真吗?
执行循环体
结束
N
Y
Do While…Loop 循环逻辑框图 Do Until…Loop 循环逻辑框图
2010-5-18 50
【 例 4-14】 任意输入一个自然数, 编
程输出其各个因子 。 工程设计步骤
如下:
( 1)新建“标准 EXE”工程,在出现
的界面上添加三个标签、一个文本
框、和两个命令按钮如图 4-18所示。
Do……Loop 循环举例
2010-5-18 51
( 2)设置窗体及控件的属性。标签 1
的 Caption属性为“请输入一个自然
数”;标签 2的 Caption属性为,N的
因子是:”;标签 3的 Caption属性为
空,在运行时赋值。另外标签 3的
Autosize属性为 True,以便在运行时
赋值能根据实际内容自动适应。其
他属性如下页图 4-18所示。
2010-5-18 52
图 4-18求自然数因子的工程界面及属性设置
2010-5-18 53
输入一个数 y
图 4- 19 输出某个自然数 y的所有因子流程图
i=2
y Mod i=0
While y <>1
输出 i
y =y \ i
i = i +1
Y N
2010-5-18 54
( 3) 编写代码如下:
编写单击命令按钮, 计算, 所执行的代码
Private Sub Command1_Click()
Dim x As String,y As Single
y = Val(Text1.Text)
i = 2
x = ""
2010-5-18 55
Do While y <> 1
If y Mod i = 0 Then
x = x & "* " & Str(i) & Chr(13)
y = y \ i
Else
i = i + 1
End If
Loop
Label3.Caption = x
Label2.Caption = Text1.Text & "的因子是,"
End Sub
为找下一个
因子做准备。
2010-5-18 56
( 4)运行结果。按 F5执行工程,当
出现运行界面时,从文本中输入一
个自然数,然后单击命令按钮“计
算”就会得到如图 4-20所示的结果。
即在标签 3中输出了自然数的各个因
子相乘的结果;另外,标签 2的内容
也根据输入的数自动改变如图 4-20
所示。
2010-5-18 57
图 4-20 求自然数因子的运行结果
2010-5-18 58
【 例 4-15】 用牛顿迭代法求方程的根 。 所求的方程
为:
分析:用牛顿迭代法求方程 f (x ) = 0在 x0 附近的实
根的方法如下 。
( 1) 选一个接近 x的真实根 x1 ;
( 2) 通过 x1 求出 f( x1 )。 在几何中就是作 x ? x1,
交 f (x )于 f ( x1 )见图 4-21所示 。
( 3) 过 f( x1 )作 f (x )的切线, 交 x 轴于 x2,可以用
公式求出 x2。 由于
21
1
1
)(
)('
xx
xf
xf
?
?
0?? xe x
2010-5-18 59
)('
)(
1
1
12 xf
xfxx ??
( 4)通过 x2 求出 f(x2 )。
( 5)再通过 f( x2 )作 f (x )的切线,交 x 轴于
x3 。
( 6)再通过 x3 求出 f( x3 )。再通过 f( x3 )作 f (x )
的切线,交 x 轴于 x4 。 … 一直求下去,直到接
近真正的根。当两次求出的根之差 | xn+1-xn |≤ε
就认为 xn+1足够接近于真实的根。
故
2010-5-18 60
牛顿迭代公式是,
)('
)(
1
n
n
nn xf
xfxx ??
?
f(x)
x1x2x3x4
f(x1)
f(x2)
f(x3)
f(x4)
y
x
图 4-21牛顿迭代法几何原理图
2010-5-18 61
工程设计步骤如下:
( 1) 新建, 标准 EXE”工程, 在出现的界面上
添加两个标签, 一个文本框, 一个图片框和两
个命令按钮 。 如图 4-22左图所示 。
( 2)设置窗体及控件的属性如图 4-22左图所示。
4-22牛顿迭代法求方程根工程界面设计及运行结果
2010-5-18 62
( 3) 编写代码如下
编写单击 Command1命令按钮, 求根, 所执
行的代码
Private Sub Command1_Click()
Dim f As Double,f1 As Double
Const eps = 0.0001
Dim x0 As Double,x1 As Double
x1 = Val(Text1.Text)
2010-5-18 63
Do
x0 = x1
f = Exp(-x0) - x0
f1 = -Exp(-x0) - 1
x1 = x0 - f / f1
Loop While (x1 - x0) > eps
Picture1.Cls
Picture1.Print x1
End Sub 根从图片框上输出
牛顿迭代法
求根
2010-5-18 64
编写单击 Command2命令按钮, 退出, 所执
行的代码
Private Sub Command2_Click()
End
End Sub
编写单击窗体所执行的代码
Private Sub Form_Click()
Text1.Text = " "
Picture1.Cls
End Sub
2010-5-18 65
编写文本框变化时所执行的代码
Private Sub Text1_Change()
Const Tile = "牛顿迭代法求方程根程序 "
If Text1.Text <> " " And_
Not IsNumeric(Text1.Text) Then
MsgBox "输入的不是数字 ! ",vbOKOnly,Tile
Text1.Text = " "
Text1.SetFocus
End If
End Sub
2010-5-18 66
( 4) 运行工程 。 按 F5键运行工程 。 当
出现运行画面时在文本框中输入方程
的初始根, 然后单击, 计算, 命令按
钮, 就可在下面的图片框中输出方程
的根如下页图 4-23所示 。
注意:在程序中,对于文本框中输入
的不是数字的其他情况给出了必要的
提示。
2010-5-18 67
图 4-23 牛顿迭代法求方程根程序运行结果
2010-5-18 68
4.4.3 For… Next 循环和
Do …Loop 循环的关系
前面已经提出,对于已知循环次数的
循环使用 For… Next 循环结构来设计比较
方便,而对于循环次未知的情况最好使用
Do …Loop 循环,其实在很多情况下,同
一个问题可以使用两种循环结构的任意一
种形式来设计。例如例 4-7判断 1个数是否
为素数的程序中,编写单击命令按钮“判
断”所执行的代码原来是 For… Next 循环
结构来设计的,也可用 Do …Loop 循环结
构来设计。
2010-5-18 69
改写如下:
Private Sub Command1_Click()
Dim i,j,n As Long
n = Val(Text1.Text)
j = Clng(Sqr(n))
i=2
Do while(i<=j and n mod i <>0)
i=i+1
loop
2010-5-18 70
Debug.Print i
If i > j Then
Label2.Caption = Text1.Text & "为素数 "
Else
Label2.Caption = Text1.Text & "为非素数
"
End If
End Sub
程序运行结果完全正确 。
同样使用 Do …Loop 循环结构设计的程序也
可以改为 For… Next 循环结构来设计。
2010-5-18 71
但从上面的例题中可以看出对于需满足
多个条件才能循环的程序使用 Do … Loop循
环结构更方便一些 。 而对于只需满足一个条
件, 且循环次数已知的循环, 最好使用
For… Next循环结构来设计 。 因为在 For…
Next循环结构中, 循环控制变量可以自动增
值, 不需在程序中再考虑 。 而在 Do … Loop
循环结构中, 既要考虑满足什么条件才能进
入循环, 同时还要考虑如何退出循环, 也就
是说循环体中要有能使条件不满足退出循环
的语句 。 这些因素都是在设计循环结构时应
考虑的问题 。