CHAPTER 第3 章 Visual Basic 语言的基本结构 Visual Basic 是面向对象的程序设计语言,同时支持结构化程序设计,而且面向对象仍 然需要以结构化的程序设计为基础,实现各种算法,解决具体问题。 本章介绍Visual Basic 语言的基本结构,输入和输出通过控件展示。 3.1 基本控制结构 结构化设计方法程序结构清晰,易读性强,也易于查错和排错。 结构化程序有3 种基本控制结构:顺序结构、分支结构和循环结构。这3 种基本结构 都具有单入口、单出口的特点,各种复杂的程序就是由若干个这3 种基本结构组成的。结 构化程序可以使用流程图表示。 3.1.1 顺序结构 顺序结构就是整个程序按书写顺序依次自上而 下执行。前面两章设计和编写的程序都是顺序结构。 顺序结构如图3-1 所示,先执行A,再执行B, 即自上而下依次运行。图 3-1(a)为框式流程图, 图3-1(b)为N-S 流程图,又称为盒图。 3.1.2 分支结构图3-1 顺序结构 分支结构用于判断并分支,又称为选择结构。如图3-2 所示,根据判断的结果决定程 序的流向。 如图3-2 所示,E 代表条件,当E 成立(True )时执行A,否则(False)执行B,两 条分支汇合在一起为一个出口。 分支结构有几种形式:If…Then…Else 结构、Select Case 结构和IIf 函数。 1.If…Then…Else 结构 If…Then…Else 结构表示“如果……就……否则……”。 42 Visual Basic 教程(第4 版) 图3-2 分支结构 语法: If 条件Then 语句 或者 If 条件1 Then 语句块 1 [ElseIf 条件2 Then 语句块2] … … [Else 语句块n] End If 说明: . 条件可以为各种表达式,都要转换为Boolean 型,即所有非零的数值、字符等都要 转换为True ,而0、"0" 值则转换为False 。 . 当If…Then…Else 结构只有单独的If 语句时,可以没有End If 语句;否则If 语句 和End If 语句必须成对出现。 . 首先测试条件1,如果为False,就测试条件2,以此类推,直至找到一个为True 的 条件就执行Then 后面的语句块。如果条件都不是True,则执行Else 后面的语句块。 . 当只有一个条件而且执行的是单个语句时,If…Then…Else 结构可以简化成If… Then 语句。 【例3-1 】使用If…Then 语句查询学生的成绩,大于或等于60 分的为及格,其余为不 及格。 界面设计:在窗体界面中创建2 个文本框(Text1 、Text2)、2 个标签(Label1 、Label2) 和1 个按钮(Command1)。在文本框Text1 中输入分数,单击按钮Command1 在文本框Text2 中显示成绩。 运行界面如图3-3(a)所示,流程图如图3-3(b)所示 。 程序代码 : Private Sub Command1_Click( ) '单击按钮显示成 绩 第3 章 Visual Basic 语言的基本结构 43 Dim x As Single Dim y As String x = Val(Text1.Text) y=" 不及格" If x >= 60 Theny = " 及格" Text2.Text = y End Sub 图3-3 成绩查询 程序分析:使用If…Then 语句,当满足条件x>=60, 就执行Then 后面的语句y = "及格",否则执行If…Then 语句后面的语句。 【例3-2】使用 If…Then…Else 结构查询学生的成 绩,大于或等于60 分的为及格,其余为不及格。 界面设计和功能要求与例3-1 相同,程序流程图如 图3-4 所示。 程序代码 : Private Sub Command1_Click() '单击按钮显示成 绩 Dim x As Single Dim y As String x = Val(Text1.Text) If x >= 60Then y=" 及格 " Else y=" 不及格 " End If Text2.Text = y End Sub 【例3-3 】使用多个条件的If…Then…Else 结构查询学生的成绩,将成绩分成优、良、 中、及格和不及格,90~100 为优,80~90 为良,70~80 为中,60~70 为及格,60 以下 图3-4 流程图 44 Visual Basic 教程(第4 版) 为不及格。 界面设计与例3-1 相同,运行界面如图3-5(a)所示,流程图如图3-5(b)所示。 图3-5 成绩查询 程序代码: Private Sub Command1_Click() '单击按钮显示成 绩 Dim x As Single Dim y As String x = Val(Text1.Text) If x >= 90Then y=" 优 " ElseIf x >= 80 Then y=" 良 " ElseIf x >= 70 Then y=" 中 " ElseIf x >= 60 Then y=" 及格 " Else y=" 不及格 " End If Text2.Text = y End Sub 程序分析:使用有多个条件的If…Then…Else 结构,判断的顺序是x>=90→x>=80→ x>=70→x>=60→x<60。 2.Select Case 结构 Select Case 结构与If…Then…Else 结构类似,但对多条件选择时,有时用Select Case 语句代码效率更高,更易读。 第3 章 Visual Basic 语言的基本结构 45 语法: Select Case 变量 | 表达式 Case 值1 语句块1 [Case 值2 语句块2] # [Case Else 语句块n] End Select 说明: . 变量或表达式是用来测试的条件。 . Select Case 只计算一次变量或表达式的值,然后与每个Case 的值1、值2 等进行比 较:如果相等,则执行该Case 后对应的语句块;如果没有相匹配的值,则执行Case Else 中的语句块。流程图如图3-6 所示。 图3-6 流程图 . 值1、值2……可以取以下几种形式。 . 具体常数,如1、2、"A"等。 . 连续的数据范围,如1 To 100 、A To Z 等。 . 满足某个条件的表达式,如I >0 等。 . 也可以是几种不同形式的组合,用逗号(,)将它们分隔开,如–10 、1 To 100 。 . Select 和End Select 必须成对出现。 【例3-4 】使用Select Case 结构实现学生成绩的查询,将成绩分成优、良、中、及格 和不及格,90~100 分为优,80~90 分为良,70~80 分为中,60~70 分为及格,60 分以 下为不及格。 界面设计和功能要求与例3-3 相同。 46 Visual Basic 教程(第4 版) 程序代码: Private Sub Command1_Click( ) '单击按钮显示成 绩 Dim x As Single Dim y As String x = Int(Text1.Text) Select Case x Case 90 To 100 y=" 优 " Case 80 To 89 y=" 良 " Case 70 To 79 y=" 中 " Case 60 To 69 y=" 及格 " Case Else y=" 不及格 " End Select Text2.Text = y End Sub 程序分析: . x = Int(Text1.Text) 用来将分数取整,因为分数可能是小数。 . Case 90 To 100 后面的值使用连续的范围表示90~100。 3.IIf( ) 函数 当If…Then…Else 结构只有一个条件时,还可以使用IIf( ) 函数实现。IIf( )函数语句可 以说是If…Then…Else 结构的简写版本。 语法: IIf(条件,真部分,假部分) 说明: . IIf( )函数的步骤是先判断条件,当条件为True 时执行真部分,否则执行假部分。 . 真部分和假部分是IIf( )函数的返回值,它们可以是任何表达式,但只能返回其中 一个。 在例3-2 中,当分数≥60 时为及格,否则为不及格的关系可以用IIf( ) 函数表示为 y = IIf( x >= 60," 及格"," 不及格") 程序分析: . IIf( )函数有返回值,返回值是“及格”与“不及格”中的一个,若x≥60,则返回 “及格”,否则返回“不及格”。 . 返回值赋值给变量y 。 例如,下面都是使用IIf( )函数的语句 : 第3 章 Visual Basic 语言的基本结构 47 y=IIf(x>=0,1,0) '当x>=0,y=1 ,否则y=0 y=IIf(Hour(Now) > 12, "PM", "AM") '当小时>12,y="PM" ,否则y= "AM" 4.嵌套 嵌套是指把一个结构嵌入另一个结构内。例如,可 以在 If 结构中嵌套 If 结构或Select Case 结构等,在VB 中控制结构的嵌套层数没有限制。 嵌套必须是一个完整的控制结构全部嵌入另一个结 构中,即If 和End If 、Select Case 和End Select 对都可 以嵌入,但不能有交叉,因此在读程序时,与If 或Select Case 匹配的是最近的End If 或End Select 。 图3-7 所示为3 层If 嵌套的结构,If 与最近的End If 匹配成对,而且,书写时应养成每层缩进的习惯,这样 便于程序的阅读。 【例3-5 】求方程ax2 + bx + c = 0 的解。 求方程的解公式如下: 图3-7 嵌套 bb2 .4 . ± ac x1,2 = 2a 方程的根有以下几种可能: . a = 0,无解。 . b2 – 4ac = 0 ,有两个相等的实根。 . b2 – 4ac > 0 ,有两个不等的实根。 . b2 – 4ac < 0 ,有两个复根。 界面设计:界面由5 个文本框(Text1~Text5)、5 个标签(Label1~Label5)和1 个按 钮(Command1 )组成,界面控件属性见表3-1。流程图如图3-8(a)所示,运行界面如 图 3-8(b)所示。 图3-8 计算方程的根 48 Visual Basic 教程(第4 版) 表3-1 界面控件属性表 对象控件名属性名属性值 Form Form1 Caption 计算方程根 Label Label1Label2Label3Label4Label5 Caption Caption Caption Caption Caption a = b = c = x1 = x2 = TextBox Text1 Text2 Text3 Text4 Text5 Text Text Text Text Text 空 空 空 空 空 CommandButton Command1 Caption 计算 功能要求:在文本框Text1~Text3 中输入a、b、c 的值,单击按钮Command1 ,计算 方程的根并将运行结果显示在文本框Text4 和Text5 中。 程序代码 : Private Sub Command1_Click( ) Dim a As Single, b As Single, c As Single Dim Disc As Single, x1 As Single, x2 As Single Dim RPart As Single, IPart As Single a = Val(Text1.Text) '取数据 a b = Val(Text2.Text) '取数据 b c = Val(Text3.Text) '取数据 c If Abs(a) <= 0.000001 Then '当a=0 时 Text4.Text = " 无解 " Text5.Text = " 无解 " Else Disc = b * b – 4 * a * c RPart = –b / (2 * a) If Abs(Disc) <= 0.000001 Then '当Disc=0 时 Text4.Text = RPart Text5.Text = RPart ElseIf Disc > 0.000001 Then '当Disc>0 时 x1 = (– b + Sqr(Disc)) / (2 * a) x2 = (– b – Sqr(Disc)) / (2 * a) Text4.Text = x1 Text5.Text = x2 Else '当Disc<0 时 IPart = Sqr(–Disc) / (2 * a) Text4.Text = RPart & "+" & IPart & "i" Text5.Text = RPart & "–" & IPart & "i" 第3 章 Visual Basic 语言的基本结构 49 End If End If End Sub 程序分析 : . 此程序为双重If 结构嵌套。 . 判断b2 – 4ac 是否等于0 时,要注意一个问题,由于变量Disc(即b2 – 4ac)是实 数型,而实数在计算和存储时会有一些微小的误差,因此不能直接用如下语句判断 “If Disc = 0 Then…”,因为这样会出现本来是0 的量由于上述误差而被判别为不等 于0,导致结果出错。通常采用的办法是判别Disc 的绝对值(Abs(Disc))是否小 于一个很小的数(0.000001),如果小于此数,则认为Disc = 0 。 . 当计算的根为两个复数时,将实部和虚部用&组合成字符串显示在文本框中。 3.1.3 循环结构 循环结构是用于执行重复操作的结构。在程序中如果遇到需要反复多次处理的问题, 就可以使用循环实现。VB 提供了多种不同风格的循环结构语句,包括Do…Loop、For… Next、While…Wend 和For Each…Next 等。下面主要介绍Do…Loop 和For…Next 结构。 1.Do…Loop 结构 Do 循环有两种形式,即“当型”循环(While 结构)和“直到型”(Do While 结构) 循环。“当型”循环结构的程序流程图如图3-9(a)所示,“直到型”循环结构的程序流程 图如图3-9(b)所示。 图3-9 Do 循环流程 “当型”循环的语法: Do While|Until 条 件 语句 块 [Exit Do] [语句块] Loop 50 Visual Basic 教程(第4 版) 说明: . 条件可以是任意的条件表达式,为循环条件。 .“当型”循环首先测试条件,如果条件为True ,则执行语句块,然后循环执行测试 条件;如果条件为False ,则跳过所有语句到循环体外。 “直到型”循环的语法: Do 语句块 [Exit Do] [语句块 ] Loop While|Until 条 件 说明: . “直到型”循环与“当型”循环所不同的是先执行语句块,然后测试条件,只要条 件为True 就执行循环语句块;如果条件为False ,则跳过循环体。 . 这种“直到型”循环保证语句块至少被执行一次。 注意:在Do…Loop 结构中Until 和While 不同,判断条件正好相反。Until 结构是只 要条件为False(而不是True),就执行循环的语句块,否则跳出循环体。 【例3-6 】用“当型”循环计算1~100 的和。 界面设计:在窗体界面中放置一个文本框(Text1)、一个标签(Label1)和一个按钮 (Command1),单击按钮Command1 开始计算1~100 的和。运行界面如图3-10(a)所示, 流程图如图3-10(b)所示。 图3-10 计算1~100 的和 程序代码: Private Sub Command1_Click() '单击按钮开始计算 Dim i As Integer, Sum As Integer Sum=0: i= 1 Do While i <= 100 Sum= Sum+ i i=i+ 1 51 第3 章 Visual Basic 语言的基本结构 Loop Text1.Text = Sum End Sub 【例3-7 】用“直到型”循环While 计算1~100 的和 。 界面设计与图3-10(a)相同,流程图如图3-11 所示 。 程序代码: Private Sub Command1_Click() '单击按钮开始计 算 Dim i As Integer, Sum As Integer Sum=0: i= 1 Do Sum= Sum+i i=i+ 1 Loop While i <= 100 Text1.Text = Sum End Sub 如果将循环体外设置的初始值语句i = 1 改为i = 101,则两种不同的Do…Loop 结构结 果就不同了: 例3-6 判断条件后直接跳出循环,Sum 的结果是0。 例3-7 进入循环体一次后判断条件跳出循环,Sum 的结果是101。 2.For…Next 结构 如果已经知道了循环的次数,使用For…Next 循环比使用Do…Loop 循环更方便。 语法: For 计数器=初始值 To 终止值 [Step 步长 ] 语句 块 [Exit For] Next [计数器 ] For…Next 循环的步骤如下: (1)设置计数器等于初始值。 (2)如果步长为正值,则判断计数器是否大于终止值, 如果大于终止值,则跳出循环;如果步长为负数,则判断计 数器是否小于终止值。 (3)执行语句块。 (4)计数器=计数器±步长。 (5)循环执行步骤(2)~(5) 。 For…Next 循环步长为正值的程序流程图如图3-12 所示 。 说明: . 如果Step 省略,则步长默认值为1。步长可正可负:如果步长为正,则初始值必须 小于或等于终止值,否则不能执行循环内的语句;如果步长为负,则初始值必须大 图3-11 流程图 图3-12 For…Next 流程图 52 Visual Basic 教教程(第4 版) 于或等等于终止值,否否则不能执行循循环内的语句。 . For 循环环需要使用一个个计数器,每每循环一次,计计数器变量的值值就会增加或者者减少。 【例3-8 】用For…Nextt 循环结构计算算1~100 的和,步长为1 。 程序代码: : Private Sub '单击按钮开 Dim i A Sum = For i = Su Next i Text1.T End Sub Command1_Clic 开始计算 As Integer, Sum A 0 1 To 100 um = Sum + i Text = Sum k() As Integer '步长默认值为11 【例3-9 】用For…Nextt 循环结构计算算1~100 的和,步长为–1。 程序代码: : Private Sub '单击按钮开 Dim i A Sum = For i = Su Next i Text1.T End Sub Command1_Clic 开始计算 As Integer, Sum A 0 100 To 1 Step – 1 um = Sum + i Text = Sum k() As Integer 1 '步长值为–1 3.退出循循环结构 用Exit 语句句可以直接退出For…Next 循循环和Do…Loop 循环。Exit For 为退出Foor…Next 循循环,Exit Do 为退出Do…LLoop 循环。 程序执行时时遇到Exit 语语句,就不再执执行循环 结结构中的任何语语句,立即跳出循环,跳转转到循环 结结构的下一句执执行。Exit 语句句几乎总是出现在循 环环体内嵌套的If 语句或 Seleect Case 语句中中。 注意:当运运行程序进入死死循环时,按Cttrl+Break 组组合键可以终止止程序的运行。。 【例3-10 】】用 For…Next 循环结构构计算 11~100 的和,当当和大于或等于于3000 时终止止循环。 运运行界面如图3-13 所示。图3-133 运行界面 程序代码: : Private Sub '单击按钮开 Command1_Clic 开始计算 k() 第3 章 Visual Basic 语言的基本结构 53 Dim i A Sum = For i = Su If Next i Text1.T End Sub As Integer, Sum A 0 1 To 100 um = Sum + i Sum >= 3000 Th Text = Sum As Integer hen Exit For 4. 嵌套 各种循环结结构中都可以嵌套其他的循循环结构,也可可以嵌套分支结结构。各种结构构在嵌套 时时必须是完整、、成对地嵌入,不能交叉。 【例3-11 】计算九九乘乘法表。 创建一个空空白的窗体,在在单击窗体时计计算并显示九九九乘法表。运行行界面如图3-114 所示, 双双重循环流程图图如图3-15 所所示。 图3-14 运行界 面 图3-15 双重循环流程程图 程序代码: : Private Sub '单击窗体显 Dim i A For i = Fo Ne Next i End Sub Form_Click() 显示乘法表 As Integer, j As In 1 To 9 or j = 1 To i Print Tab((j – ext j nteger 1) * 10 + 1); i & ""×" & j & "=" & ii * j; 程序分析: : . 由于九九九乘法表有99 行,每行有不不同的列,因此此必须使用双重重循环实现。外外循环为 九九乘乘法表的行循环环,内循环为每每行的列循环。 . 内循环环的次数每次都都不同,为1~~i。 54 Visual Basic 教程(第4 版) . 使用Print 语句在窗体上显示,使用Tab 格式每列间隔10 个字符。 3.2 数组 编程时,当需要大量的数据类型都相同的数据时,就需要使用数组。 3.2.1 声明数组 1.数组的概念 1)数组 数组是同类变量的一个有序集合。数组名的命名规则与变量相同,但数组名代表的是 一组变量,而不是一个变量。 2)数组元素 数组中的元素称为数组元素,数组元素具有相同的名字和数据类型,通常通过下标识别 它们。 数组元素的表示: 数组名(下标1[, 下标2,…]) 说明: . 下标表示数组元素在数组中的位置。 . 下标1 为一维数组下标,下标2 为二维数组下标……VB 规定的数组维数不超过60。 数组的运算是对数组中的元素进行运算,所有可以使用变量的地方都可以使用数组, 数组元素可以进行赋值、运算等操作。 2. 声明数组 在使用数组前必须声明数组,指明数组的数据类型和每一维的上下界。 语法: [Private|Public|Dim] 数组名(第一维的上下界,…)As 数据类型 说明: . 数组元素每一维的上下界表示为“上界To 下界”,上下界不得超过Long 数据类型 的范围,省略下界时取值为0,下界≤上界,当上下界为小数时,会自动四舍五入。 . 数组元素的个数为(第一维的上界–下界+1)*(第二维的上界–下界+1)*… … . 数组中的所有元素都具有相同的数据类型。但当数据类型为Variant 型时,各元素 能够包含不同类型的数据,如数值型、字符串型等 。 例如,下面都是声明数组的语句 : Dim a(14) As Integer '从a(0)到a(14) 共15 个元 素 Dim a(1 To 15) As Integer '从a(1)到a(15) 共15 个元 素 Dim a(–1 To 5) As Integer '从a(–1)到a(5) 共7 个元 素 第3 章 Visual Basic 语言的基本结构 55 Dim a(–1.5 T Dim b(2,3) A Dim b(2,–1 To 5) As Integer As Integer To 3) As Integer '从a(– '从b( '从b( –2)到a(5) 共8 个 (0,0)到b(2,3) 共3* (0,–1)到b(2,3) 共3 个元素 *4(即12)个元素 3*5(即15)个元 素 元素 程序分析: : . 数组a((14) 的下界省略略,表示从a(00)开始。 . 数组的的上下界可以是是正数或负数,也可以是小数数。 3.Optionn Base 语句 当声明数组组时下界省略,则表示从0 开始,如果用用户希望数组下下标从1 开始,就可以 使使用Option Baase 语句声明数数组下标的默认认下界。 语法: Option Ba se 0 | 1 说明: . Option Base 语句必须在代码编辑辑器窗口的“通通用”部分声明明,表示本模块块的所有 数组的的默认下界。 . 可以声声明数组的默认认下界为0 或11 。 例如,在模模块中使用Opption Base 语句句 : Option Base Private Sub Dim a( Dim b( Dim c(2 End Sub .. e 1 Command1_Clic 5) As Integer –1 to 5) As Intege 2, 3) As Integer k() er '将数组的下标默 '从a(1)到a(5) 共 '从b(–1) 到b(5) 共 '从c(1,1) 到c(2,3 默认设为1 5个元素 共7个元素 3)共2*3(即6)个个元素 一个模块中中只能出现一次Option Basee 语句,而且必必须位于本模块块的“通用”部分。 3.2.2 数数组的操作作 声明数组后后就可以对数组进行赋值、引用和运算。对数组的操作作就是对数组中中的元素 进进行操作。 1. 数组元元素的赋值 由于数组由一组有序的元素组成,因此赋值时有3 种方法:用赋赋值语句对每个个元素赋 值值;通过循环赋赋值和使用Arrray 函数赋值。 1)用赋值值语句对每个元元素赋值 用赋值语句句对每个元素素赋值,就是用用赋值语句对 数数组中的每个元元素分别赋值。 【例3-12 】对数组a(5) 的6 个元素分分别赋值为1、 22、3、4、5、6,并用Print 语句句显示,运行界界面如图 3-16 所所示 。 图3-16 运行界面 56 Visual Basic 教程(第4 版) 单击按钮Command1 时运行程序: Private Sub Command1_Click() Dim a(5) As Integer a(0) = 1 a(1) = 2 a(2) = 3 a(3) = 4 a(4) = 5 a(5) = 6 Print a(0); a(1); a(2); a(3); a(4); a(5) End Sub 2)通过循环赋值 当数组的元素个数较多时,单独对每个元素赋值工作量很大,此时可以使用循环结构 进行赋值。由于数组的元素个数是已知的,因此经常使用For…Next 结构赋值。 【例3-13 】使用循环结构对a(5) 的6 个元素分别赋值为1、2、3、4、5、6,并用Print 语句显示。 Private Sub Command1_Click() Dim a(5) As Integer Dim i As Integer Fori=0To5 '使用循环赋值 a(i)= i + 1 Next i Fori=0To5 '使用循环显示 Print a(i); Next i End Sub 3)使用Array 函数赋值 使用Array 函数可以把数据集一次赋值给一个Variant 型一维数组变量。 语法: 变量名=Array( 数据列表) 说明: . 变量名只能是Variant 型。 . 数据列表是用逗号分隔的一系列数据。如果不提供数据列表,则创建一个长度为 0 的数组。 . 数组的下界默认为0,使用Option Base 语句指定下界也可以。 . 数组的上界由数据列表的元素个数决定。 【例3-14 】使用Array 函数对数组a(5) 的6 个元素分别赋值为1、2、3、4、5、6,并 用Print 语句显示。 第3 章 Visual Basic 语言的基本结构 57 程序代码: Private Sub Command1_Click( ) Dim a a = Array(1, 2, 3, 4, 5, 6) For i=0To5 Print a(i) ; Next i End Sub 程序分析 : . 声明变量a 时,不说明数组的上下界。 . Dim a 语句表示a 为Variant 型变量。 . 数组a 用Array 函数赋值后,上界为5,下界为0。 2.数组函数 1)LBound 和UBound 函数 LBound 函数用于指定数组某维可用的最小下标(下界),UBound 函数则用于指定数 组某维可用的最大下标(上界)。LBound 函数与UBound 函数一起使用,可以确定一个数 组的大小。 语法: UBound(数组名[, 维] ) LBound (数组名[, 维] ) 说明:维是指定某一维,省略时为1,表示第一维,2 表示第二维,以此类推。 例如,返回数组的上下界: Dim a(1 To 10, 5 To 15) As Integer Dim L As Integer, U As Integer L = LBound(a, 1) '返回 1 U = UBound(a, 2) '返回15 2)IsArray 函 数 IsArray 函数用来判断是否为数组 。 语法: IsArray(变量名) 说明:变量如果是数组,则返回True ,否则返回False 。 例如,使用IsArray 函数判断变量是否为数组 : Dim a a = 1 Print IsArray(a) a = Array(1, 2, 3, 4, 5) Print IsArray(a) 58 Visual Basic 教程(第4 版) 程序分析:当变量a=1 时,IsArray(a) 为False;用Array 函数对a 赋值后,IsArray(a) 为True 。 3.For Each…Next 语句 For Each…Next 语句类似于循环结构For…Next ,都是重复执行语句块,直到循环结 束。但For Each…Next 语句是专门针对数组或对象集合而设置的。 语法: For Each 成员In 数组|集合 语句块 [Exit For] Next [成员 ] 说明: . 对于数组,成员只能是Variant 型变量,代表数组中的每个元素。对于集合,成员 可以是Variant 变量、Object 变量或对象。成员类似于For…Next 循环中的循环控 制变量,但不需要为其提供初值和终值。 . 循环的次数由数组的元素个数或集合的成员个数决定。也就是说,数组中有多少个 元素,就自动重复执行多少次。 . 语句块就是循环体。 【例3-15 】使用For Each…Next 语句对数组a(5)的6 个元素分别赋值为1、2、3、4、 5、6,并用Print 语句显示。 程序代码: Private Sub Command1_Click() Dim x Dim i As Integer Dim a(5) As Integer Fori=0To5 '给数组赋值 a(i) = i + 1 Next i ForEachxIna '显示数组 Print x; Next x End Sub 程序分析 : . x 必须是Variant 变量。 . x 的值处于不断变化中,开始执行时,x 是数组第1 个元素的值,执行完一次循环 体后,x 变为数组第2 个元素的值……当x 为最后一个元素的值时,结束循环。 3.2.3 静态数组和动态数组 静态数组是固定大小的数组,维数和大小都不能改变,前面介绍的数组都是静态数组。 59 第3 章 Visual Basic 语言的基本结构 动态数组是在运行时大小可以改变的数组。 1. 定义动态数组 编程时,如果需要一个在运行过程中能够改变元素个数的数组,若使用静态数组,只 能定义一个足够大的数组,当元素个数较少时就使用较少的元素,而元素个数较多时就使 用较多的元素,这种方法会导致占用大量内存,使操作速度变慢。 使用动态数组可以在运行时根据需要改变数组的大小。使用动态数组灵活、方便,并 有助于管理内存。 定义动态数组的语法 : Dim 数组名( ) [As 数据类型] ReDim 数组名(第一维的上下界,…) 说明: . 先定义一个不指明大小的数组,然后用ReDim 语句动态地定义数组的大小和维数, 重新分配存储空间。如果事先没有用Dim 语句定义数组,则用ReDim 语句会创建 一个数组并分配内存空间。 . 与Dim 语句不同,ReDim 语句是一个可执行语句,应用程序在运行时执行该语句, ReDim 语句只能出现在过程中。ReDim 语句是可执行语句,可以反复执行,从而 反复改变数组的大小和维数。 . 可以使用ReDim 语句反复改变数组的大小,但是不能改变数组的数据类型。 . 每次执行ReDim 语句,当前数组中的值都会全部丢失。VB 重新对数组元素的值进 行初始化,将Variant 型数据的初值置为Empty ,将数值型数据的初值置为0,将 String 型数据的初值置为零长度字符串,将Object 型数据的初值置为Nothing 。 例如,下面为声明动态数组的语句: Dim a () As Integer ReDim a ( 5,9) '分配6 × 10 个元 素 例如,直接用ReDim 语句创建动态数组: ReDim a ( 5,9) '创建数组并分配6 × 10 个元素 例如,使用变量定义动态数组: Dim a () As Integer Dim x As Integer,y As Integer x = 5 : y = 9 ReDim a (x, y) x=10 ReDim a (x) 【例3-16 】求Fibonacci 数列:1,1,2,3,5,8… Fibonacci 数列满足以下关系 : F1= 1 F2= 1 Fn = Fn–1+ Fn– 2 60 Visual Basic 教教程(第4 版) 功能要求::单击窗体Forrm 时,用InpuutBox 输入框输输入要计算Fiboonacci 数列的个个数,并 用用Print 语句在在窗体上显示。输入框如图33-17(a)所示示,运行界面如如图3-17(b)所所示。 (b)运行界 数列 界面 (a)输入框 : 图3-17 计计算Fibonacci 数 程序代码 : 框 Private Sub '单击窗体计 Dim i A Dim n A n = Val If n <> Re f(0 Fo Ne Fo Ne Pr End If End Sub Form_Click() 计算Fibonacci 数列 As Integer, f() As As Integer l(InputBox(" 请输 0 Then eDim f(n) 0) = 1: f(1) = 1 or i = 2 To n – 1 f(i) = f(i – 2) + ext or i = 0 To n – 1 If i Mod 5 = 0 Print ElseIf i Mod 5 Print Tab End If Print f(i); ext i rint 列 Integer 输入数组元素个数 + f(i – 1) And i <> 0 Then 5 <> 0 Then (8 * (i Mod 5)); 数", "输入")) '置F1、F2的初 '计算Fn '每打印5个数换 '在每隔8字符的 初值 换一行 的位置打印一个数数 程序分析: : . 数组元元素个数从InpputBox 输入,由于不知道数数组的大小,所以必须采用用动态数 组,输输入数组元素个个数后用ReDimm 语句重新确定数组的大小小。 . 当从InnputBox 输入数数据时,返回值值为字符型,必必须用Val 函数数将字符串转换换为数值。 2. 保留数数组元素值 使用 ReDiim 语句定义动动态数组时,当当前数组的元素素值会全部丢失失。使用具有Preserve 关关键字的ReDiim 语句既可以以改变数组大小小,又不丢失数数组中的数据。。