第 6章 循环结构程序设计
人民邮电出版社
21世纪高等学校计算机基础课系列教材循环结构程序设计
For循环结构
For循环用于控制循环次数预知的循环结构。它的语法如下:
For 循环变量 =初值 To 终值 [Step 步长 ]
语句块 1
[Exit For]
[语句块 2]
Next [循环变量 ]
其中:循环变量必须是一个数值型的变量,一般多用整型。
循环结构程序设计
T
F
T
F循环变量小于终值语句块 1
开始 (start)
……
……
结束 (end)
循环变量的初值
Exit For
语句块 2
改变循环变量的值(循环变量加步长)
利用 For循环结构显示 1000以内的所有能被 37整除的自然数 。
设计步骤如下:
(1) 窗体界面的设计与属性设置。
(2) 编写代码 。
编写命令按钮的 Click事件代码:
Private Sub Command1_Click()
a = ""
For n = 1 To 1000
If n Mod 37 = 0 Then
a = a & Str(n) & vbCrLf
End If
Next
Text1.Text = a
End Sub 能被 37整除的自然数
Do … Loop结构当不知道循环的次数的时候,或者在循环次数不确定的情况下,就不能再用 For循环结构来实现程序的设计了,Visual
Basic中提供了一个这样的结构,这就是 Do … Loop 结构。
这种结构有两种不同的形式,下面分别讲解。
Do While … Loop结构这种形式是首先判断条件是否满足,然后根据条件来决定是否执行后面的语句(循环体)。这种结构的语法形式为:
循环结构程序设计的概念
Do… Loop语句前测型 Do…Loop 循环其语法为
Do [{ While | Until }〈 条件 〉 ]
[〈 语句列 1〉 ]
[Exit Do]
[〈 语句列 2〉 ]
Loop
F
T
F条件表达式?
语句块开始 (start)
……
……
结束 (end)
条件表达式的初值
Exit Do?
语句块 2
改变条件表达式求累加和 1 + 2 + 3 +…+ 100 (如)。
求累加和设计步骤如下:
窗体界面的设计参见前面章节,
这里仅给出命令按钮的 Click事件代码:
Private Sub Command1_Click()
Dim s As Integer,n As Integer
s = 0,n = 1
Do While n <= 100
s = s + n
n = n + 1
Loop
Label2.Caption = "1+2+3+… +100 =
" & s
End Sub
还可以改为直到型:
Private Sub Command1_Click()
Dim s As Integer,n As Integer
s = 0,n = 1
Do Until n > 100
s = s + n
n = n + 1
Loop
Label2.Caption = "1+2+3+… +100
= " & s
End Sub
后测型 Do… Loop循环其语法为
Do
[〈 语句列 1〉 ]
[Exit Do]
[〈 语句列 2〉 ]
Loop [{While | Until} 〈 条件 〉 ]
输入有效数字的位数,利用下述公式计算圆周率 π的近似值:



222
2
22
2
2
2
2?
F
T
F
条件表达式?
语句块 1
开始 (start)
……
……
结束 (end)
条件表达式的初值
Exit Do?
语句块 2
改变条件表达式
T
设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写程序代码 。
根据流程图,可以写出命令按钮 Command1的 Click事件代码为
Private Sub Command1_Click()
Dim m As Integer
m = Val(Text1.Text)
p = 0#,s = 2#,e = 0.1 ^ m
Do
t = s,p = Sqr(2 + p),s = s * 2 / p
Loop Until Abs(t – s) < 0.1 ^ m
f = String(m – 1,"#")
Text2.Text = Format(s,"0." & f)
Text1.SetFocus
End Sub
计算圆周率 π
文本框 Text1的 GotFocus事件代码:
Private Sub Text1_GotFocus()
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub
循环的嵌套在循环结构中的循环体是一个循环结构时,就称这种结构是一个循环的嵌套结构,
循环的嵌套结构一共有下列几种:
Do … Loop 循环结构中嵌套 Do … Loop 循环结构,Do … Loop 循环结构中嵌套 For循环结构,For循环结构中嵌套 Do … Loop 循环结构,For循环结构中嵌套 For循环结构。对于 Do … Loop 循环结构来说又有四种结构,也就是说嵌套结构中可以进行多次嵌套,并且各种不同的嵌套结构都可以出现在循环体中。至于各种循环嵌套结构的程序流程图,
这里不再给出,实际上就是几种循环结构的单个流程图的组合,将原来的流程图中的循环体语句块改成一个或几个循环结构就可以了。
利用两个 For循环的嵌套结构来实现该程序。下面是该程序的代码和运算界面:
Private Sub Form_Click()
Cls
Print
For i = 1 To 9
For j = 1 To i
m = i * j
Print Space(3); i; "*"; j; "=";
If m < 10 Then ‘这一段是为了使程序能够打印出整齐的表来
Print " "; m;
Else
Print m;
End If
Next j
Print
Next i
End Sub
几个辅助控制语句在 Visual Basic中还提供了一些辅助控制语句,这些辅助控制语句有:
GoTo 语句:
GoTo语句是一个无条件转移语句,使程序无条件地转移到指定的位置,其语法结构如下:
GoTo { 行号 |标号 }
注意:
GoTo 语句只能在同一事件过程或同一个函数,过程(函数和过程的概念在第十章中介绍)中进行转移,而不能在不同的事件过程或函数中转移,
而且只能转移到行号或者标号处,标号是一个字符序列,首字符必须为字母,大小写无关,任何一个转移到的标号后面必须要有冒号(:),
行号则是一个数字序列,在过去的 Basic中常用行号,在 Visual Basic中,
很少使用行号了。
以前的 Basic中,GoTo语句使用的频率很高,编制出来的程序称为是 BS程序
( Bowl of Spaghetti Programming),由于这种程序结构不很清晰,所以可读性很差。在现在的结构化程序设计中,尽量不用这种结构,尽可能地用循环结构或者选择结构来代替。这样可以增强程序的可读性。
图 5-16 求素数求 100以内的素数。
下面是计算按钮的代码:
Private Sub Command1_Click()
Dim i As Integer
Static m As Integer
For m = 2 To 100
For i = 2 To m –1 ‘从 2开始进行整除运算
If m Mod i = 0 Then GoTo notNextm
Next i
Text1.Text = Text1.Text & " " & m ‘显示在文本框中
notNextm:
Next m
End Sub
退出按钮的代码中使用下面马上就要讲到的 end语句。
Private Sub Command2_Click()
End
End Sub
End 语句:
End语句格式很简单,只有一个单词:
End
该语句是用来结束一个程序的运行的,他可以放在任何事件过程中,在前面的例子中很多的“退出”按钮都是采用这个语句来结束程序的运行的,读者可以从前面的例子中看出该语句的作用,这里就不再举更多的例子了。
With 语句:
With语句可以对某个对象执行一系列的语句,而不需要重复指出对象的名称。 With语句的语法格式如下:
With 对象名称对该对象进行操作的语句块
End With
通过在时钟控件中对图片进行变换操作。
Dim i As Integer ‘定义一个变量,改变两表示图片的名称
Exit按钮的代码:
Private Sub Command1_Click()
Unload Me ‘Exit按钮的代码,结束本程序的运行
End Sub
‘图片的单击事件代码:
Private Sub Picture1_Click()
Timer1.Interval = 0 ‘单击图片时停止变换
End Sub
时钟控件中时间改变时的代码:
Private Sub Timer1_Timer()
i = (i + 1) Mod 62 ‘对图片名称求模取余,
With Picture1 ‘进入 with语句块
.Align = 1,,AuToSize = True,,FontName = "隶书 "
.Picture = LoadPicture("c:\winDows\deskTop\pictures\" & i & ".jpg")
.Enabled = Not,Enabled
End With ‘with语句块结束
End Sub
窗体在装入的时候的代码:
Private Sub Form_Load()
i = 0 ‘初始化变量
End Sub
说明:本例中必须在 win98桌面上有一个包含有文件名为 1,2…
的弱干个 jpg图片,
请考生更改以下本例中的文件存放路径。
For each,..in..,Next循环针对一个数组或集合中的每个元素,重复执行一组语句。这种结构的语法是:
For Each 元素 In 数组名或集合名
[语句 ]
[Exit For]
[语句 ]
Next [元素 ]
While...Wend循环这也是一种循环控制语句,在这种结构中,只要指定的条件为
True,则会重复执行一系列的语句。这种结构的语法是:
While 条件
[语句组 ]
Wend
如果条件为 True,则语句组中所有的语句都会被执行,一直执行到 Wend 语句。然后再回到 While 语句,并再一次检查条件是否为 true,如果条件还是为 True,则重复执行。如果不为
True,则程序会从 Wend 语句之后的语句继续执行。
While...Wend 循环结构也可以是多层的嵌套结构。每个 Wend 匹配最近的 While 语句。
使用 While...Wend 语句来增加计数变量的值。如果条件 Counter <
20判断值为 True,则循环内的语句将一直执行下去。
Form_click()
Dim Counter
Counter = 0 ' 设置变量初值。
While Counter < 20 ' 测试计数器的值。
Counter = Counter + 1 ' 将计数器的值加一,这句一定要有,否则死循环。
Wend ' 当 Counter > 19 时则循环终止。
Form1,Print Counter ' 在在窗体上输出数字 20。
End sub
2,使用列表框显示数据
中的文本框改为列表框(如图所示)。
将窗体中的文本框换为列表框,无需修改列表框的属性,
只修改命令按钮的 Click事件代码:
Private Sub Command1_Click()
List1.Clear
For n = 1001 To 1100 Step 2
s = 0
For i = 2 To Int(Sqr(n))
If n Mod i = 0 Then
s = 1,Exit For
End If
Next
If s = 0 Then List1.AddItem n
' 使用列表框的 Add方法增加列表项
Next
End Sub
选择和移动数据利用循环结构和列表框控件,设计的,选项移动,窗体 。
所谓,选项移动,窗体是指由两个列表框和 4个命令按钮所构成的界面,在 Windows程序中常见到此类窗口 ( 如图 5-21所示 ) 。
“选项移动”表单设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写事件代码 。
编写窗体的读入 ( Load)
事件代码:
Private Sub Form_Load()
List1.AddItem "电冰箱 "
List1.AddItem "洗衣机 "
List1.AddItem "彩色电视机 "
List1.AddItem "组合音响 "
List1.AddItem "影碟机 "
List1.AddItem "电水壶 "
List1.AddItem "饮水机 "
List1.AddItem "微波炉 "
List1.AddItem "照相机 "
End Sub
编写命令按钮的 Click事件代码:
Private Sub Command1_Click()
i = 0
Do While i < List1.ListCount
If List1.Selected(i) = True Then
List2.AddItem List1.List(i)
List1.RemoveItem i
Else
i = i + 1
End If
Loop
End Sub
Private Sub Command2_Click()
For i = 0 To List1.ListCount - 1
List2.AddItem List1.List(i)
Next
List1.Clear
End Sub
Private Sub Command3_Click()
i = 0
Do While i < List2.ListCount
If List2.Selected(i) = True Then
List1.AddItem List2.List(i)
List2.RemoveItem i
Else
i = i + 1
End If
Loop
End Sub
Private Sub Command4_Click()
For i = 0 To List2.ListCount - 1
List1.AddItem List2.List(i)
Next
List2.Clear
End Sub
组合框
1,下拉列表框将算术练习中的列表框改为组合框 ( 下拉列表框 ),如图所示 。
使用下拉列表框设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写程序代码修改文本框 Text1的按健 ( KeyPress) 事件代码:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Fm = "!@@@@@@@@@@@@@@"
If Text1.Text = Text1.Tag Then
Item = Format(Label1.Caption & Text1.Text,Fm) & " √"
Combo1.Tag = Combo1.Tag + 1
Else
Item = Format(Label1.Caption & Text1.Text,Fm) & " × "
End If
Combo1.AddItem Item,0
Combo1.ListIndex = 0
Label3.Caption = "共 " & Form1.Tag & "题,正确率为,"
Label2.Caption = Format(Combo1.Tag / Form1.Tag,"#0.0#%")
Form_Activate
End If
End Sub
编写命令按钮 Command2的 Click事件代码:
Private Sub Command2_Click()
Form1.Tag = 0#
Combo1.Tag = 0#
Combo1.Clear
Label3.Caption = "欢迎重新开始 !"
Label2.Caption = ""
Form_Activate
Text1.SetFocus
End Sub
使用下拉组合框设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写事件代码 。
编写组合框 Combo1的按健 ( KeyPress) 事件代码:
Private Sub Combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then '
按回车键后,接收输入的选项
Combo1.AddItem Combo1.Text,0
Combo1.SelStart = 0
Combo1.SelLength = Len(Combo1.Text)
Text1.Text = Combo1.ListCount
End If
If KeyAscii = 27 Then '
按 〈 Esc〉 键后,移去选项
If Combo1.ListIndex <> -1 Then
Combo1.RemoveItem Combo1.ListIndex
Text1.Text = Combo1.ListCount
End If
End If
End Sub
编写命令按钮 Command1的 Click事件代码,使之可以随机地抽取奖号:
Private Sub Command1_Click()
Randomize
n = Combo1.ListCount
a = Int(Rnd * n)
Combo1.ListIndex = a
Label1.Caption = "中奖的号码是," & Combo1.Text
End Sub
算法举例
,水仙花数,是指一个 3位数,其各位数的立方和等于该数,如:
153 = 13 + 53 + 33
水仙花数窗体界面的设计参见前面例子,这里给出命令按钮的 Click事件代码:
Private Sub Command1_Click()
Dim p As Integer
List1.Clear
For n = 100 To 999
a = Int(n / 100)
b = Int((n – a * 100) / 10)
c = n - (a * 100 + b * 10)
p = a ^ 3 + b ^ 3 + c ^ 3
If p = n Then List1.AddItem p
Next
End Sub