4.1 选择结构程序设计
4.2 循环结构程序设计
4.3 实践检验第 4章 VB.NET程序流程控制本章知识点:
单行结构、块结构 If语句
多分支结构语句
For-Next语句,Do...Loop语句第 4章 VB.NET程序流程控制
4.1 选择结构程序设计选择结构可使程序在不同的条件下选择执行不同的程序段。
4.1.1单行结构条件语句单行结构条件语句是指简单的行 If语句。
1 单行结构 If语句的格式
If〈 条件 〉 Then 〈 语句体 1〉 [ Else〈 语句体 2〉 ]
2 说明
-- 〈 条件 〉 是一个逻辑表达式,或表达式的数据类型是某种可隐式转换为 Boolean 的数据类型。程序根据这个表达式的值( True或 False)执行相应的操作。
-- 若 〈 条件 〉 为真,则执行 〈 语句体 1〉 。否则,若存在 Else子句,则执行 〈 语句体 2〉 。
-- 〈 语句体 1〉 和 〈 语句体 2〉 可以是一个语句,也可以是用冒号分割的多个语句。
-- 单行结构 If语句一般不提倡编写得太复杂。
-- [ Else〈 语句体 2〉 ] 子句省略时,If语句简化为:
If〈 条件 〉 Then 〈 语句 1〉
例如:
If My.Computer.Clock.LocalTime.DayOfWeek = DayOfWeek.Saturday
Or _
My.Computer.Clock.LocalTime.DayOfWeek = DayOfWeek.Sunday Then
_
MsgBox("Happy Weekend!")
如果当天是星期六或星期日,则会显示一个消息框,通知您 Happy
Weekend!,否则不会显示消息框。
如果语句改为:
If My.Computer.Clock.LocalTime.DayOfWeek = DayOfWeek.Saturday
Or _
My.Computer.Clock.LocalTime.DayOfWeek = DayOfWeek.Sunday Then
_
MsgBox("Happy Weekend!") Else MsgBox("Happy Workday!")
程序运行效果会有所不同:如果当天是星期六或星期日,则会显示一个消息框,通知您 Happy Weekend!,否则显示第二个消息框,通知您 Happy
Workday!。
在上面的示例中您可能已注意到,If...Then 语句使用 Or 运算符计算多个条件(“当天是星期六 Or 当天是星期日”)。在单个 If...Then 语句中,
您可以使用 Or和 And逻辑运算符计算您所需的尽可能多的条件。
4.1.2 块结构条件语句与单行条件语句相比,块结构条件语句有很多优点。例如,块形式比单行形式提供了更好的结构和灵活性,它允许条件分支跨越数行。同时,用块形式可以测试更复杂的条件。块形式使程序的结构按逻辑来引导,而不是把多个语句放在一行中。此外,使用块形式的程序一般容易阅读、维护和调试。任何单行形式的条件语句都可以改写成块形式。
1 块结构 If语句的格式
If﹤ 条件 1﹥ Then
﹤ 语句体 1﹥
[ ElseIf﹤ 条件 2﹥ Then
﹤ 语句体 2﹥ ]
[ ElseIf﹤ 条件 3﹥ Then
﹤ 语句体 3﹥ ]

[ Else
﹤ 语句体 n﹥ ]
End If
2 格式说明
﹤ 条件 1﹥ 为真,则执行 ﹤ 语句体 1﹥,否则依次测试每个 ElseIf语句,
若发现某个 ElseIf语句的条件为真,则执行相应的语句;若所有的条件都为假且存在 Else子句,则执行 Else后的 ﹤ 语句体 n﹥ 。
如果没有 ElseIf子句,则块结构 If语句变为:
If﹤ 条件 1﹥ Then
﹤ 语句体 1﹥
[ Else
﹤ 语句体 n﹥ ]
End If
对上述语句,若 ﹤ 条件 ﹥ 为真,则执行 ﹤ 语句体 1﹥,块 If语句结束。否则执行 Else子句。若省略 Else子句,块形式的条件语句简化为:
If﹤ 条件 ﹥ Then
﹤ 语句体 1﹥
End If
例如
If C<0 Then
Text1.Text="Hello!world"
End If
将上面的块形式条件语句中,End If”去掉,并把
,Text1.Text="Hello!world"”语句放在,Then”的后面,则可以写成单行形式,即:
If C<0 Then Text1.Text="Hello!world"
执行任何一个 ﹤ 语句体 ﹥ 后,退出该结构,继续执行 End If后面的语句。
﹤ 语句体 1﹥ …﹤ 语句体 n﹥ 可以是一个语句,也可以是多个语句。
块结构条件语句自上而下地对条件表达式进行判断,一旦发现某条件表达式值为“真”,就执行与之相关的语句,其余部分跳过。如果没有条件成立,就执行最后的 Else子句,如果没有最后一条 Else,并且所有条件均不成立,那么不执行任何操作。
If和 End If在块结构条件语句是必须要有的,Else子句和 ElseIf子句都是可选的,可以有多个 ElseIf子句,但最多有一个 Else子句。
语句中的 ﹤ 条件 1﹥,﹤ 条件 2﹥ 等都是逻辑表达式,或表达式的数据类型是某种可隐式转换为 Boolean 的数据类型,如对数值表达式,非 0值表示
True,0值表示 False。
块形式的条件语句可以嵌套,即把一个完整的 If…Then…[Else…]End if块作为“一条语句”放在另一个 If…Then…Else块内某个分支语句上。嵌套必须完全“包住”,不能互相“骑跨”。
例如:
Private Sub Form1_Load()
Dim x,y As Integer
x = Val( InputBox( "请输入 x 的值 ","平方值计算 ",0))
If x > 10 Then
Console.WriteLine ("输入的数据太大 ")
Else
If x > 0 Then
Console.WriteLine "(输入的数据平方值为,{0}"; x * x)
Else
Console.WriteLine(输入的数据不能小于 0")
End If
End If
End Sub
4.1.3 IIf函数对于简单的行 If语句,可以用更简单的 IIf函数代替。
1 IIf函数的格式
IIf( ﹤ 条件表达式 ﹥,﹤ 真部分 ﹥,﹤ 假部分 ﹥ )
2 说明当 ﹤ 条件表达式 ﹥ 的值为真,则函数返回 ﹤ 真部分 ﹥ 的值,否则,函数返 ﹤ 假部分 ﹥ 的值。
﹤ 真部分 ﹥ 及 ﹤ 假部分 ﹥ 可以是表达式、变量或其他函数。
IIf函数可直接参与另一个表达式的计算。
注意,IIf函数中的 3个参数都不能省略,而且要求 ﹤ 真部分 ﹥,﹤ 假部分 ﹥ 及结果变量的类型一致。
例如,假定有如下的条件语句:
If a > 5 Then
r = 1
Else
r = 2
End If
则可用下面的 IIf函数来代替:
r = IIf(a > 5,1,2)
显然,用 IIf函数可以使程序大为简化。再如:
Private Sub Form1_Load()
Dim X As Single,Y As Single
X = InputBox("input x",,3)
Console.WriteLine( "y={0}"; IIf(X > 5,X * X,X / 2)
End Sub
4.1.4 多分支结构在 VB中,多分支结构程序通过 Select Case语句来实现。该语句以 Select
Case开头,以 End Select结束。其功能是,根据 ﹤ 测试条件 ﹥ 表达式的值,
从多个 case子句中选择符合条件的一个子句执行。
– 语句格式
Select Case﹤ 测试条件 ﹥
[ Case﹤ 表达式表 1﹥ ]
[ ﹤ 语句体 1﹥ ]]
[ Case﹤ 表达式表 2﹥ ]
[ ﹤ 语句体 2﹥ ]]

[ Case Else
[ ﹤ 语句体 n﹥ ]]
End Select
2 说明
-- ﹤ 测试条件 ﹥ 是任何数值表达式或字符串表达式。
-- ﹤ 表达式表 ﹥ 中有值与 ﹤ 测试条件 ﹥ 匹配时,执行该 Case子句下的 ﹤
语句体 ﹥,执行完该 ﹤ 语句体 ﹥ 后跳出 End Select子句。
-- ﹤ 测试条件 ﹥ 与所有 Case子句中的 ﹤ 表达式表 ﹥ 都不匹配时,执行
Case Else下的 ﹤ 语句体 n﹥ 。如果没有 Case Else语句,则退出 Select Case
结构,程序会从 End Select之后的语句继续执行。
-- 在 Case子句中,<表达式表 >为必要参数,是由一个或多个表达式组成的列表,若有多个,则每两个之间用逗号分隔。 Case子句中的 <表达式表
>是如表 4-1所示形式表达式的列表。
执行 Select Case语句时,首先计算 Select Case语句中 ﹤ 测试条件 ﹥ 的值,然后从第一个 Case开始找满足该值的 Case子句,遇到第一个表达式列表值与测试表达式相匹配的 Case子句,则执行其下的语句体,然后停止测试,跳出 Select Case结构。
Case Else子句用于指明,当测试条件和所有的 Case子句 <表达式表 >中的值都不匹配时,则会执行该子句下的语句。如果没有 Case值匹配测试条件,而且也没有 Case Else语句,则退出 Select Case结构,程序会从 End
Select之后的语句继续执行 。
4.1.5 举例例 4-1 行 If语句的使用。输入 x,计算 y的值,其中:
1+x (x≥0)
y=
1-2x (x<0)
分析:该题是数学中的一个分段函数,它表示当 x≥0时,用公式 y声 1+x
来计算 y的值,当 x<0时用公式 y=1-2x来计算 y的值。在选择条件时,即可以选择 x≥0作为条件,也可以选择 x<0作为条件。在这里,选 x≥0作为选择条件。这时,当 x≥0为真时,执行 y=1+x;为假时,执行 y=l-2x。
设计步骤如下:
( 1)在“文件”菜单上,选择“新建项目”。
( 2)在“新建项目”对话框的“模板”窗格中,单击,Windows 应用程序”按扭。
( 3)在“名称”框中键入 L4-1,再单击“确定”按扭。
( 4)一个新的 Windows 窗体项目随即打开。
( 5)双击该窗体以打开代码编辑器 。
( 6)在 Form1_Load事件处理程序中,键入代码。
Private Sub Form1_Load ()
Dim x,y As Single
x = Val(InputBox("输入 x 值 ","函数值计算 ",-3))
If x >= 0 Then y = 1 + x Else y = 1 - 2 * x
MsgBox "输出函数值为 " + Str(y),vbOKOnly,"函数值计算 "
End Sub
程序在默认输入下的运行结果,如图 4-1所示。
下面的举例说明嵌套 If语句使用情况。
例 4-2 设有如下函数
10 (x>0)
y= 0 (x=0)
-10 (x<0)
输入 x,要求输出 y的值。
在 Form1_Load 事件处理程序中,键入代码:
Private Sub Form_Load()
Dim x,y As Single
x = InputBox("请输入 x 的值 ","函数值计算 ",0)
If x > 0 Then y = 10 Else If x = 0 Then y = 0 Else y = -10
Console.WriteLine("当 x ={0}时,y ={1} ",x,y)
End Sub
在上面的程序中,,If x = 0 Then y = 0 Else y = -10”是 If语句的
,Else”部分,它本身也是一个 If语句,即嵌套 If语句。嵌套 If语句既可以出现在,Else”部分(如上例),也可以出现在,Then”部分。上例中的 If语句可以改为:
If x <= 0 Then If x = 0 Then y = 0 Else y = -10 Else y = 10
当嵌套层数较多时,应注意嵌套的正确性,一般原则是:每一个,Else”
部分都与它前面的、且未曾被配对的,If-Then”配对。
例 4-3 检查输入的字符串,其长度不短于 4,最多不超过 20,第一个字符不允许是数字或下画线。最后输出符合条件的字符串长度,不符合条件时给出相关的提示信息。
在 Form1_Load 事件处理程序中,键入代码:
Private Sub Form_Load()
Dim s,t As String
Dim n%
s = InputBox("Input a string")
t = Microsoft.VisualBasic.Left(s,1)
n = Len(s)
If n > 20 Then
Debug.Print("Input too long")
ElseIf n < 4 Then
Debug.Print("Input too short")
ElseIf t >= "0" And t <= "9" Or t = "_" Then
Debug.Print("Can't start with a numeric or underline")
Else
Console.WriteLine("string's length={0}",n)
End If
End Sub
本程序中,首先用 Left()函数将输入字符串 s 左边的第一个字符赋给变量 t,用函数 len()求出 s的长度赋值给 n,然后用块结构条件语句
( If...[ElseIf])进行一系列检测:如果 n > 20,则输出信息,Input too
long”;如果 n < 4,则输出信息,Input too short”;如果 t是数字字符或下画线字符,则输出信息,Can't start with a numeric or underline”;如果输入数据符合要求,则输出信息,string's length=”。
若程序运行后,输入字符串为,abc_deg”,则输出结果为,string's
length=7”。
若程序运行后,输入字符串为,8abc_de”,则输出结果为,Can't start
with a numeric or underline”。
若程序运行后,输入字符串为,8ab”,则输出结果为,Input too short”。
程序中的条件表达式 t >= "0" And t <= "9",用于判断变量 t中字符的
ASCII码是否在字符 "0"和字符 "9"的 ASCII码之间,其等同于
ASC(t)>=ASC("0") and ASC(t)<=ASC("9")。一般来说,没有必要背字符的
ASCII码值,程序中需要用时,用函数 ASC即可求得,这样,增强了程序的可读性。如果是字符之间的比较,可以直接进行,就像本题一样。
例 4-4 在 Form窗体上加入名为 Command1命令按钮,并在 Click事件中编写如下程序:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Dim Data,x As Integer
Data = Val(InputBox("input Data,"))
Select Case Data
Case Is < 4
x = Data + 1
Case Is < 5
x = Data + 2
Case Is < 6
x = Data + 4
End Select
Console.WriteLine("{0} {1}",Data,x)
End Sub
下列程序运行时,从键盘输入 4,输出的结果是,4 6
说明:
运行时在输入对话框中输入 4,Val 函数将输入的字符 4转化为数值 4赋给变量 Data,多路分支语句 Select Case Data,测试表达式是 Data,从上到下检查各 Case 子句中的表达式列表是否满足条件,本例中,Case Is < 5 表达式列表满足条件,因此,执行其下面的 x = Data + 2,x的值执行后为 6,跳出 Select语句,执行 Console.WriteLine语句,按给定格式输出 4 6。
尽管第 3个 Case子句 Case Is < 6 也满足条件,但系统已不在进行比较,
更不会执行其中的语句。
4.2.1 For-Next循环将一组语句重复执行指定的次数。
For循环语句的格式:
For﹤ 循环变量 ﹥ = ﹤ 初值 ﹥ To﹤ 终值 ﹥ [ Step﹤ 步长 ﹥ ]
[语句体 1]
[ Exit For]
[语句体 2]
Next[ ﹤ 循环变量 ﹥ ]
格式说明:
-- ﹤ 初值 ﹥,﹤ 终值 ﹥,﹤ 步长 ﹥ 是数值型表达式,既可以是整数也可以是浮点数。
-- ﹤ 循环变量 ﹥ 为循环计数变量。省略 Step﹤ 步长 ﹥ 时,﹤ 步长 ﹥ 为 1。
-- For...Next循环执行时,先将初值赋给循环变量,判断是否超过终值,
若未超过则执行循环体,遇到 Next语句后,循环变量增加一个步长,再判断是否超过终值,若未超过则继续执行循环体,如此重复直到循环变量超过终值,退出循环
4.2 循环结构程序设计
-- Next 后面的循环变量可以省略。
-- ﹤ 步长 ﹥ 可为正数或负数,若为负数,则必须循环变量小于终值时才退出循环。
-- Exit For的作用是退出循环。
-- For循环结构是先判断后执行,常用于已知次数的循环,循环次数可用下面公式计算:
循环次数 = Int((终值 -初值) /步长 + 1)
4.2.2 当循环控制结构
While循环语句格式:
While﹤ 条件 ﹥
[语句体]
Wend
格式说明,﹤ 条件 ﹥ 是一个逻辑表达式。 ﹤ 条件 ﹥ 为“真”,执行[语句体];否则,循环结束。
4.2.3 Do循环控制结构
1 前测 型 Do…Loop 循环格式:
Do[{ While︱ until} <条件 >]
[语句体 1]
[ Exit Do]
[语句体 2]
Loop
说明:
--Do While …Loop时,当 ﹤ 条件 ﹥ 为真时,执行循环体,为假时终止循环。
-- Do Until …Loop时,当 ﹤ 条件 ﹥ 假时,执行循环体,直到真时终止。
--省略{ While︱ until} <条件 >,按无条件执行。必须和 Exit Do配合使用,否则,将成为“死”循环。
-- Exit Do是跳出本层循环。
-- 可以使用 Exit Sub 或 Exit Function 直接结束一个过程或函数的执行。
2 后测型 Do… Loop循环格式:
Do
[语句体 1]
[ Exit Do]
[语句体 2]
Loop[{ While︱ until} ﹤ 条件 ﹥ ]
说明:
-- 这种形式的语句与前测型 Do…Loop语句类似,区别在于前测型先进行条件判断,再执行循环体,即有可能循环体一次也不执行。而后测型是先执行循环体,再进行条件判断,即循环体至少执行一次。
-- 在以上的循环控制结构中,For循环是固定次数的循环,其他循环都是不确定次数的循环,都需要在循环体中修改循环条件,以避免出现“死”
循环。
4.2.4 多重循环多重循环是指嵌套使用 VB.NET的循环控制结构。在嵌套循环中,外层循环必须完全包含内层的循环,不允许出现跨越交叉形式。原则上,多层循环中各层不能使用相同的循环变量。
4.2.5 举例求 1到 100的自然数累加和,如图 4-2所示。
设计步骤如下:
( 1)建立应用程序用户界面与设臵对象属性。
建立 1个 Label,1个 TextBox,1个 Button控件,令 Label1.Text
=,1+2+3…+100=” 。
( 2)编写程序代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim S,I As Integer
S = 0
For I = 1 To 100
S = S + I
Next
TextBox1.Text = S
End Sub
例 4-6 输入一个自然数,求从 1到它的阶乘和,如图 4-3所示。
建立应用程序用户界面与设臵对象属性。
建立 2个 Label,1个 TextBox,1个 Button控件,令 Label1.Text =,请输入一个不超过 12的自然数”。
编写程序代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs)
Handles Button1.Click
Dim i As Integer,m,s As Long
s = 0,m = 1,i = 1
While i <= Val(TextBox1.Text)
m = m * i '求 n!
s = s + m '将各项的阶乘相加
i = i + 1
End While
Label2.Text = "1!+2!+...+" & TextBox1.Text & "!=" & Str(s)
Str()函数将 s转成 string类型
End Sub
例 4-7 输入一个自然数,计算从 1到该自然数的和,如图 4-4所示。
设计步骤如下:
( 1)建立应用程序用户界面与设臵对象属性。
建立 2个 Label,1个 TextBox,3个 Button控件,令 Label1.Text =,请输入一个小于 6000的整数”。
( 2)利用相关算法,写出程序。
( 3) Long型数据的范围为 -2147483648 ~ +2147483647,所以输入的整数不要超过 6000,以免数值溢出。
<程序一 >使用 Do While…Loop语句
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim m,n As Integer,s As Long
s = 0,n = 0
m =Val( TextBox1.Text)
Do While n <= m
s = s + n
n = n + 1
Loop
Label2.Text = "1+2+3+...+" & m & "=" & s
End Sub
<程序二 >使用 Do…Loop until语句
Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button2.Click
Dim m,n As Integer,s As Long
s = 0,n = 0
m =Val( TextBox1.Text)
Do
s = s + n
n = n + 1
Loop Until n > m
Label2.Text = "1+2+3+...+" & m & "=" & s
End Sub
<程序三 >使用 For…Next语句
Private Sub Button3_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles
Button3.Click
Dim m,n As Integer,s As Long
s = 0,n = 0
m =Val( TextBox1.Text)
Do
If n > m Then
Exit Do
End If
s = s + n
n = n + 1
Loop
Label2.Text = "1+2+3+...+" & m & "=" & s
End Sub
例 4-8 输入两个整数,计算出它们之间所有的素数,如图 4-5所示。
设计步骤如下:
( 1)建立应用程序用户界面与设臵对象属性。
建立 3个 Label,3个 TextBox,1个 Button控件,一个框架。
( 2)根据素数计算算法(求自然数 n是否是素数只要依次用 2~作除数去除 n,若 n不能被其中任何一个数整除,则 n即为素数)写出程序。
( 3)编写程序代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim n,m,x,i As Integer,s As String?定义变量
s = TextBox1.Text & "到 " & TextBox2.Text & "之间的素数是,"?s是要输出的内容
m = Val(TextBox1.Text)?val()函数将文本框的内容转换为数值型数据
If m Mod 2 = 0 Then m = m + 1?应该从大于较小数的第一个奇数开始判断
For x = m To Val(TextBox2.Text) Step 2
Mark = 0?Mark作为素数标志,0时 x为素数,1时 x为非素数
For i = 2 To Int(Sqr(x))?函数 Int()是将括号里的平方根转换成整数
If x Mod i = 0 Then x被 i除尽时,x为非素数
Mark = 1
Exit For
End If
Next
If Mark = 0 Then s = s & Str(x) & " "
Next
TextBox3.Text = s
End Sub
理论巩固在例 4-4中,如果将后两个 Case条件语句的顺序交换,那么结果会发生什么变化。
( 2) 简述 Do While-Loop循环和 Do Until-Loop循环语句的异同。
上机实战
( 1)编程实现二进制流水灯:第一级灯亮 50毫秒后灯灭 50毫秒,同时第二级灯亮,隔 100毫秒后灯灭 100毫秒,同时第三级灯亮,隔 200毫秒后灯灭 200毫秒,… …,共 5级。如同 5位二进制数,每隔 50毫秒加 1,对应位上为 1时灯亮,否则灯灭,如图 4-6所示。
4.3 实践检验
( 2)编写程序实现多功能流动字幕:上下、左右单向移动及同时移动,
有字体可变控制,字体大小可变,移动速度可控制,如图 4-7所示。
( 3)编写程序检查输入的算术表达式中圆括号是否配对,并显示相应的结果。本程序在文本框中输入表达式,边输入,边统计,以输入回车作为表达式输入结束,然后显示结果。
注意:定义两个计数器 S1及 S2,Text1的 KeyPress事件中读字符,记下左括号及右括号的个数。
( 4)输入任意长度的字符串,要求倒臵并将其中的小写字母转为大写,
例如,将输入的,321abcD”变换成,DCBA123”。
( 5)在一次体操比赛中,有 5个评委打分,编写程序要求对每一名参赛者,输入 5个评委的打分分数,去掉一个最高分、一个最低分后,求出平均分为该参赛者的得分。