采用循环程序可以解决一些按一定规则重复执行的问题。
例如,统计一个班几十名学生,甚至全校几千名学生的学期
成绩,如求平均分、不及格人数等
本章主要内容
For...Next / Do...Loop / While...Wend
循环出口语句 (Exit)
程序举例
第 5章 循环结构设计
循环 是指在指定的条件下多次重复执行一组语
句。被重复执行的一组语句称为 循环体
VB提供的循环语句有
Do...Loop
For...Next
While...Wend
For Each...Next
最常用的是 For...Next和 Do...Loop语句
5.1.1 For...Next循环语句
按指定次数执行循环体
例 5.1 在窗体上显示 2至 10
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Dim k As Integer
Show
For k = 2 To 10 Step 2
Print k * k
Next k
End Sub
5.1 循环语句
程序运行结果:
4
16
36
64
100
说明,上述程序,循环变量 k的初值、终值和步长值分别
为 2,10和 2,即从 2开始,每次加 2,到 10为止,控制循环 5次。
每次循环都将循环体 (Print k*k)执行一次
格式,For 循环变量=初值 To 终值 [Step 步长值 ]
Next 循环变量
功能,本语句指定循环变量取一系列数值,并且
对循环变量的每一个值把循环体执行一次
初值、终值和步长值都是数值表达式,步长值可以是正数
(称为递增循环 ),也可以是负数 (称为递减循环 )
若步长值为 1,则 Step 1可以省略
(1)求出初值、终值和步长值,并保存起来
(2)将初值赋给循环变量
(3)判断循环变量值是否超过终值 (步长值为正时,指大于
终值;步长值为负时,指小于终值 )。超过终值时,退出循环,
执行 Next
(4)执行循环体
(5)遇到 Next语句时,修改循环变量值,即把循环变量的
当前值加上步长值再赋给循环变量
(6)转到 (3)去判断循环条件
例 5.1的执行过程
For...Next语句的执行步骤
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Show
s = 0
For k = 1 To 8
s = s + k
Next k
Print "s="; s
End Sub
s= 36
语句 s= s+k(循环体语句 )的执行过程
例 5.2 求 S = 1 + 2 + 3 + … + 8
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Show
t = 1
For c = 1 To 8
t = t * c
Next c
Print "T="; t
End Sub
T= 40320
语句 t=t*c也称乘法器。先将 t置 1(不能置 0)
在循环程序中,常用累加器和累乘器来完成各种计算任务
例 5.3 求 T = 8! = 1× 2× 3× … × 8
采用 Print直接在窗体上输出结果,程序代码如下:
Private Sub Form_Load()
Show
Dim pi As Single,c As Integer,s As Integer
pi = 0
s = 1 's表示加或减运算
For c = 1 To 10000 Step 2
pi = pi + s / c
s = -s '交替改变加、减号
Next c
Print "π="; pi * 4
End Sub
程序运行结果是:
π= 3.141397
例 5.4 用 π/4= 1 - 1/3 + 1/5 - 1/7 + …… 级数
求 π的近似值 (取前 5000项来进行计算 )
下面采用,穷举法,来解此题。
其做法是:从所有可能解中,逐个进行试验,若
满足条件,就得到一个解,否则不是。直到条件满
足或判别出无解为止。
令母鸡为 x只,小鸡为 y只,根据题意可知
y = 100 – x
开始先让 x初值为 1,以后逐次加 1,求 x为何值时,
条件 3x+y/3=100成立。如果当 x达到 30时还不能使条
件成立,则可以断定此题无解
例 5.5 用 100 元买 100 只鸡,母鸡 3元 1只,
小鸡 1元 3只,问各应买多少只?
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Dim x As Integer,y As Integer
Show
For x = 1 To 30
y = 100 - x
If 3 * x + y / 3 = 100 Then
Print "母鸡只数为,"; x,
Print "小鸡只数为,"; y
End If
Next x
End Sub
运行结果:
母鸡只数为,25 小鸡只数为,75
For...Next循环主要是用在知道循环次数的情况下,
若事先不知道循环次数,可以使用当型循环 Do...Loop
Do...Loop两种格式,前测型循环结构 和 后测型循
环结构 。两者区别在于判断条件的先后次序不同
5.1.2 Do...Loop循环语句
格式:
Do [{While|Until} 条件 ]
循环体
Loop
Do While...Loop语句的功能,当条件成立 (为真 )
时,执行循环体;当条件不成立 (为假时 ),终止循环
Do Until...Loop(直到型循环 )语句的功能:
当条件不成立 (为假 )时,执行循环体,直到条件
成立 (为真 )时,终止循环
1,前测型 Do...Loop循环
采用 Do While...Loop语句
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Dim n As Integer,s As Long
Show
n = 1,s = 0
Do While n <= 100
s = s + n * n
n = n + 1
Loop
Print "s="; s
End Sub
程序运行结果:
S= 338350
例 5.6 求 S= 12 + 22 + … + 1002
采用 Print直接在窗体上输出结果,程序代码:
Private Sub Form_Load()
Show
Dim pi As Single,n As Long,s As Integer
pi = 0, n = 1, s = 1
Do While n <= 100000 '或 1/n>=0.00001
pi = pi + s / n
s = -s
n = n + 2
Loop
Print "π="; pi * 4
End Sub
程序运行结果:
π= 3.141575
例 5.7 用 π /4= 1 - 1/3 + 1/5 - 1/7 + …… 级数,求 π
的近似值。当最后一项的绝对值小于 10-5时,停止计算
Do
Loop [{While|Until}条件 ]
功能,先执行循环体,然后判断条件,根据条件决定是
否继续执行循环
注意,本语句执行循环的最少次数为 1,而前测型
Do...Loop语句的最少次数为 0(即一次都不执行循环 )
2,后测型 Do...Loop
For…Next 前测型
S=0 s=0:k=1
For k=1 to 8 Do While k<=8
s=s+k s=s+k
Next k k=k+1
Print s Loop
Print s
s=0, k=1
do
s=s+k
k=k+1
Loop While k<=8
Print s
三种循环语句比较 示例:求和 s = 1 + 2 + 3 + … + 8



“辗转相除法”算法,求出 m/n余数 p,若 p= 0,n即为
最大公约数;若 p非 0,则把原来的分母 n作为新的分子 m,把
余数 p作为新的分母 n
(1)创建应用程序的用户界面和设置对象属性
例 5.8
编写的“计算”按钮 Click事件过程代码如下:
Private Sub Command1_Click()
Dim m As Integer,n As Integer,p As Integer
m = Val(Text1.Text), n = Val(Text2.Text)
If m <= 0 Or n <= 0 Then
MsgBox ("数据错误 !")
End
End If
Do
p = m Mod n
m = n
n = p
Loop While p <> 0
Text3.Text = m
End Sub
若输入的 m和 n的值为 85和 68,则运行结果如上图
语句格式
While
循环体
Wend
功能:当条件成立 (为真 )时,执行循环体;当条
件不成立 (为假 )时,终止循环。
本语句与上述 Do While...Loop循环语句相似
5.1.3 While...Wend循环语句
用于提前退出循环
格式,Exit {For|Do}
功能:直接从 For循环或 Do循环中退出
当程序运行时遇到 Exit语句时,就不再执行循环
体中的任何语句而直接退出,转到循环语句 (Next、
Loop)的下面继续执行
5.1.4
例 5.8的循环语句可改为
Do
p = m Mod n
If p=0 Then
Exit Do
End If
m = n
n = p
Loop While p <> 0
Text3.Text = n
把每次输入的数累加。当输入 -1时结束程序的运行
(1)创建应用程序的用户界面和设置对象属性
(2)编写程序代码
Private Sub Form_Load()
Show
Sum = 0
Do While True '条件为真,循环无终止进行下去
x = Val(InputBox("请输入要加入的数 (-1表示结束 )","输入数据 "))
If x = -1 Then
Exit Do
End If
Sum = Sum + x
Text1.Text = Sum
Loop
MsgBox ("累加运算结束 ")
End Sub
以 -1作为“终止循环标志”
例 5.9 设计一个, 加法器, 程序
多重循环是指循环体内含有循环语句的循环
例 5.10 多重循环程序示例 程序运行结果
Private Sub Form_Load() 1 5
Show 1 6
For i = 1 To 3 ?外循环 1 7
For j = 5 To 7 ?内循环 2 5
Print i,j 2 6
Next j 2 7
Next i 3 5
End Sub 3 6
3 7
注意内、外循环层次要分清,不能交叉
5.2 多 重 循 环
本例可采用 两重循环 来实现。外循环控制输出 7行,内
循环控制每行输出要求的字符数。
在进入内循环之前,使用 Print Tab()来对起始输出位置
定位,退出内循环后,使用 Print来控制换行。
例 5.11 编一程序,输出下列所示的图形
采用 Print直接在窗体上输出结果,程序代码如下:
Private Sub Form_Load()
Show
For i = 1 To 7
Print Tab(10 - i);
For j = 1 To 2 * i - 1
Print Chr(i + 48);
Next j
Print
Next i
End Sub
Print Chr(i+48)与 Print i有所不同
(1)分析,设一元硬币为 a枚,二元硬币为 b枚,五元硬币
为 c
a+b+c=10
a+2b+5c=25
采用两重循环,外循环变量 a从 0~ 10,内循环变量 b从 0~ 10
(2)创建应用程序的用户界面
例 5.12 取一元、二元、五元的硬币共十枚,付
给 25元钱,有多少种不同的取法?
(3)编写程序代码
程序通过 Print方法把处理结果输出在标签的下方
Private Sub Form_Load()
Show
CurrentX = 0, CurrentY = 1500 '确定开始显示的坐标
Print,"五元 ","二元 ","一元 "
n = 0 '记录解的组数
For a = 0 To 10
For b = 0 To 10
c = 10 - b - a
If a + 2 * b + 5 * c = 25 And c >= 0 Then
n = n + 1
Print "("; n; ")",c,b,a
End If
Next b,a
End Sub
列表框和组合框都能为用户提供若干个选
项,供用户从中任意选择
两种控件的特点是为用户提供大量的选项
但又占用很少的屏幕空间,操作简单方便
5.3
1,列表框的用途
列表框 (ListBox)用于列出可供用户选择的项目列表,用户
可从中选择一个或多个选项。
自动出现滚动条
表项
索引
2,常用属性
(1)Name属性
(2)List属性:该属性是一个字
符型数组,用于存放列表框的表项
数组的下标从 0开始
图 5.5中,List1.List(0)的值为
“教授”,List1.List(1)的值为“副教授”
5.3.1 列表框
(3)ItemData属性,为每个表项设置一个对应的数值
(4)ListCount属性,返回列表框中表项的数目
(5)ListIndex属性,返回已选定表项的顺序号 (索引 )。若未
选定任何项,则 ListIndex的值为 -1
(6)Text属性,存放当前选定表项的文本内容
(7)Selected属性,逻辑值,表示列表框中某一表项是否被
选中
(8)Sorted属性,设置列表框中各表项在运行时是否按字母
顺序排列
(9)MultiSelect属性,设置是否允许同时选择多个表项
假设列表框 List1中有四个表项,并已选定第 2项,则 有:
List1.List(0)的值为”教授”
个数 List1.ListCount 为 4
List1.ListIndex 为 1
List1.Text的值为”副教授”
List1.Selected(1)为 True
List1.Selected(0)为 False
采用以下方法,可为列表框 List1赋值:
( 1)在属性窗口中设置
( 2)利用 AddItem赋值 (3) 利用 List属性赋值
List1.AddItem,教授” List1.List(0)=,教授”
List1.AddItem,副教授” List1.List(1)=,副教授”
List1.AddItem,讲师” List1.List(2)=,讲师”
List1.AddItem,助教” List1.List(3)=,助教”
3,事件
可接收 Click,DblClick等事件
4,方法
(1) AddItem方法,用于把一个列表项加入列表框
格式,[对象,]AddItem 列表项 [,索引 ]
举例,List1.AddItem "海南省 ", 28
(2) Clear和 RemoveItem方法,用于删除列表项
5,列表框表项的输出
(1)用鼠标单击列表框内某一表项,则该表项值存放在 Text
x = List1.Text ′把表项值存放在 x变量中
(2)
List1.ListIndex = 3
x = List1.Text
(1)分析:判别条件为 (n Mod 3=0) And (n Mod 8=0)
(2)创建应用程序的用户界面和设置对象属性
例 5.13 设计一个程序,找出 100~ 800范围内所有
能同时被 3和 8
(3)编写程序代码
编写的“显示”按钮 Click事件过程代码:
Private Sub Command1_Click()
List1.Clear
For n = 100 To 800
If (n Mod 3 = 0) And (n Mod 8 = 0) Then
List1.AddItem n
End If
Next n
End Sub
(1)创建应用程序的用户界面和设置对象属性
用户先在左列表框 (List1)选择一个或多个选修课,当单击
“显示”按钮时,在右列表框 (List2)中将显示出用户选中的所
有课程。单击“清除”按钮时,将清除右列表框中的内容
(2)编写程序代码
例 5.14 设计一个选课程序
Private Sub Form_Load()
List1.AddItem "电子商务 "
List1.AddItem "网页制作 "
List1.AddItem "Internet简明教程 "
List1.AddItem "计算机网络基础 "
List1.AddItem "多媒体技术“
End Sub
Private Sub Command1_Click() '"显示 "按钮单击事件
List2.Clear '清除列表框的内容
For i = 0 To List1.ListCount - 1 '逐项判断
If List1.Selected(i) Then '真时为选定
List2.AddItem List1.List(i)
End If
Next i
End Sub
Private Sub Command2_Click() '"清除 "按钮单击事件
List2.Clear
End Sub
允许从已有的选项中进行选择,还允许输入列
表中不包括的内容
列表框和文本框的组合
具有列表框和文本框的大部分属性和方法。独
有的一些属性:
(1)Style属性,该属性取值为 0,1或 2,分别决
定了组合框的三种不同类型
下拉组合框 (Dropdown Combo)
简单组合框 (Simple Combo)
下拉列表框 (Dropdown List)
5.3.2 组合框
(2)Text属性,该属性是用户所选定项目的文本或
直接从文本框输入的文本
(1)创建应用程序的用户界面
(2)设置对象属性
组合框的 Style属性为 0,TabIndex(键序 )为 0
两个标签;四个命令按钮; 一个文本框 Text1,用来显示当
前的选修课总课程数
例 5.15 编制程序,把一批课程名放入组合框中,再对组
合框进行项目显示、添加、删除、全部删除等操作
(3)编写程序代码
Private Sub Form_Load()
Combo1.AddItem "电子商务 "
Combo1.AddItem "网页制作 "
Combo1.AddItem "Internet简明教程 "
Combo1.AddItem "计算机网络基础 "
Combo1.AddItem "多媒体技术 "
Combo1.Text = "" '置空值
Text1.Text = Combo1.ListCount '表项个数
End Sub
Private Sub Command1_Click() '”添加”
If Len(Combo1.Text) > 0 Then
Combo1.AddItem Combo1.Text
Text1.Text = Combo1.ListCount
End If
Combo1.Text = ""
Combo1.SetFocus
End Sub
Private Sub Command2_Click() ?“删除”
Dim ind As Integer
ind = Combo1.ListIndex
If ind <> -1 Then '-1表示无表项
Combo1.RemoveItem ind '删除已选定的表项
Text1.Text = Combo1.ListCount
End If
End Sub
Private Sub Command3_Click() ?“全清”
Combo1.Clear
Text1.Text = Combo1.ListCount
End Sub
Private Sub Command4_Click()
End
End Sub
两重循环; 采用 Print直接在窗体上输出结果
Private Sub Form_Load()
Show
FontSize = 15 '设置字号
Print Tab(12);,九九乘法表,'输出标题
FontSize = 12
Print '输出空行
For k = 0 To 9
Print Tab(k * 4); k; '输出第一行数字
Next k
Print '换行
For j = 1 To 9 '外循环
Print j;
For k = 1 To j '内循环
Print Tab(k * 4); j * k; '输出乘积
Next k
Print '换行
Next j
End Sub
5.4 程序举例 例 5.16 打印, 九九乘法表,
打印“九九乘法表”
(1)分析,模仿十进制整数转换成二进制数的方法 (即“除 2
取余” ),采用逐次,除 n取余,法 (n为 2,8或 16),即用 n不
断去除要转换的十进制数,直至商为 0为止,将每次所得的
余数逆序排列 (以最后余数为最前位 ),即得到所转换的 n进制
数。
(2)创建应用程序的用户界面和设置对象属性
例 5.17 输入一个十进制整数,将其转换成二进制
数、八进制数或十六进制数
列表框的名称为 List1,其 List属性设置了三个表项:
二进制、八进制和十六进制,ItemData属性设置了相应的
值,2,8和 16
(3)编写程序代码
功能要求:用户在文本框 Text1中输入要转换的十进制
数,选择转换进制,单击“转换”按钮 (Command1)后,则
在文本框 Text2
“换码表” (Ch变量 )的作用
Private Sub Command1_Click() '“转换”按钮单击事件过

Dim y As String,x As Long,s As Integer
Dim Ch As String,n As Integer
Ch = "0123456789ABCDEF" '换码表
If List1.ListIndex = -1 Then
n = 2 '未选,则以二进制转换
Else
n = List1.ItemData(List1.ListIndex)
End If
y = " ", x = Val(Text1.Text)
If x = 0 Then
Text2.Text = ""
Exit Sub
End If
Do While x > 0
s = x Mod n '取余数
x = Int(x / n) '求商
y = Mid(Ch,s + 1,1) + y '换码,反序加入
Loop
Text2.Text = y
End Sub
Private Sub Command2_Click() '“结束”
Unload Me
End Sub
示例,(142)10 = (8E)16
例如,10= 2*5
24=2*2*2*3
76=2*2*19
解题的步骤;程序代码:
Private Sub Form_Load()
Show
s = InputBox("请输入一个正整数 ")
x = Val(s), Print
Print x; "=";
For i = 2 To x
Do While (x Mod i = 0) '求相同因子
x = x / i
Print i;
If x <> 1 Then Print "*";
Loop
Next i
End Sub
例 5.18 把一个正整数写成若干个素数相乘的形式
示例,20= 2*2*5
统计试验法是一种进行大量的随机性试验,并根据试验
结果统计而得到结论的方法
(1)分析,在下图中,边长为 1个单位的正方形内包含了半
径为 1个单位的 1个圆,假设在正方形内有大量的密集的随机
点,那么可以认为:
(1/4圆面积 )/正方形面积 ≈
(1/4)π≈对应区域随机点数之比
由此得到,π≈4× 对应区域随机点数之比
程序中,使用随机函数来产生随机点数的位置 (x,y)
x=Rnd
y=Rnd
x,y值都小于 1,可以认为所产生的全部随机点都落在正
方形内。如果采用 s和 n来分别记录落在正方形内和 1/4圆内的
随机点数。 s为用户指定的随机点数,对于每次产生的随机点
(x,y),若 x2+y2≤1,说明此点落在 1/4圆内,则 n加 1。最后计
算 4*n/s就是所求的 π近似值。
附录 利用统计试验法计算 π值 (例 5.19)
(2)创建应用程序的用户界面和设置对象属性
假设随机点数为 10000
(3)编写程序代码
利用 Circle方法和 Line方法画出 1/4圆弧和正方形的两个边,用
Pset方法画出随机点
Private Sub Command1_Click()
Dim x As Double,y As Double
Randomize
n = 0, s = Val(Text1.Text)
For i = 1 To s
x = Rnd
y = Rnd
PSet (2500 * x,2500 * y),RGB(0,255,0)
If x * x + y * y <= 1 Then
n = n + 1
End If
Next i
Text2.Text = 4 * n / s
End Sub
Private Sub Form_Load()
Show
'画线和圆弧
Line (0,2500)-(2500,2500),RGB(255,0,0)
Line (2500,0)-(2500,2500),RGB(255,0,0)
Circle (0,0),2500,RGB(0,0,255)
Text1.SetFocus '设置焦点
End Sub
Private Sub command2_click()
Text1.Text = ""
Text2.Text = ""
Cls
Call Form_Load '调用过程 form_load
Text1.SetFocus
End Sub