第三章 程序流程控制
本章内容及要求:
1.熟练掌握行 if语句、块 if结构,Select Case情况选择
结构有使用,掌握选择的嵌套结构;
2.熟练掌握实现循环结构的 For/Next循环结构及 Exit
For语句,Do/Loop循环结构的使用,掌握多重循环。
本章重点:
选择结构及循环结构的实现及其应用
本章难点:
选择的嵌套及多重循环结构
3.1 条件测试语句
1,If… Then语句 (单分支结构 )
If <表达式 > Then
语句块
End If
或 If <表达式 > Then <语句 >
例,已知两个数 x和 y,比较它们的大小,使得 x大于 y.
If x<y Then
t=x, x=y,y=t
End If
或 If x<y Then t=x,x=y,y=t
3.1 条件测试语句
2,If… Then… Else语句 (双分支结构 )
If <表达式 > Then
<语句块 1>
Else
<语句块 2>
End If
If <表达式 > Then <语句 1> Else <语句 2>
双分支选择结构执行过程
3.1 条件测试语句
例如:输出 x,y两个中值较大的一个值 。
IF X>Y Then
Print X
Else
Print Y
End If
也可以写成如下的单行形式:
IF X>Y Then Print X Else Print Y
3.1 条件测试语句
3,If… Then… ElseIf语句 (多分
支结构 )
形式,
If <表达式 1> Then
<语句块 1>
ElseIf <表达式 2>Then
<语句块 2>
…
[Else
语句块 n+1 ]
End If
3.1 条件测试语句
例 3.1:输入一学生成绩,评定其等级。方法是,90~100
分为, 优秀,, 80~89分为, 良好,, 70~79分为, 中等,,
60~69分为, 及格,, 60分以为, 不合格,
使用 IF语句实现的程序段如下:
If x>=90 then
Print "优秀 "
ElseIf x>=80 Then
Print "良好 "
ElseIf x>=70 Then
Print "中等 "
ElseIf x>=60 Then
Print "及格 "
Else
Print "不及格 "
End If
3.1 条件测试语句
4, Select Case语句(情况语句)
形式:
Select Case 变量或表达式
Case 表达式列表 1
语句块 1
Case 表达式列表 2
语句块 2
…
[Case Else
语句块 n+1]
End Select
数值型或字符串表达式
3.1 条件测试语句
说明:
<表达式列表 >:与 <变量或表达式 >同类型的下面四种形式之一:
表达式 A +5
一组枚举表达式 (用逗号分隔 ) 2,4,6,8
表达式 1 To 表达式 2 60 to 100
Is 关系运算符表达式 Is < 60
3.1 条件测试语句
例如:将例 3.1 使用 select case…,.语句来实现的程序段如
下:
Select Case x
Case 90 to 100
Print "优秀 "
Case 80 to 89
Print "良好 "
Case 70 to 79
Print "中等 "
Case 60 to 69
Print "及格 "
Case Else
Print "不及格 "
End Select
3.1 条件测试语句
5,选择结构的嵌套
下面是两种正确的嵌套形式:
( 1)
IF <条件 1> Then…,.
IF <条件 2> Then……
Else…,.
End If…,
Else…,
IF <条件 3> Then…,.
Else…,.
End If…,.
End IF
( 2)
IF <条件 1> Then
…,.
Select Case …
Case ……
IF <条件 2> Then
……
Else
…,.
End If
……
Case…,
…,.
End Select
…,
End IF
3.1 条件测试语句
注意:只要在一个分支内嵌套, 不出现交叉, 满足结
构规则, 其嵌套的形式将有很多种, 嵌套层次也可以任意
多 。 对于多层 IF嵌套结构中, 要特别注意 IF与 Else的配对
关系, 一个 Else必须与 IF配结, 配对的原则是:在写含有
多层嵌套的程序时, 建议使用缩进对齐方式, 这样容易阅
读和维护 。
【 例 3.1】 将输入文本框中的所有小写字母转换成大写字母,
并将一些特殊符号变成等价的字符串, 如 DLR表示 $,AT表示 @、
0/0表示 %, BPT表示 #,AND表示 &等 。 可以在 KeyPress事件中
修改文本框控件的缺省操作, 使它能在用户输入这些字符时进
行相应修改 。
Private Sub Text1_KeyPress (KeyAscii As Integer)
Dim spesymbols As String
Dim ch As String ?1
Spesymbols=?$#%&@?
ch= Chr(KeyAscii)
If InStr(Spesymbols,ch) Then
KeyAscii=0
Else
3.1 条件测试语句
KeyAscii = Asc(Ucase(ch))
Exit Sub
End If
Select Case ch
Case ?$?,Text1.SelText=?DLR?
Case ?#?,Text1.SelText=?BPT?
Case ?%?,Text1.SelText=?0/0?
Case ?&?,Text1.SelText=?AND?
Case ?@?,Text1.SelText=?AT?
End Select
End Sub
3.2 循环语句
3.2 循环结构
1,For循环语句 (一般用于循环次数已
知 )
形式:
For 循环变量=初值 to 终值 [Step 步
长 ]
语句块
[Exit For]
语句块
Next 循环变量
>0 初值 <终值 =1 时,可
省略
<0 初值 >终值
=0 死循环
步长
循环变量在终值
内
图 1 - 3 - 1 3 F o r 循环语句
语句块
E x it F o r
语句块
循环变量加步长
T
F
循环变量得初
值
3.2 循环语句
循环次数
)1( ?? ?步长 初值终值I n t
例, For I=2 To 13 Step 3
Print I,
Next I
Print,I=“,I
循环执行次数, 4
输出 I的值分别为,
2 5 8 11
出了循环输出为, I=14
3.2 循环语句
例 3.2 编程计算,S=1+2+3+… +100
Dim S%,I%
S=0 ' 累加前变量 S为 0
For I=1 to 100
S=S+I
Next I
Print " S=",S
当 N<=100
N=N+1
打印 S
S=0,N=1
S=S+N
【 例 3.3】 求阶乘 n!
3.2 循环语句
编写程序代码 。
Private Sub Command1_Click()
Dim n As Integer,i As Integer
Dim result As Long
result=1
n=CInt(text1.text)
If n<=0 Then
Label2.Caption="请输入正整数 ! "
Exit Sub '结束过程
End if
For i=1 To n
result=result*i
Next i
Label2.Caption=Str(n)+"!="+Str(result)
End Sub
3.2 循环语句
3.2 循环语句
3.2.2 Do… Loop循环语句
形式 1:(当型循环)
Do { While|Until }<条
件 >
语句块
[Exit Do]
语句块
Loop
条件
F
T
F
T
E x it D o
语句块
语句块
E x it D o
语句块
语句块
表达式列表 1
图 1 - 3 - 1 6 D o … L o o p W h ile
D o W h ile … L o o p 执行过程
3.2 循环语句
形式 2,(直到循环)
Do
语句块
[Exit Do]
语句块
Loop { While|Until} <条
件 >
表达式列表 1
F
T
F
T
E x it D o
语句块
语句块
E x it D o
语句块
语句块
条件
D o … L o o p W h ile 的执行过程
图 1 - 3 - 1 5 D o W h ile … L o o p
3.2 循环语句
条 件
语句块
语句块
T
F
Exit Do
条 件
语句块
语句块
T
F
Exit Do
Do Until… Loop执行过程 Do… Loop
Until执行过程
3.2 循环语句
说明:
( 1) 当使用 While<条件 >构成循环时, 当条件为, 真,,
则反复执行循环体, 当条件为, 假,, 则退出循环 。
( 2) 当使用 Until <条件 >构成循环时, 当条件为, 假,,
则反复执行循环体, 直到条件成立, 即为, 真, 时, 则退出循
环 。( 3) 在循环体内一般应有一个专门用来改变条件表达式中
变量的语句, 以使随着循环的执行, 条件趋于不成立 ( 或成
立 ), 最后达到退出循环 。
( 4)语句 Exit Do的作用是退出它所在的循环结构,它
只能用在 DO/Loop结构中,并且常常是同选择结构一起出现在
循环结构中,用来实现当满足某一条件时提前退出循环 。
【 例 3.5】 用 Do… Loop循环结构实现求和 sum=1+2+3+… +100。
编写代码如下:
解法一:采用当型循环 Do While… Loop
Private Sub Command1_Click()
Dim i As Integer,sum As Integer
i=1 '计数器初值置为 1
sum=0 '累加器初值置为 0
Do While i<=100 '当型循环
sum=sum+i
i=i+1 '每次循环变量加 1
Loop
Label2.Caption=Str(sum)
End Sub
解法二:采用直到型循环
Do… Until… Loop
Private Sub Command1_Click()
Dim i As Integer,sum As
Integer
i=1 '计数器初值置为 1
sum=0 '累加器初值置为 0
Do Until i>100
sum=sum+i
i=i+1
Loop
Label2.Caption=Str(sum)
End Sub
3.2 循环语句
3.2.3 While… Wend语句
使用格式如下:
While <条件 >
<循环块 >
Wend
说明,该语句的功能与 Do While <条件 >…,Loop实现
的循环完全相同 。
3.2 循环语句
例(补充) 求两个整数的最大公约数、最小公倍数
Dim n%,m%,nm%,r%
m=Val(InputBox("m="))
n=Val(InputBox("n="))
nm=n*m
If m<n Then t=m,m=n,n=t
r=m mod n
Do While (r <> 0)
m=n
n=r
r= m mod n
Loop
Print "最大公约数 =",n
Print "最小公倍数 =",nm/n 算法流程图
3.2 循环语句
3.2.4 循环的嵌套 ——多重循环结构
如果在一个循环内完整地包含另一个循环结构,则
称为多重循环,或循环嵌套,嵌套的层数可以根据需要而
定,嵌套一层称为二重循环,嵌套二层称为三重循环。
上面介绍的几种循环控制结构可以相互嵌套, 下面
是几种常见的二重嵌套形式:
3.2 循环语句
( 1) For I=…,
…,.
For J=…,
…,
Next J
…,.
Next I
( 2) For I=…,
…,.
Do While/Until
…,
…,
Loop
…,.
Next I
( 3) Do While…,
…,.
For J=…,
…,
Next J
…,.
Loop
( 4) Do While/Until…,
…,.
Do
While/Until …,
…,
Loop
…,.
Loop
3.2 循环语句
例如,打印九九乘法表,
For i = 1 To 9
For j = 1 To 9
se = i & "× " & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
【 例 3.7】 求 1∽ 30间的全部素数 。
分析:素数是只能被 1和它本身整除的正整数。例如,17是一个素
数,它只能被 1和 17整除。素数又成为质数。
Private Sub Command1_Click()
Dim m As Integer,k As Integer,i As Integer
Dim j As Long,flag As Long
j=0
For m=1 To 30 Step 2
k=Int(Sqr(m))
flag=0
For i=2 To k
if m Mod i=0 Then
flag=1 'flag=1表示 m不是素数
Exit for
End if
窗体上命令按钮 Command1的 Click事件代码如下:
Next i
If flag=0 Then '此时 flag=0表示 m是素数
j=j+1
If j Mod 4=0 Then ?使得每行输出 4个素数
Print,” +str(m)
Else
Print " "+Str(m);
End If
End If
Next m
End Sub
3.3 分支语句
3.3.1 Goto 语句
形式, Go To {标号 |行号 }
作用是无条件地转移到标号或行号指定的那行语句,
标号是一个字符序列,行号是一个数字序列。
例如:
Lp,……
……
……
goto lp
本章内容及要求:
1.熟练掌握行 if语句、块 if结构,Select Case情况选择
结构有使用,掌握选择的嵌套结构;
2.熟练掌握实现循环结构的 For/Next循环结构及 Exit
For语句,Do/Loop循环结构的使用,掌握多重循环。
本章重点:
选择结构及循环结构的实现及其应用
本章难点:
选择的嵌套及多重循环结构
3.1 条件测试语句
1,If… Then语句 (单分支结构 )
If <表达式 > Then
语句块
End If
或 If <表达式 > Then <语句 >
例,已知两个数 x和 y,比较它们的大小,使得 x大于 y.
If x<y Then
t=x, x=y,y=t
End If
或 If x<y Then t=x,x=y,y=t
3.1 条件测试语句
2,If… Then… Else语句 (双分支结构 )
If <表达式 > Then
<语句块 1>
Else
<语句块 2>
End If
If <表达式 > Then <语句 1> Else <语句 2>
双分支选择结构执行过程
3.1 条件测试语句
例如:输出 x,y两个中值较大的一个值 。
IF X>Y Then
Print X
Else
Print Y
End If
也可以写成如下的单行形式:
IF X>Y Then Print X Else Print Y
3.1 条件测试语句
3,If… Then… ElseIf语句 (多分
支结构 )
形式,
If <表达式 1> Then
<语句块 1>
ElseIf <表达式 2>Then
<语句块 2>
…
[Else
语句块 n+1 ]
End If
3.1 条件测试语句
例 3.1:输入一学生成绩,评定其等级。方法是,90~100
分为, 优秀,, 80~89分为, 良好,, 70~79分为, 中等,,
60~69分为, 及格,, 60分以为, 不合格,
使用 IF语句实现的程序段如下:
If x>=90 then
Print "优秀 "
ElseIf x>=80 Then
Print "良好 "
ElseIf x>=70 Then
Print "中等 "
ElseIf x>=60 Then
Print "及格 "
Else
Print "不及格 "
End If
3.1 条件测试语句
4, Select Case语句(情况语句)
形式:
Select Case 变量或表达式
Case 表达式列表 1
语句块 1
Case 表达式列表 2
语句块 2
…
[Case Else
语句块 n+1]
End Select
数值型或字符串表达式
3.1 条件测试语句
说明:
<表达式列表 >:与 <变量或表达式 >同类型的下面四种形式之一:
表达式 A +5
一组枚举表达式 (用逗号分隔 ) 2,4,6,8
表达式 1 To 表达式 2 60 to 100
Is 关系运算符表达式 Is < 60
3.1 条件测试语句
例如:将例 3.1 使用 select case…,.语句来实现的程序段如
下:
Select Case x
Case 90 to 100
Print "优秀 "
Case 80 to 89
Print "良好 "
Case 70 to 79
Print "中等 "
Case 60 to 69
Print "及格 "
Case Else
Print "不及格 "
End Select
3.1 条件测试语句
5,选择结构的嵌套
下面是两种正确的嵌套形式:
( 1)
IF <条件 1> Then…,.
IF <条件 2> Then……
Else…,.
End If…,
Else…,
IF <条件 3> Then…,.
Else…,.
End If…,.
End IF
( 2)
IF <条件 1> Then
…,.
Select Case …
Case ……
IF <条件 2> Then
……
Else
…,.
End If
……
Case…,
…,.
End Select
…,
End IF
3.1 条件测试语句
注意:只要在一个分支内嵌套, 不出现交叉, 满足结
构规则, 其嵌套的形式将有很多种, 嵌套层次也可以任意
多 。 对于多层 IF嵌套结构中, 要特别注意 IF与 Else的配对
关系, 一个 Else必须与 IF配结, 配对的原则是:在写含有
多层嵌套的程序时, 建议使用缩进对齐方式, 这样容易阅
读和维护 。
【 例 3.1】 将输入文本框中的所有小写字母转换成大写字母,
并将一些特殊符号变成等价的字符串, 如 DLR表示 $,AT表示 @、
0/0表示 %, BPT表示 #,AND表示 &等 。 可以在 KeyPress事件中
修改文本框控件的缺省操作, 使它能在用户输入这些字符时进
行相应修改 。
Private Sub Text1_KeyPress (KeyAscii As Integer)
Dim spesymbols As String
Dim ch As String ?1
Spesymbols=?$#%&@?
ch= Chr(KeyAscii)
If InStr(Spesymbols,ch) Then
KeyAscii=0
Else
3.1 条件测试语句
KeyAscii = Asc(Ucase(ch))
Exit Sub
End If
Select Case ch
Case ?$?,Text1.SelText=?DLR?
Case ?#?,Text1.SelText=?BPT?
Case ?%?,Text1.SelText=?0/0?
Case ?&?,Text1.SelText=?AND?
Case ?@?,Text1.SelText=?AT?
End Select
End Sub
3.2 循环语句
3.2 循环结构
1,For循环语句 (一般用于循环次数已
知 )
形式:
For 循环变量=初值 to 终值 [Step 步
长 ]
语句块
[Exit For]
语句块
Next 循环变量
>0 初值 <终值 =1 时,可
省略
<0 初值 >终值
=0 死循环
步长
循环变量在终值
内
图 1 - 3 - 1 3 F o r 循环语句
语句块
E x it F o r
语句块
循环变量加步长
T
F
循环变量得初
值
3.2 循环语句
循环次数
)1( ?? ?步长 初值终值I n t
例, For I=2 To 13 Step 3
Print I,
Next I
Print,I=“,I
循环执行次数, 4
输出 I的值分别为,
2 5 8 11
出了循环输出为, I=14
3.2 循环语句
例 3.2 编程计算,S=1+2+3+… +100
Dim S%,I%
S=0 ' 累加前变量 S为 0
For I=1 to 100
S=S+I
Next I
Print " S=",S
当 N<=100
N=N+1
打印 S
S=0,N=1
S=S+N
【 例 3.3】 求阶乘 n!
3.2 循环语句
编写程序代码 。
Private Sub Command1_Click()
Dim n As Integer,i As Integer
Dim result As Long
result=1
n=CInt(text1.text)
If n<=0 Then
Label2.Caption="请输入正整数 ! "
Exit Sub '结束过程
End if
For i=1 To n
result=result*i
Next i
Label2.Caption=Str(n)+"!="+Str(result)
End Sub
3.2 循环语句
3.2 循环语句
3.2.2 Do… Loop循环语句
形式 1:(当型循环)
Do { While|Until }<条
件 >
语句块
[Exit Do]
语句块
Loop
条件
F
T
F
T
E x it D o
语句块
语句块
E x it D o
语句块
语句块
表达式列表 1
图 1 - 3 - 1 6 D o … L o o p W h ile
D o W h ile … L o o p 执行过程
3.2 循环语句
形式 2,(直到循环)
Do
语句块
[Exit Do]
语句块
Loop { While|Until} <条
件 >
表达式列表 1
F
T
F
T
E x it D o
语句块
语句块
E x it D o
语句块
语句块
条件
D o … L o o p W h ile 的执行过程
图 1 - 3 - 1 5 D o W h ile … L o o p
3.2 循环语句
条 件
语句块
语句块
T
F
Exit Do
条 件
语句块
语句块
T
F
Exit Do
Do Until… Loop执行过程 Do… Loop
Until执行过程
3.2 循环语句
说明:
( 1) 当使用 While<条件 >构成循环时, 当条件为, 真,,
则反复执行循环体, 当条件为, 假,, 则退出循环 。
( 2) 当使用 Until <条件 >构成循环时, 当条件为, 假,,
则反复执行循环体, 直到条件成立, 即为, 真, 时, 则退出循
环 。( 3) 在循环体内一般应有一个专门用来改变条件表达式中
变量的语句, 以使随着循环的执行, 条件趋于不成立 ( 或成
立 ), 最后达到退出循环 。
( 4)语句 Exit Do的作用是退出它所在的循环结构,它
只能用在 DO/Loop结构中,并且常常是同选择结构一起出现在
循环结构中,用来实现当满足某一条件时提前退出循环 。
【 例 3.5】 用 Do… Loop循环结构实现求和 sum=1+2+3+… +100。
编写代码如下:
解法一:采用当型循环 Do While… Loop
Private Sub Command1_Click()
Dim i As Integer,sum As Integer
i=1 '计数器初值置为 1
sum=0 '累加器初值置为 0
Do While i<=100 '当型循环
sum=sum+i
i=i+1 '每次循环变量加 1
Loop
Label2.Caption=Str(sum)
End Sub
解法二:采用直到型循环
Do… Until… Loop
Private Sub Command1_Click()
Dim i As Integer,sum As
Integer
i=1 '计数器初值置为 1
sum=0 '累加器初值置为 0
Do Until i>100
sum=sum+i
i=i+1
Loop
Label2.Caption=Str(sum)
End Sub
3.2 循环语句
3.2.3 While… Wend语句
使用格式如下:
While <条件 >
<循环块 >
Wend
说明,该语句的功能与 Do While <条件 >…,Loop实现
的循环完全相同 。
3.2 循环语句
例(补充) 求两个整数的最大公约数、最小公倍数
Dim n%,m%,nm%,r%
m=Val(InputBox("m="))
n=Val(InputBox("n="))
nm=n*m
If m<n Then t=m,m=n,n=t
r=m mod n
Do While (r <> 0)
m=n
n=r
r= m mod n
Loop
Print "最大公约数 =",n
Print "最小公倍数 =",nm/n 算法流程图
3.2 循环语句
3.2.4 循环的嵌套 ——多重循环结构
如果在一个循环内完整地包含另一个循环结构,则
称为多重循环,或循环嵌套,嵌套的层数可以根据需要而
定,嵌套一层称为二重循环,嵌套二层称为三重循环。
上面介绍的几种循环控制结构可以相互嵌套, 下面
是几种常见的二重嵌套形式:
3.2 循环语句
( 1) For I=…,
…,.
For J=…,
…,
Next J
…,.
Next I
( 2) For I=…,
…,.
Do While/Until
…,
…,
Loop
…,.
Next I
( 3) Do While…,
…,.
For J=…,
…,
Next J
…,.
Loop
( 4) Do While/Until…,
…,.
Do
While/Until …,
…,
Loop
…,.
Loop
3.2 循环语句
例如,打印九九乘法表,
For i = 1 To 9
For j = 1 To 9
se = i & "× " & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
【 例 3.7】 求 1∽ 30间的全部素数 。
分析:素数是只能被 1和它本身整除的正整数。例如,17是一个素
数,它只能被 1和 17整除。素数又成为质数。
Private Sub Command1_Click()
Dim m As Integer,k As Integer,i As Integer
Dim j As Long,flag As Long
j=0
For m=1 To 30 Step 2
k=Int(Sqr(m))
flag=0
For i=2 To k
if m Mod i=0 Then
flag=1 'flag=1表示 m不是素数
Exit for
End if
窗体上命令按钮 Command1的 Click事件代码如下:
Next i
If flag=0 Then '此时 flag=0表示 m是素数
j=j+1
If j Mod 4=0 Then ?使得每行输出 4个素数
Print,” +str(m)
Else
Print " "+Str(m);
End If
End If
Next m
End Sub
3.3 分支语句
3.3.1 Goto 语句
形式, Go To {标号 |行号 }
作用是无条件地转移到标号或行号指定的那行语句,
标号是一个字符序列,行号是一个数字序列。
例如:
Lp,……
……
……
goto lp