1、本章我们开始真正学习如何编写程序代码。VB.NET程序的基本组成元素是语句。我们编写程序的目的是要实现一定的功能。如何有效地将各种语句组合起来,以达到我们的目的,是本章的学习重点。4.1 什么是语句4.2 什么是控制结构 4.2.1 顺序结构 4.2.2 选择结构 4.2.3 循环结构4.3 语句嵌套VB.NET中的语句是可包含关键字、运算符、变量、常数和表达式的完整指令,可以分为声明语句和可执行语句两种。声明语句用于命名变量、常数或过程,并指定数据类型。例如,用于声明变量的Dim语句和声明常量的Const语句就属于声明语句。可执行语句用于启动某种操作。例如,赋值语句就属于可执行语句。本章要讲
2、述的各种分支、循环语句也都属于可执行语句。VB.NET中的语句书写非常灵活,可以一行放入多条语句,语句之间用冒号(:)分隔。例如 Dim str As String=Hello World:MsgBox(str)当语句太长时,也可以一条语句跨多行书写。此时需要使用行继续符在下一行继续该语句。行继续符依次包含一个空格、一个下划线字符(_)和一个回车符。例如 1 Dim nameVar As String 2 nameVar=John 3 MsgBox(Hello&nameVar&_ 4.How are you?)注释行以撇号()开头或以REM开头,后跟一个空格。注释可以添加在代码中的任意位置,但
3、不能添加在字符串中。若要将注释追加到某语句,可以在该语句后插入一个撇号或REM,后面添加注释。注释还可以位于单独的行中。1 这是单独一行的注释2 REM 这是另一行单独的注释3 x+=a(i)*b(i)计算两个数的乘积4 MsgBox(statusMessage)REM 显示当前的状态信息在Visual Studio.NET IDE中书写语句时,IDE会对语句的语法进行检查。如果语句书写完毕后,出现绿色的下滑波浪线,则说明该语句存在语法错误。将鼠标悬停在带有下滑波浪线的语句上,即可查看到错误信息。如果不更正,代码将无法正确的编译。在20世纪60年代,就出现了结构化程序设计的概念,指出程序的编写
4、应采用结构化方法。1966年提出了任何计算机程序都可以由3种基本结构组成。这3种基本结构是顺序结构、选择结构和循环结构。当型循环 直到型循环从图中可以看出,这3种基本结构的基本特点是每一种结构都只有一个入口和一个出口。任何一个算法都可以用这3种基本结构实现,任何复杂的程序都可以分解为由3种基本结构组成。4.2.1 顺序结构顺序结构是最简单的控制结构,按照语句书写的顺序一句一句的执行。典型的例子是交换两个变量x和y的值。1 Dim x As Integer=102 Dim y As Integer=203 Dim temp As Integer4 temp=x 此时temp中保存x的值105 x
5、=y x值变为y的值206 y=temp y值变为temp中保存的x的值10,交换完成考虑这样一个应用程序“SayHello”当用户打开应用程序后,向用户显示问候信息,根据时间不同,问候信息也应该不同。因此程序需要根据当前时间判断是上午、下午还是晚上,分别给出不同的问候信息。在这个应用中,当前时间应该作为判断条件,根据不同的判断结果,显示不同的信息,这是一个典型的选择结构。(1)(1)基本形式基本形式If语句的语法格式如下。If 表达式 Then 语句块1Else 语句块2End IfIf ab Then MsgBox(a大于b)这句代码用于判断a和b两个变量值的大小,由于执行语句只有一句,因
6、此写在了同一行上,并省略了End If。1 If ab Then 2 MsgBox(a大于b)3 Else4 MsgBox(a小于等于)5 End If增加了第3行的Else子句,当a不大于b时,也显示相应信息。Step1:创建应用程序工程。单击菜单栏中的【文件】【新建项目】命令,打开【新建项目】窗口。在该窗口的【模板】列表框中,选择【Windows窗体应用程序】,并在【名称】文本框中输入“SayHello”。Step2:进行窗体界面设计。向窗体中添加两个Label控件,并将其Font属性设置为Arial,四号,Name属性分别设置为lblTime和lblInfo;窗体的Text属性设为“Sa
7、yHello”,Name属性设置为frmSayHello。Step3:代码编写。下面是窗体的Load事件过程。1 Private Sub frmSayHello_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles MyBase.Load2 Dim h As Integer=Now().Hour3 lblTime.Text=Now().ToString()4 If h 12)And(h=18 Then lblInfo.Text=Good Evening,Cindy!7 End Sub 上例中我们使用3个If
8、语句并列实现了时间判断。这3个If语句是要顺序执行的。考虑这样一种情况:当前时间为2008-8-7 9:12:11,此时变量h的值应为9。第1个If语句的判断条件h=12为真,显示“Good morning,Cindy!”的信息;之后第2个和第3个If语句的判断条件均为假,程序执行完毕。实际上,在这种情况下,第2个和第3个If语句的判断条件已经没有必要再继续进行比较了。使用并列的3个If语句虽然也可以实现我们要求的功能,但是效率上并不好。1 Dim h As Integer=Now().Hour2 lblTime.Text=Now().ToString()3 If h 12)And(h=18
9、Then 8 lblInfo.Text=Good Evening,Cindy!9 End IfIf 表达式1 Then 语句块1ElseIf 表达式2 Then 语句块2ElseIf 表达式3 Then 语句块3Else 语句块nEnd If语法格式如下。Select Case 表达式 Case 情况列表1 语句块1 Case 情况列表2 语句块2 Case Else 语句块nEnd SelectSelect语句首先计算表达式的值,之后与Case语句指定的情况列表进行比较。情况列表中可以包含一个或多个值、某个范围的值或值和比较运算符的组合。如果匹配,则执行其后的语句块,以此类推。如果均不匹配,
10、则执行Case Else后面的语句块。Case语句可以有一条或者多条,而且Case Else语句可以省略。1 lblTime.Text=Now().ToString()2 Select Case Now().Hour3 Case 0,1,2,3,4,5,6,7,8,9,10,11,124 lblInfo.Text=Good morning,Cindy!5 Case 13,14,15,16,17,186 lblInfo.Text=Good afternoon,Cindy!7 Case Else8 lblInfo.Text=Good evening,Cindy!9 End Select1 lblT
11、ime.Text=Now().ToString()2 Select Case Now().Hour3 Case Is=124 lblInfo.Text=Good morning,Cindy!5 Case 13 to 186 lblInfo.Text=Good afternoon,Cindy!7 Case Else8 lblInfo.Text=Good evening,Cindy!9 End Select在某些应用中,可能需要重复执行某一个语句块。例如,一个用户登录程序,用户输入户名和密码后需要进行检查,3次错误后锁定该用户。在这个应用中,有可能需要重复检查用户输入,因此应当将检查用户输入的语句
12、块作为循环体,这是一个典型的循环结构。For-Next语句用于计数循环。While语句用于当型循环。Do-Loop语句用于直到型循环。For Each语句用于集合或数组元素循环。For语句的语法格式 For 循环变量=初值 To 终值 Step 步长 循环体 Next 循环变量考虑这样一个应用程序“ComputeSum”:用户输入一个数之后,计算从1开始叠加到该数的总和。这是一个典型的计数循环的结构,可以使用For语句来实现。Step1:创建应用程序工程。单击菜单栏中的【文件】【新建项目】命令,打开【新建项目】窗口。在该窗口的【模板】列表框中,选择【Windows窗体应用程序】,并在【名称】文
13、本框中输入“ComputeSum”。Step2:进行窗体界面的设计该控件用于接收用户输入或者将计算结果显示给用户,其Text属性就是文本框中的内容。Step3:编写代码。在【计算】按钮上双击鼠标,打开代码窗口。由于需要单击按钮后开始计算并显示结果,所以代码应该写在按钮控件的单击事件中。1 Dim n As Integer=CInt(txbInputNum.Text)2 Dim sum As Long=03 Dim i As Integer4 For i=1 To n5 sum+=i6 Next7 txbSum.Text=sum.ToString()1 Dim n As Integer=CInt
14、(txbInputNum.Text)2 Dim sum As Long=0 3 Dim i As Integer4 For i=2 To n step 25 sum+=i6 Next7 txbSum.Text=sum.ToString()循环变量初值从2开始,循环步长为2考虑这样一个应用程序“Calculate Pai”:在某些需要计算精确的情况下,需要使用圆周率的值。可以通过下面的公式来计算得到圆周率的近似值。/4=1 1/3+1/5 1/7+1/n在该应用中,实际是求一个数列的前n项累加和,通常要求累加至最后一项的值小于10-6。这种情形下,n的值在开始时无法确定,只能在逐渐累加的过程中进
15、行判断,也就是说,循环次数无法确定,循环是通过1/n是否小于10-6来确定的,因此For语句并不适用。因此,VB.NET提供了While语句来实现通过某个条件进行循环。While 循环条件 语句块End While其中,循环条件为关系或逻辑表达式,值为Boolean类型。当循环条件为真时,循环执行语句块;当循环条件为假时,退出循环。因此While语句属于当型循环,意思是当循环条件为真时执行循环。1 Dim intX As Integer=32 While intX=1003 intX*=34 End While1 Dim intX As Integer=12 Dim intY As Integ
16、er=13 While intXintY4 intX+=intY5 End While如果在循环体执行过程中,没有使得循环条件变为假的操作,循环体一直循环执行,我们称之为无限循环,也称为死循环。下面是一个最简单的死循环。1 While True 2 循环体 3 End WhileStep1:创建应用程序工程。单击菜单栏中的【文件】【新建项目】命令,打开【新建项目】窗口。在该窗口的【模板】列表框中,选择【Windows窗体应用程序】,并在【名称】文本框中输入“Calculate Pai”。Step2:进行窗体界面设计Step3:编写代码。在窗体上双击鼠标,打开代码窗口,编写窗体的Load事件过程
17、。1 Private Sub frmCalPai_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles MyBase.Load 2 Dim dblDenominator As Double=1 用于存放项的分母3 Dim dblTerm As Double=1 用于存放当前项的值4 Dim intSign As Integer=1 用于表示当前项的符号5 Dim Pai As Double=0 用于存放累加和结果6 7 While Math.Abs(dblTerm)=0.00000018 Pai+=dblT
18、erm 累加9 dblDenominator+=2 第n项的分母是第n-1项的分母加上210 intSign=-intSign 改变符号11 dblTerm=intSign/dblDenominator 生成下一项12 End While13 Pai=Pai*414 txbPai.Text=Pai.ToString()在文本框中显示计算结果15 End Sub累加,同时生成下一项在通常情况下,如果循环次数确定,一般选用For循环。如果循环次数未知但有条件来保证循环过程是有限次数的,选用While循环。实际上,在循环次数确定的情况下同样可以选择使用While语句。例如,“ComputeSum”应
19、用程序中,我们使用For循环来计算从1到n的累加,同样使用While语句也可以实现。1 Dim n As Integer=CInt(txbInputNum.Text)2 Dim sum As Long=03 Dim i As Integer=14 While(i=n)5 Sum+=i6 i+=17 End While基本形式:Do While|Until 循环条件 循环体 Loop其中,While和Until是可选的。使用While时,当后面的条件满足则执行循环体。使用Until时,当后面的条件满足就退出循环体。无论使用While还是Until,都是先测试循环条件是否满足,再决定是否执行循环体
20、1 Dim n As Integer=CInt(txbInputNum.Text)2 Dim sum As Long=03 Dim i As Integer=14 Do While in5 Sum+=i6 i+=17 LoopDo-Loop语句还有另外一种写法Do 循环体Loop While|Until 循环条件Loop后的While和Until与上一种写法含义相同,即使用While时,当后面的条件满足则执行循环体;使用Until时,当后面的条件满足就退出循环体。区别在于,这种写法先执行循环体再测试循环条件是否满足。因此,这种写法中循环体至少会被执行一次。1 Dim n As Integer=
21、CInt(txbInputNum.Text)2 Dim sum As Long=03 Dim i As Integer=14 Do5 Sum+=i6 i+=17 Loop While in这四段代码都是等价的。前面的例子中,都是循环变量值超出终值范围或者循环条件不满足,才终止循环。除此之外,还可以在循环体中使用Exit语句直接跳出循环控制结构。根据使用的循环语句的不同,Exit语句可以有以下几种形式。Exit For。Exit While。Exit Do。1 TestExit2 Module Module13 4 Sub Main()5 Dim i As Integer=26 Dim Sum
22、As Integer=07 While True8 Sum+=i9 If Sum=100 Then10 Exit While 11 Else12 i+=213 End If14 End While15 MsgBox(i)16 End Sub17 18 End Module死循环跳出当前循环的条件判断4 Sub Main()5 Dim N As Integer6 Dim i As Integer=27 Dim IsPrime As Boolean=True8 N=CInt(InputBox(请输入一个整数)9 For i=2 To N-110 If N i=0 Then 11 11 IsPrim
23、e=False12 Exit For13 End If14 Next15 16 If IsPrime Then17 MsgBox(是素数!)18 Else19 MsgBox(不是素数!)20 End If21 End Sub跳出当前循环的条件判断将一个语句放在另一个语句内部称为嵌套。选择结构语句和循环结构语句均可嵌套使用,可以相同语句嵌套使用,也可以不同语句嵌套使用。For 循环变量1=初值1 To 终值1 Step 步长1For 循环变量2=初值2 To 终值2 Step 步长2 循环体 Next 循环变量2Next 循环变量1注意,使用语句嵌套的时候,必须是完全嵌套,像下面这样的交叉嵌套是不允许的。While 条件2If 条件2 thenEnd While End If