计算机具有速度快、精度高的特点,特别适于进行重复性的工作,重复次数越多越能显示它的威力。所以,使用计算机时,
应尽量把问题归纳为简单而有规则的重复运算和操作,以充分发挥计算机的特长。
采用循环程序可以解决一些按一定规则重复执行的问题。
例如,统计一个班几十名学生,甚至全校几千名学生的学期成绩,如求平均分、不及格人数等本章主要内容
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
程序运行结果:
4
16
36
64
100
5.1 循环语句说明,上述程序,循环变量 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
其中,“索引”值不能大于表项数 (ListCount)
(2) Clear方法,用于清除列表框中的所有项目
(3) RemoveItem方法,用于删除指定的列表项格式,[对象,]AddItem 列表项 [,索引 ]
5,列表框表项的输出
(1)用鼠标单击列表框内某一表项,则该表项值存放在 Text
x = List1.Text ′把表项值存放在 x变量中
(2)
List1.ListIndex = 3
x = List1.Text
(3)直接从数组 List()
x = List1.List(5)
(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
示例,20= 2*2*5
例 5.18 把一个正整数写成若干个素数相乘的形式统计试验法是一种进行大量的随机性试验,并根据试验结果统计而得到结论的方法
(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