第四章 基本的控制结构
( 8学时)
4.1 顺序结构
4.2 选择结构
4.3 循环结构
4.4 其它辅助控制语句
4.5 常用算法(一)
4.6 常见错误 ( 顺序,条件,循环 )
一,赋值语句形式,[LET]变量名=表达式作用,将表达式的值赋值给变量名,
一般用于给变量赋值或对控件设定属性值,
例,sRate!=0.1
Text1.Text = "欢迎使用 Visual Basic 6.0”
当表达式的类型与变量的类型不一致时,强制转换成左边的精度
iA% = 10 / 3 iA中的结果为 3
注意:虽然赋值号与关系运算符等于号都用,=”表示,VB系统会根据所处的位置自动判断是何种意义的符号。
二,与用户交互函数和过程
1,InputBox函数
InputBox(提示 [,标题 ][,缺省 ][,x 坐标位置 ][,y坐标位置 ])
其中,提示 提示信息,标题 对话框标题,缺省 输入区缺省值函数返回字符类型,
例要在屏幕上显示如下的对话框,
Dim strName As String * 40,
strS1 As String * 40
相应的语句如下,
strName= InputBox(,请输入你的姓名” + vbCrLf +,然后单击确定”,“输入框” )
也可以:
strS1 =,请输入你的姓名” + Chr(13) + Chr(10) +,然后单击确定”
strName= InputBox(strS1,“输入框”,,100,100)
当键盘输入“王晓明” 后,变量 strName获得键盘输入的值,
2,MsgBox函数和 MsgBox过程函数形式,变量 [%] = MsgBox(提示 [,按钮 ][,标题 ])
过程形式,MsgBox 提示 [,按钮 ][,标题 ]
按钮值如下,函数返回所选按钮整数值,
例 3.2 编一帐号和密码检验程序。
要求,
帐号不超过 6位数字,有错,清除原内容再输入,
密码输入时在屏幕上以,*”代替 ; 若密码错,显示有关信息,
选择“重试”按钮,清除原内容再输入,选择“取消”按钮,
停止运行。
分析,
帐号 6位,MaxLength为 6,LostFocus判断 数字 IsNumeric函数密码 PassWordChar为,*”,MsgBox函数设置密码错对话框,
常见错误数据合法性检查中引起程序的死循环
Private Sub Text1_LostFocus()
If Not IsNumeric(Text1) Then
Text1 = ""
Text1.SetFocus
End If
End Sub
Private Sub Text2_LostFocus()
If Not IsNumeric(Text2) Then
Text2 = ""
Text1.SetFocus
End If
End Sub
If Text2 <> "" And Not IsNumeric(Text2)
Text1 Text2Text1
确定三,选择结构
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
重要的是学会两个数的交换,若上述语句次序变一下,结果如何?
表 达 式语 句 块
T
F
图 1 - 3 - 7 单 分 支 结 构
t
yx
图 1 - 3 - 8 两 个 数 交 换过 程
2,If… Then… Else语句 (双分支结构 )
If <表达式 > Then
<语句块 1>
Else
<语句块 2>
End If
If <表达式 > Then <语句 1> Else <语句 2>
计算分段函数表 达 式
F
图 1 - 3 - 9 双 分 支 结 构语 句 块 1
T
语 句 块 2
y x x x
x x x x




s i n
c o s
2
3
1 0
3 0
单分支结构实现,y=cos(x)- x^3+3*x
If x<>0 Then y=sin(x)+sqrt(x*x+1)
双分支结构实现,If x<>0 Then
y=sin(x)+sqrt(x*x+1)
Else
y=cos(x)- x^3+3*x
End If
3,If… Then… ElseIf语句 (多分支结构 )
形式,
If <表达式 1> Then
<语句块 1>
ElseIf <表达式 2>Then
<语句块 2>

[Else
语句块 n+1 ]
End If
不管有几个分支,依次判断,当某条件满足,执行相应的语句块,
其余分支不再执行;若条件都不满足,且有 Else子句,则执行该语句块,否则什么也不执行。,
ElseIf不能写成 Else If。
表 达 式 1
表 达 式 2
表 达 式 n
T
F
T
F
图 1 - 3 - 1 0 多 分 支 结 构语 句 块 n 语 句 块 n + 1 语 句 块 2 语 句 块 1
F
T
例 已知百分制成绩 mark,显示对应的五级制成绩哪些正确,哪些错误?
方法一
I f m a r k > = 90 T he n
P r i nt " 优 "
E l s e I f m a r k > = 80 T he n
P r i nt " 良 "
E l s e I f m a r k > = 70 T he n
P r i nt " 中 "
E l s e I f m a r k > = 60 T he n
P r i nt " 及格 "
E l s e
P r i nt " 不及格 "
E nd I f
方法二
I f m a r k < 60 T he n
P r i nt " 不及格 "
E l s e I f m a r k < 70 T he n
P r i nt " 及格 "
E l s e I f m a r k < 80 T he n
P r i nt " 中 "
E l s e I f m a r k < 90 T he n
P r i nt " 良 "
E l s e
P r i nt " 优 "
E nd I f
方法三
I f m a r k > = 60 T he n
P r i nt " 及格 "
E l s e I f m a r k > = 70 T he n
P r i nt " 中 "
E l s e I f m a r k > = 80 T he n
P r i nt " 良 "
E l s e I f m a r k > = 90 T he n
P r i nt " 优 "
E l s e
P r i nt " 不及格 "
E nd I f
4,If语句的嵌套
If语句的嵌套是指 If或 Else后面的语句块中又包含 If语句。
形式如下:
If <表达式 1> Then
If <表达式 11> Then

End If

End If
例,已知 x,y,z三个数,使得 x>y>z。
用一个 IF语句和一个嵌套的 IF语句实现:
If x<y Then t=x,x=y,y=t
If y<z Then
t=y,y=z,z=t
If x<y Then
t=x,x=y,y=t
End If
End If
If语句的嵌套注意事项:书写锯齿型; If 与 End If配对。
T
x > y
T
z 为最小数
T
使得 x > y
F
F
F
x > y > z
x < y
x 与 y 交换
y < z
y 与 z 交换
x< y
x 与 y 交换
5,Select Case语句 (情况语句 )
形式:
Select Case 变量或表达式
Case 表达式列表 1
语句块 1
Case 表达式列表 2
语句块 2

[Case Else
语句块 n+1]
End Select
<表达式列表 >:与 <变量或表达式 >同类型的下面四种形式之一:
表达式 例,,A”
一组枚举表达式 (用逗号分隔 ) 2,4,6,8
表达式 1 To 表达式 2 60 To 100
Is 关系运算符表达式 Is < 60
数值型或字符串表达式例如:已知变量 strC中存放了一个字符,判断该字符是字母字符、数字字符还是其他字符。
用多分支结构实现,
If Ucase(strC) >=" A" And Ucase (strC) <=" Z" Then
Print strC + "是字母字符 "
ElseIf strC >=" 0" And strC <=" 9" Then
Print strC + "是数字字符 "
Else
Print strC + "其他字符 "
End If
用 Select Case语句实现,
Select Case strC
Case "a" To "z","A" To "Z"
Print strC + "是字母字符 "
Case "0" To "9"
Print strC + "是数字字符 "
Case Else
Print strC + "其他字符 "
End Select
例 输入百分制成绩 mark,显示对应的五级制成绩方法一 方法二 方法三
S e l e c t C a s e m a r k S e l e c t C a s e m a r k S e l e c t C a s e m a r k
C a s e m a r k > = 90 C a s e I s > = 90 C a s e I s > = 90
P r i n t " 优 " P r i n t " 优 " P r i n t " 优 "
C a s e m a r k > = 80 C a s e I s > = 80 C a s e 80 T o 89
P r i n t " 良 " P r i n t " 良 " P r i n t " 良 "
C a s e m a r k > = 70 C a s e I s > = 70 C a s e 70 T o 79
P r i n t " 中 " P r i n t " 中 " P r i n t " 中 "
C a s e m a r k > = 60 C a s e I s > = 60 C a s e 60 T o 69
P r i n t " 及格 " P r i n t " 及格 " P r i n t " 及格 "
C a s e El s e C a s e El s e C a s e El s e
P r i n t " 不及格 " P r i n t " 不及格 " P r i n t " 不及格 "
En d S e l e c t En d S e l e c t En d S e l e c t
哪些能实现,哪些不能实现?
例实验 3.6对三门课程奖学金的判断,一等奖获得:
Select Case mark1,mark2,mark3
Case (mark1 + mark2 + mark3) / 3 >= 95
Print "一等奖 "
Case mark1 = 100 And mark2 = 100 And mark2 >= 80
……
End Select
错误注意,Select Case 后不能出现多个变量; Case后不能出现变量及有关运算符 。
例 3.3由计算机来当一年级的算术老师,要求给出一系列的 1~ 10的操作数和运算符,学生输入该题的答案,计算机根据学生的答案判断正确与否,当结束时给出成绩。
分析,产生 1~ 10操作数,可通过 Int(10 * Rnd + 1) 实现设置的控件名
Label1
Text1
Picture1
Command1
6.条件函数
( 1) IIf函数形式是:
IIf(表达式,当表达式为 True时的值,当表达式为 False时的值)
例如,求 x,y中大的数,放入 Tmax变量中,语句如下,
Tmax=IIf( x > y,x,y)
( 2) Choose函数形式是,
Choose(数字类型变量,值为 1的返回值,值为 2的返回值 ……)
例如,Nop是 1-4的值,转换成 +,-,×,÷ 运算符的语句如下,
Op=Choose( Nop,"+","-","× ","÷ ")
当值为 1,返回字符串,+”,然后放入 Op变量中,值为 2,返回字符串,-”,依次类推; 当 Nop是 1-4的非整数,系统自动取 Nop的整数办法在判断;若 Nop不在 1-4之间,函数返回 Null值。
( 3) Switch函数形式是:
Switch(条件表达式 1,条件表达式 1为 True时的值
[,条件表达式 2,条件表达式 2为 True时的值 ……])
常见错误
1.在选择结构中缺少配对的结束语句对多行式的 If块语句中,应有配对的 End If语句结束。
2,多边选择 ElseIf关键字的书写和条件表达式的表示
ElseIf 不要写成 Else If;
多个条件表达式次序问题,见例
3,Select Case语句的使用
Select Case 后不能出现多个变量; Case子句后不能出现变量 见例四,循 环结构
1,For循环语句 (一般用于循环次数已知 )
形式
For 循环变量=初值 to 终值 [Step 步长 ]
语句块
[Exit For]
语句块
Next 循环变量步长循环变量在终值内图 1 - 3 - 13 F or 循环语句语句块
E xi t F or
语句块循环变量加步长
T
F
循环变量得初值循环体
>0 初值 <终值 =1 时,可省略
<0 初值 >终值
=0 死循环循环次数
)1(步长 初值终值I n t
例,For I=2 To 13 Step 3 循环执行次数
Print I,输出 I的值分别为,
Next I 2 5 8 11
Print,Print,I=“,I 出了循环输出为,I=14
4)1( 3 213I n t
2,Do…Loop循环语句 (用于控制循环次数未知 )
形式 1:
Do { While|Until }<条件 >
语句块
[Exit Do
语句块 ]
Loop
形式 2:
Do
语句块
[Exit Do
语句块 ]
Loop { While|Until} <条件 >
表达式列表 1
F
T
F
T
E xi t D o
语句块语句块
E xi t D o
语句块语句块表达式列表 1
图 1 - 3 - 16 D o? L o o p W hi l e
图 1 - 3 - 15 D o W hi l e? L o o p
例 4.12用 辗转相除法求 两自然数 m,n的最大公约数和最小公倍数。
分析:求最大公约数的算法思想:
(1)对于已知两数 m,n,使得 m>n;
(2) m除以 n得余数 r;
(3)若 r=0,则 n为最大公约数结束;否则执行 (4);
(4)m?n,n?r,再重复执行 (2)。
例,求 m=14,n=6 的最大公约数,
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
m n r
14 6 2
6 2 0
m=m-n m>n
n=n-m n>m
m,n为公约数 m=n
辗转相减法
Do While m <> n
If m > n Then
m = m - n
Else
n = n - m
End If
Loop
m n
14 6
8 6
2 6
2 4
2 2
3.循环的嵌套一个循环体内又包含了一个完整的循环结构称为循环的嵌套,
例 4.13打印九九乘法表,
For i = 1 To 9
For j = 1 To 9 For j = 1 To i
se = i & "× " & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
思考:打印上三角或下三角程序如何改动?要打印下三角?
对于循环的嵌套,要注意以下事项:
(1)内循环变量与外循环变量不能同名;
(2)外循环必须完全包含内循环,不能交叉;
(3)不能从循环体外转向循环体内,也不能从外循环转向内循环,反之则可以。
正确 错误
For ii =1 To 10
For jj=1 To 20

Next ii
Next jj
For ii =1 To 10
For ii=1 To 20

Next ii
Next ii
For ii =1 To 10
For jj=1 To 20

Next jj
Next ii
For ii =1 To 10

Next ii
For ii =1 To 10

Next ii
四,其 他辅助控制语句
1,Go To 语句形式,Go To {标号 |行号 }
作用:无条件地转移到标号或行号指定的那行语句,
标号是一个字符序列,行号是一个数字序列,
2.Exit语句多种形式,Exit For,Exit Do,Exit Sub,Exit Function等 。
作用:退出某种控制结构的执行 。
3,End语句多种形式,End,End If,End Select,End With,End Type,End Sub,End Function、
作用,End结束一个程序的运行 ;其余表示某个结构的结束,与对应的结构语句配对出现。
4,With 语句形式如下,With 对象语句块
End With
作用:对某个对象执行一系列的操作,而不用重复指出对象的名称。
With Label1
.Height = 2000
.Width = 2000
.FontSize=22
.Caption = "This is MyLabel"
End With
Label1.Height = 2000
Label1.Width = 2000
Label1.FontSize=22
Label1.Caption = "This is MyLabel"
等价五、常用算法(一)
算法是对某个问题求解过程的描述
1.累加、连乘
1~ 100的 5或 7的倍数的和
Sum = 0
For i = 1 To 100
If i Mod 5 = 0 Or i Mod 7 = 0 Then
Sum = Sum + i
End If
Next i
Print Sum
3~ 10的乘积
t = 1
For i =3 To 10
t = t * i
Next i
Print t
思考,若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?
例 4.14求自然对数 e的近似值,要求其误差小于 0.00001,近似公式为,
该例题涉及两个问题:
( 1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。
( 2)累加,e=e+t 循环体外对累加和的变量清零 e=0
连乘,n=n*i 循环体外对连乘积变量置 1 n=1
Private Sub Form_Click()
Dim i%,n&,t!,e!
e = 0,n = 1 ‘ e存放累加和,n存放阶乘
i = 0,t = 1 ‘ i计数器,t第 i项的值
Do While t > 0.00001
e = e + t,i = i + 1 ‘ 累加、连乘
n = n * i,t = 1 / n
Loop
Print "计算了 "; i; " 项的和是 "; e
End Sub

m
1i0i i!
11
i!
1,.,
!
1...
3!
1
!2
1
1!
11e
i
2.求素数判别某数 m是否为素数最简单的方法是,
对于 m 从 i=2,3,…,m-1判别 m能否被 i整除,只要有一个能整除,m不是素数,否则 m是素数。
求 100以内的素数
For m = 2 To 100
For i = 2 To m - 1
If (m Mod i) = 0 Then GoTo NotNextM
Next i
Print m
NotNextM:
Next m
m是否为素数求 100以内的素数思考:
此例用 Go To语句对非素数不在判断,若不用 GoTo语句,如何修改程序? 见 例 4.15
3.穷举法
“穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
例 4.16 百元买百鸡问题 。 假定小鸡每只 5角,公鸡每只 2元,母鸡每只 3
元 。 现在有 100元钱要求买 100只鸡,编程列出所有可能的购鸡方案 。
设母鸡,公鸡,小鸡各为 x,y,z只,根据题目要求,列出方程为:
x+y+y=100
3x+2y+0.5z=100
三个未知数,两个方程,此题有若干个解。
解决此类问题采用“试凑法”,把每一种情况都考虑到。
方法一:最简单三个未知数利用三重循环来实现。
方法二:从三个未知数的关系,利用两重循环来实现。
4.递推法
“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。
例 4.17 猴子吃桃子 。 小猴在一天摘了若干个桃子,当天吃掉一半多一个;
第二天接着吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半零一个,到第 7天早上要吃时只剩下一个了,问小猴那天共摘下了多少个桃子?
分析:这是一个,递推,问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子 ……。
设第 n天的桃子为 xn,那么它是前一天的桃子数 。
2)1(121 11 nnnn xxxx 也就是:即:
5.最小、最大值在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,
若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较 。
例,随机产生 10个 100~ 200之间的数,求最大值 。
Private Sub Command1_Click()
Max = 100
For i = 1 To 10
x = Int(Rnd * 101 + 100)
Print x;
If x > Max Then Max = x
Next i
Print
Print "最大值 ="; Max
End Sub
例 4.18 实际应用,求最短残料 。
有一根长度为 321米的钢材料,要将它截取成两种规格 a,b的长度分别为 17米和 27米的短料,每种至少 1段,问分隔成 a,b各多少段后,
剩余的残料 r最少?
分析,该题利用,试凑法,通过二重循环求残料 r的最小值正数,残料不可能是负数 。 程序如下:
Private Sub Command1_Click()
Dim a%,b%,r!,ia%,ib%
r = 321 '最小值初值取钢材料的长度
For b = 1 To 321 \ 27 'b最多的段数
For a = 1 To 321 \ 17 - b 'a最多的段数
t = 321 - b * 27 - a * 17 '当前的残料
If t > 0 And t < r Then
r = t '求最短的残料
ia = a '最短残料时 a的段数
ib = b '最短残料时 b的段数
End If
Next a
Next b
Print ia,ib,r
End Sub
常见错误
1,不循环或死循环的问题主要是循环条件、循环初值、循环终值、循环步长的设置有问题。
2,循环结构中缺少配对的结束语句
For 少 配对的 Next
3.循环嵌套时,内外循环交叉
4.累加、连乘时,存放累加、连乘结果的变量赋初值问题
(1)一重循环在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。
( 2)多重循环这要视具体问题分别对待。