当前位置:文档之家› ch02

ch02

第2章Visual Basic .NET

高级程序设计基础

2.1 Visual Basic .NET程序结构

在Visual Basic .NET 中,编写的任何代码都必须按照以下顺序,否则会产生编译错误。

●Option语句。

●Imports语句。

●Main过程。

●根据特定的应用,选择使用Class、Module和Namespace语句。

此外,一个程序可以包括条件编译指令(如#If...Then...#Else),以及根据条件编译选定的Visual Basic 代码块。这些语句可以放置在模块的任何位置,一般把它们放在结尾。

2.1.1 Option 语句

Option 语句为后续的代码建立基本的规则,以防止语法和逻辑错误,包括Option Explicit、Option Strict及Option Compare三条语句。

1. Option Explicit 语句

Option Explicit语句用于在文件级强制对该文件中的所有变量进行显式声明,可缩短以后用于调试的时间。

1) 格式

Option Explicit { On | Off }

2) 说明

●On:可选项。启用Option Explicit 检查。如果在Option Explicit 语句后没有指

定On或Off,则默认为On。

●Off:可选项。禁用Option Explicit 检查。如果使用,则Option Explicit 语句必

须出现在文件中所有其他源语句之前。当Option Explicit 出现在文件中时,必须

使用Dim、Private、Public或ReDim语句显式声明所有变量,试图使用未声明的

变量名将发生编译时错误。如果没有使用Option Explicit 语句,则所有未声明的

变量都是Object 类型。

使用Option Explicit可避免拼错现有变量的名称,或避免在变量范围不清楚的代码中产生混淆。如果代码中没有指定Option Explicit,编译器的默认设置将是Option Explicit On。

第2章Visual Basic .NET高级程序设计基础

2. Option Strict 语句

Option Strict 语句必须出现在文件中的任何其他源代码语句之前。

Visual Basic .NET允许将某些数据类型转换为其他数据类型。在将一种数据类型的值转换为另一种精度较低或容量较小的数据类型时(即“收缩转换”),可能发生数据丢失。如果此类收缩转换失败,将会发生运行时错误。Option Strict 确保可为这些收缩转换提供编译时通知,从而可避免这种错误。

1) 格式

Option Strict { On | Off}

2) 说明

●On:可选项。启用Option Strict 检查。

●Off:可选项。禁用Option Strict 检查。如果在Option Strict 语句之后未指定On

或Off,则默认为Off。

3. Option Compare 语句

Option Compare 语句用于声明当比较字符串数据时所使用的默认比较方法:按它们的Binary或Text排列。

1) 格式

Option Compare { Binary | Text }

2) 说明

●Binary:可选项。按字符的内部二进制表示形式导出的排序顺序进行字符串

比较。

●Text:可选项。按系统的区域设置确定的不区分大小写的文本排序顺序进行字符

串比较。如果程序未包括Option Compare 语句,则默认的文本比较方法是

Binary。

2.1.2 Imports 语句

Imports 语句允许对类和其他定义在导入命名空间的类型进行命名,而无须对它们进行限制。

1. 语法格式及说明

1) 格式

Imports [<别名> = ] <命名空间>

或:

Imports [<别名> = ] <命名空间>.<元素>

2) 说明

●<别名>:可选项。一个名称,作为<命名空间> 的别名使用。当Imports 语句

Visual Basic .NET 课程设计案例精编

不包括<别名> 时,即可在文件中无条件访问指定的<命名空间> 中所定义的

元素。如果指定<别名>,则必须将<别名> 用做命名空间所包含名称的限定

符。当需要使用在一个或多个命名空间中声明的同名项时,别名是有用的。

●<命名空间>:必选项。所导入的命名空间的名称。命名空间可以有任何数量的

嵌套级深度。

●<元素>:可选项。命名空间中所声明的元素名称。可以是枚举、结构、类或模块。

2. 其他说明

每个文件可以包含任意数量的Imports 语句。Imports 语句必须位于任何声明(包括Module 或Class 语句)之前,并位于任何标识符引用之前。

Imports 语句的可用元素的范围取决于使用Imports语句时的具体程度。例如,如果只指定了命名空间,那么该命名空间的所有唯一命名的成员以及该命名空间内模块的成员都是无条件可用的。如果同时指定了命名空间和该命名空间的一个元素的名称,则只有该元素的成员无条件可用。

Visual Basic .NET不允许在模块级定义与导入别名时具有相同名称的成员。

下例导入了Microsoft.VisualBasic.Strings 类并给其分配一个别名StrN,可用来访问Right方法。

Imports StrN = Microsoft.VisualBasic.Strings

Sub ShowNET()

MsgBox(StrN.Right("https://www.doczj.com/doc/278843398.html,", 4)) ' 显示 ".NET "

End Sub

2.1.3 Main 过程

Main过程是应用程序的起始点,即运行代码时访问的第一个过程。Main是放置需要首先访问的代码的地方。在Main中,可以决定在程序启动时首先加载的窗体,确定系统上是否已在运行用户的应用程序副本,为应用程序建立一组变量,或者打开应用程序需要的数据库。

如果要在类中声明Main过程,必须使用Shared关键字。在模块中,Main不必是Shared。

有以下四种方法可以声明Main过程:

●Sub Main()

●Sub Main(ByVal CmdArgs()As String)

●Function Main()As Integer

●Function Main(ByVal CmdArgs()As String)As Integer

最简单的方法是声明一个不带参数或不返回值的Sub过程。例如:

Public Shared Sub Main()

Main 还可以返回一个Integer值,操作系统将其作为程序的退出代码。其他程序可以通过检查Windows ERRORLEVEL值来测试该代码。若要返回退出代码,必须将Main 声明为Function过程而不是Sub过程。例如:

第2章Visual Basic .NET高级程序设计基础

Public Shared Function Main()As Integer

MsgBox("Hello World!")

Return 0 ' 返0表示正常

End Function

Main还可以采用一个String数组作为参数。数组中的每个字符串均包含一个用于调用程序的命令行参数。可以根据它们的值采取不同的操作。若要获取命令行参数,以如下方式声明Main。

Public Shared Sub Main(ByVal CmdArgs()As String)

Dim ArgNum As Integer '命令行参数数组的索引下标变量

If CmdArgs.Length > 0 Then '是否有参数

For ArgNum = 0 To UBound(CmdArgs) '根据命令行的不同参数做不同的处理Next

End If

End Sub

2.2 Visual Basic .NET基本语句

Visual Basic中的语句是完整的指令,它可以包含关键字、运算符、变量、常数和表达式。每个语句属于下面两种类别之一。

●声明语句:这种语句命名变量、常数或过程,还可指定数据类型。

●可执行语句:这种语句启动操作。这些语句可以执行方法或函数,它们可以依次

通过或分支通过代码块。可执行语句包括赋值语句,这种语句将值或表达式赋予

变量或常数。

2.2.1 声明语句

使用声明语句可命名和定义过程、变量、数组和常数。[ ]声明的同时也定义了它们的范围,具体取决于放置声明的位置和用来声明它们的关键字。

下面的示例包含三个声明。

Public Sub ApplyFormat()

Const limit As Integer = 33

Dim myWidget As Widget

… '插入过程代码

End Sub

首先,Public Sub 语句(带有匹配的End Sub 语句)声明名为ApplyFormat 的过程。每当调用或运行ApplyFormat过程时,执行包含在Public Sub 和End Sub 语句中的所有语句。

接着,Const 语句声明常数limit,指定Integer 数据类型和初值33。

最后,Dim 语句声明变量myWidget。在此示例中数据类型是对象,即Widget对象。可以将变量声明为在使用的应用程序中公开的任何对象。Dim 语句是用于声明变量的一种语句类型。声明中使用的其他关键字有ReDim、Static、Public、Private、Protected

Visual Basic .NET 课程设计案例精编

和Friend。

声明语句保留创建变量所需的内存,但不显式创建它。

如果变量是对象变量,则声明它时可以使用New 关键字显式创建其类的实例。例如:

Dim x As New System.Windows.Forms.Form()

2.2.2 赋值语句

赋值语句执行赋值运算。简单的赋值运算包括将运算符右侧表达式的值赋予左侧的变量或对象的属性。运算符右侧可以是任何表达式(包括常量、变量、函数等)。

1. 语法格式

赋值语句的格式为:

﹤名称﹥ endow ﹤表达式﹥

2. 说明

●<名称>:变量或属性的名称。

●endow:赋值运算符如=、<<=、&=、+= 等。

●<表达式>:可以是算术、字符串、日期、关系或逻辑表达式。

3. 其他说明

先计算右边表达式的值,然后将其赋给左边的变量或对象的属性。例如:

Dim x As String

x = "Con" & "cat" & "enation" ' x="Concatenation"

使用Boolean 文本或Boolean 表达式作为右侧参数,还可以赋值给Boolean变量。例如:

Dim x As Boolean= Truex = 12 > 234 'x = Falsex

x = 45 > 678 Or 45 > 12 'x = True

运算符左侧的参数还可以是属性,如设置文本框的文本属性的值。

MyTextBox.Text = "This " & "is a " & "String"

MyTextBox.Text = "This is a String"

2.2.3 注释语句

注释语句可以对程序代码的属性、功能和使用方法等特征加以注释,以帮助程序员阅读和理解程序。

1. 语法格式

注释语句的格式为:

Rem<注释内容> 或 '<注释内容>

第2章Visual Basic .NET高级程序设计基础

2. 说明

可以将注释(Rem)语句单独放在一行,也可以将其放在另一语句后的行上。Rem 语句必须是该行上最后的语句。如果它跟在另一语句后面,则Rem与该语句间必须有一个空格。

一般都使用单引号“'”替代Rem。无论注释是跟在同一行上的另一语句后面,还是单独在一行上,都可以这样做。

源代码并非始终一目了然,即使对于编写它的程序员来说也是如此。因此,为了帮助说明其代码,大部分程序员大量使用嵌入的注释。代码中的注释可以为以后阅读或使用某过程或特定指令的任何人员解释该过程或指令。但是,Visual Basic在运行过程时忽略注释。

2.2.4 暂停语句

暂停(Stop)语句提供了一种以编程方式设置断点的替换方法。当调试器遇到Stop语句时,它将中断程序的执行而进入中断模式。

1. 语法格式

暂停语句的格式为:

Stop

2. 说明

程序停止执行,不释放程序占用的内存,进入中断模式。此时,可以检查各变量的值(将鼠标移至某变量上,系统将自动弹出窗口以显示变量的值)。可以将Stop语句放在过程的任何地方以中止执行,使用Stop 语句类似于在代码中设置断点。与End语句不同,它不关闭任何文件或清除任何变量,除非在已编译的可执行(.exe)文件中遇到。

在应用程序的发布版本中应删除所有的Stop 语句。

2.2.5 结束语句

结束(End)语句即立即终止执行,使其他程序所持有的对象引用无效。

1. 语法格式

结束语句的格式为:

End

2. 说明

End语句提供一种强迫程序停止的方法,可以放在过程的任何位置以结束代码执行,关闭用Open语句打开的文件,并且清除变量,释放内存。End 语句调用System 命名空间中的Environment类的Exit方法。System.Environment.Exit要求使用者具有SecurityPermissionFlag.UnmanagedCode 权限。如果使用者没有该权限,则会出现

Visual Basic .NET 课程设计案例精编

SecurityException 错误。

当执行时,End 语句清除模块级和类级的所有变量以及所有模块中的全部静态局部变量。当与其他关键字一起使用时,End 指示过程或块的定义的结尾。如:End Class、End Enum、End Function、End If、End Structure、End Sub、End Get、End Interface、End Module、End Namespace、End Property、End Select、End Set、End SyncLock、End Try、End While、End With。

除了前面介绍的这些语句之外,Visual Basic还有流控制语句及其他语句。

2.2.6 Debug.Print方法

Debug.Print方法可将字符串信息显示在输出窗口。用法如下。

Dim message As String

Debug.Print(message)

2.2.7 Console.Write方法

Console.Write方法将指定的数据写入标准输出流。用法如下。

Dim message As String

Console.Write(message)

或:

Dim format As String

Dim arg As Object

Console.Write(format, arg)

format参数由零或多个文本序列与零或多个索引占位符混合组成,其中索引占位符称为“格式项”,它们与此方法的参数列表中的对象相对应。格式设置过程将每个格式项替换为对应对象的值的文本表示形式。arg参数代表使用format 写入标准输出流的对象、对象数组及各种变量的文本表示形式。

2.2.8 Console.WriteLine方法

Console.WriteLine 方法与Console.Write方法一样,将指定的数据写入标准输出流,但Console.WriteLine 方法后要跟当前行结束符,即要换行。表 2.1给出了Console.WriteLine()方法重载列表。

表2.1 Console.WriteLine()方法重载列表

方法说明

Console.WriteLine() 将当前行结束符写入标准输出流

Console.WriteLine(Boolean) 将指定布尔值的文本表示形式写入标准输出流

Console.WriteLine(Char) 将指定的Unicode字符值写入标准输出流

Console.WriteLine(Char[]) 将指定的Unicode字符数组写入标准输出流

第2章Visual Basic .NET高级程序设计基础

续表方法说明

Console.WriteLine(Decimal) 将指定的Decimal值的文本表示形式写入标准输出流

Console.WriteLine(Double) 将指定的双精度浮点值的文本表示形式写入标准输出流Console.WriteLine(Int32) 将指定的32位有符号的整数值的文本表示形式写入标准输出流Console.WriteLine(Int64) 将指定的64位有符号的整数值的文本表示形式写入标准输出流Console.WriteLine(Object) 将指定对象的文本表示形式写入标准输出流

Console.WriteLine(Single) 将指定的单精度浮点值的文本表示形式写入标准输出流Console.WriteLine(String) 将指定的字符串值写入标准输出流

Console.WriteLine(UInt32) 将指定的32位无符号的整数值的文本表示形式写入标准输出流Console.WriteLine(UInt64) 将指定的64位无符号的整数值的文本表示形式写入标准输出流Console.WriteLine(String, Object) 使用指定的格式信息,将指定对象的文本表示形式写入标准输出流

Console.WriteLine(String, Object[]) 使用指定的格式信息,将指定对象数组的文本表示形式写入标准输出流

Console.WriteLine(Char[], Int32) 将指定的Unicode字符子数组写入标准输出流

Console.WriteLine(String, Object, Object) 使用指定的格式信息,将指定对象的文本表示形式写入标准输出流Console.WriteLine(String, Object, object,

object)

使用指定的格式信息,将指定对象的文本表示形式写入标准输出流

Console.WriteLine(String, Object, object, object) 使用指定的格式信息,将指定的对象和可变长度参数列表的文本表示形式写入标准输出流

以下为Console.WriteLine方法的用法示例。

Private Sub Button1_Click()

Static X, Y As Integer

Y=1

Y=Y + 5

X=5 + X

Console.WriteLine("X={0};Y= {1}",X,Y)

End Sub

2.2.9 语句的书写规则

Visual Basic .NET中代码语句的书写规则比较灵活,读者可根据实际情况对下列两种规则进行选用,以保证代码的格式整齐,便于开发和阅读。

1. 一行中有多条语句

在一行中可以有多条语句,语句之间用冒号字符“:”分隔。例如:

Dim MyString As String = "Hello World" : MsgBox(MyString)

虽然这种形式的语法偶尔带来方便,但是它使代码难以阅读和维护。因此,建议读者保持一行一条语句。

Visual Basic .NET 课程设计案例精编

2. 跨多行继续一条语句

通常一行容纳一条语句,但当一行中容纳不下时,可以使用行继续符以便在下一行继续一条长语句。行继续符由一个空格及一个下划线字符“_”组成。在下面的示例中,MsgBox 可执行语句连续跨两行。

Public Sub DemoBox() 'This procedure displays a message.

Dim myVar As String

myVar = "John"

MsgBox("Hello " & myVar & _

". How are you?")

End Sub

2.2.10 检查编译错误

输入一行代码后,如果该行显示有蓝色波浪下划线(也可能显示错误信息),则该语句中有语法错误。必须找出语句中有什么错误(例如通过查找任务列表,或将鼠标指针悬停在错误代码处以显示帮助文本),然后改正它。在修复代码中的所有语法错误之前,程序无法正确地进行编译。

2.3 Visual Basic .NET程序流程控制

2.3.1 选择结构程序设计

选择结构可使程序在不同的条件下选择执行不同的程序段。

1. 单行结构条件语句

单行结构条件语句是指简单的行If语句。

1) 格式

If<条件>Then <语句体1> [Else<语句体2>]

2) 说明

●<条件>是一个逻辑表达式,或表达式的数据类型是某种可隐式转换为Boolean

的数据类型。程序根据这个表达式的值(True或False)执行相应的操作。

●若<条件>为真,则执行<语句体1>。否则若存在Else子句,则执行<语句体2>。

●<语句体1>和<语句体2>可以是一个语句,也可以是用冒号分割的多个语句。

●单行结构If语句一般不提倡编写得太复杂。

●[Else<语句体2>]子句省略时,If语句简化为如下形式。

If<条件>Then <语句1>

例如:

If https://www.doczj.com/doc/278843398.html,puter.Clock.LocalTime.DayOfWeek = DayOfWeek.Saturday Or _

https://www.doczj.com/doc/278843398.html,puter.Clock.LocalTime.DayOfWeek = DayOfWeek.Sunday Then _

MsgBox("Happy Weekend!")

第2章Visual Basic .NET高级程序设计基础

如果当天是星期六或星期日,则会显示一个消息框,提示“Happy Weekend!”。

如果语句改为如下形式。

If https://www.doczj.com/doc/278843398.html,puter.Clock.LocalTime.DayOfWeek = DayOfWeek.Saturday Or _

https://www.doczj.com/doc/278843398.html,puter.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逻辑运算符计算所需的尽可能多的逻辑条件。

2. 块结构条件语句

与单行结构条件语句相比,块结构条件语句有很多优点。例如,块形式比单行形式提供了更好的结构和灵活性,它允许条件分支跨越数行。同时,用块形式可以测试更复杂的条件。块形式使程序的结构按逻辑来引导,而不是把多个语句放在一行中。此外,使用块形式的程序一般容易阅读、维护和调试。任何单行形式的条件语句都可以改写成块形式。

1) 格式

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 <条件1>Then

<语句体1>

[Else

<语句体n>]

End If

对上述语句,若<条件1>为真,则执行<语句体1>,块If语句结束。否则执行Else 子句。若省略Else子句,块结构条件语句简化为如下形式。

If <条件>Then

<语句体1>

Visual Basic .NET 课程设计案例精编

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

3. IIf函数

对于简单的行If语句,可以用更简单的IIf函数代替。

1) 格式

IIf(<条件表达式>,<真部分>,<假部分>)

2) 说明

当<条件表达式>的值为真,函数返回<真部分>的值,否则返回<假部分>的值。<真部

第2章Visual Basic .NET高级程序设计基础

分>及<假部分>可以是表达式、变量或其他函数。

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. 多分支结构

在Visual Basic中,多分支结构程序通过Select Case语句来实现。该语句以Select Case开头,以End Select结束。其功能是,根据<测试条件>表达式的值,从多个Case子句中选择符合条件的一个子句执行。

1) 格式

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子句中的<表达式表>形式如表 2.2

Visual Basic .NET 课程设计案例精编

所示。

表2.2 Case 子句中的表达式形式

形 式

示 例 说 明

表达式

Case x*10.12.14 数值表达式或字符串表达式

表达式To 表达式 Case 1 To 100 用来指定一个值范围,较小的值要出现在To 之前 Is 关系运算表达式

Case Is<800

可以配合比较运算符来指定一个数值范围

下例说明如何使用行If 语句。 输入x ,计算y 的值,其中:

1(0)12(0)x x y x x +?=?

-

该题是数学中的一个分段函数,它表示当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) 在【名称】文本框中输入例题,单击【确定】按钮。 (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

程序在默认输入下的运行结果,如图2.1所示。

图2.1 输入对话框与运行结果显示对话框

下面举例说明嵌套If 语句使用情况。 设有如下函数:

第2章 Visual Basic .NET 高级程序设计基础

10(0)0(0)10(0)x y x x >??

==??-

输入x ,要求输出y 的值。

在 Form1_Load 事件处理程序中,输入如下代码。

Private Sub Form1_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,最多不超过20,第一个字符不允许是数字或下划线。最后输出符合条件的字符串长度,不符合条件时给出相关的提示信息。

在 Form1_Load 事件处理程序中,输入如下代码。

Private Sub Form1_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”。

Visual Basic .NET 课程设计案例精编

若程序运行后,输入字符串为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求得。如果是字符之间的比较,可以直接进行,就像本例题一样。

在Form1窗体上加入名为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

2.3.2 循环结构程序设计

1. For...Next循环

For…Next循环将一组语句重复执行指定的次数。

1) 格式

For<循环变量>=<初值>To<终值>[Step<步长>]

[语句体1]

[Exit For]

[语句体2]

Next[<循环变量>]

2) 说明

●<初值>、<终值>、<步长>是数值型表达式,既可以是整数也可以是浮点数。

●<循环变量>为循环计数变量。省略“Step<步长>”时,<步长>为1。

●For...Next循环执行时,先将初值赋给循环变量,判断是否超过终值;若未超过

则执行循环体,遇到Next语句后,循环变量增加一个步长,再判断是否超过终

值;若未超过则继续执行循环体;如此重复直到循环变量超过终值,退出循环。

●Next 后面的循环变量可以省略。

●<步长>可为正数或负数,若为负数,则必须循环变量小于终值时才退出循环。

●Exit For的作用是退出循环。

●For循环结构是先判断后执行,常用于已知次数的循环。循环次数可用下面公式

第2章Visual Basic .NET高级程序设计基础

计算。

循环次数= Int((终值-初值)/步长+ 1)

2. While循环控制结构

1) 格式

While﹤条件﹥

[语句体]

end

2) 说明

<条件>是一个逻辑表达式。<条件>为“真”,执行[语句体];否则,循环结束。

3. Do循环控制结构

Do循环分为前测型Do…Loop循环和后测型Do…Loop循环。

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循环的语句与前测型Do…Loop语句类似,区别在于前测型先进行条件判断,再执行循环体,即有可能循环体一次也不执行。而后测型是先执行循环体,再进行条件判断,即循环体至少执行一次。

在以上的循环控制结构中,For循环是固定次数的循环,其他循环都是不确定次数的循环,都需要在循环体中修改循环条件,以避免出现“死”循环。

4. 多重循环

多重循环是指嵌套使用Visual Basia .NET的循环控制结构。在嵌套循环中,外层循环必须完全包含内层的循环,不允许出现跨越交叉形式。原则上,多层循环中各层不能使用

Visual Basic .NET 课程设计案例精编

相同的循环变量。

5. 举例

【例2.1】求1~100的自然数累加和,如图2.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

【例2.2】输入一个不超过12的自然数,求从1到该自然数的阶乘和,如图 2.3所示。

图2.2 计算1~100的累加和

图2.3 计算阶乘和

设计步骤如下。

(1) 建立应用程序用户界面与设置对象属性。建立2个Label 、1个TextBox 、1个Button 控件,令Label1.Text =“请输入一个不超过12的自然数”。

(2) 编写程序代码如下。

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

第2章Visual Basic .NET高级程序设计基础【例2.3】输入一个小于6000的整数,计算从1到该整数的累加和,如图2.4所示。

图2.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

Visual Basic .NET 课程设计案例精编

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

【例2.4】输入两个自然数,计算出它们之间所有的素数,如图2.5所示。

设计步骤如下。

(1) 建立应用程序用户界面与设置对象属性。建立3个Label控件、3个TextBox控件、1个Button控件,一个框架。

(2) 根据素数计算算法(求自然数n是否是素数只要依次用2作除数去除n,若n不能被其中任何一个数整除,则n即为素数)写出程序。

图2.5 计算两自然数之间的所有素数

(3) 编写程序代码如下。

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs)Handles Button1.Click

Dim n, m, x, i, Mark 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(System.Math.Sqrt(x))

'Int()将括号里的平方根转换成整数

If x Mod i = 0 Then

'x被i除尽时, x为非素数

Mark = 1

第2章Visual Basic .NET高级程序设计基础

Exit For

End If

Next

If Mark = 0 Then s = s & Str(x)& " "

Next

TextBox3.Text = s

End Sub

2.4 过程

2.4.1 过程的基本概念

“过程”是包含在过程声明语句和过程结束语句之间的Visual Basic .NET 语句块。所有的Visual Basic .NET 语句代码都是在过程内部编写的。

过程从代码中的其他某处被调用。当过程执行结束时,它将控制返回给调用它的代码,此代码称为“呼叫代码”。呼叫代码是一个语句或语句内的表达式,它通过名称指定过程并将控制转让给它。

1. 过程的种类

在Visual Basic中,除了系统提供的内部函数过程和事件过程外,用户可自定义下列4种过程。

●Sub保留字开始的为子过程,不返回值。

●Function保留字开始的为函数过程,返回一函数值给呼叫代码。

●Property保留字开始的为属性过程,返回和分配对象或模块上的属性值。

●Event保留字开始的为响应由用户操作或程序中的事件触发而执行的Sub

过程。

2. 过程的特点

用过程构造代码具有以下特点。

●应用程序中的每行代码都必须在某个过程的内部,如果将大过程细分为更小的过

程,应用程序的可读性将更强。

●过程对执行重复或共享的任务很有用。可以在代码中的许多不同位置调用过程,

因此可以将过程用做应用程序的生成块。

●过程允许将程序分为不连续的逻辑单元。调试单独的单元与调试不包含过程的整

个程序相比要容易。

●只需少量修改甚至不需修改就可以在程序中使用为其他程序开发的过程。

2.4.2 Sub过程

1. 事件过程与通用过程

Visual Basic .NET的Sub过程分为事件过程和通用过程两大类。事件是可被某对象识

相关主题
文本预览
相关文档 最新文档