860 likes | 985 Views
2.10. 2.11. 2.12. 2.7. 2.8. 2.9. 基本流程结构. 数组. 过程. Visual Basic 6.0 程序组成. 综合案例. 实训. 第 2 章 Visual Basic 6.0 编程基础 (第二部分). 2.7 基本流程结构. 控制结构可控制程序执行的流程。如果未使用控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。. 2.7.1 顺序结构.
E N D
2.10 2.11 2.12 2.7 2.8 2.9 基本流程结构 数组 过程 Visual Basic 6.0程序组成 综合案例 实训 第2章 Visual Basic 6.0编程基础 (第二部分)
2.7 基本流程结构 • 控制结构可控制程序执行的流程。如果未使用控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。
2.7.1 顺序结构 • 顺序结构中程序按照语句编写的先后顺序一条一条地执行。使用顺序结构只需要将合法语句按照合理的执行顺序排列即可一一执行。
按钮单击事件中的代码为 • Private Sub Command1_Click() • Dim x, y As Double • Const a = 3 • Const b = -5 • x = Val(Text1.Text) • y = a * x ^ 2 + b * x + 1 • y = y / Abs(a + b) • Text2.Text = Str$(y) • End Sub
2.7.2 条件结构 • Visual Basic 6.0支持的条件结构有: • If…Then; • If…Then…Else; • Iif; • Select Case;
(1)用If…Then结构有条件地执行一个或多个语句,单行语法和多行块语法都可以使用。(1)用If…Then结构有条件地执行一个或多个语句,单行语法和多行块语法都可以使用。 • If 条件 Then 语句 • If 条件 Then • [语句块] • End If • “条件”通常是比较式,但它可以是任何计算数值的表达式。Visual Basic 6.0 将这个值解释为True或False。一个为零的数值为False,而任何非零数值都被看做True。若“条件”为True,则Visual Basic 6.0执行“Then”关键字后面的所有“语句块”。
(2)用 If…Then…Else块定义几个语句块,执行其中一个语句: • If 条件1 Then • [语句块1] • [Else If 条件2 Then • [语句块2]] • ... • [Else • [语句块n]] • End If • Visual Basic 6.0首先测试“条件1”。如果它为False,Visual Basic 6.0就测试“条件2”,依此类推,直到找到一个为True的条件。当它找到一个为True的条件时,Visual Basic 6.0就会执行相应的语句块,然后执行End If后面的代码。作为一个选择,可以包含Else语句块,如果前n-1个条件都是False,则Visual Basic 6.0执行Else语句块。
(3)IIf函数用于实现一些简单的条件判断分支结构,其格式如下:(3)IIf函数用于实现一些简单的条件判断分支结构,其格式如下: • IIf(条件,条件为真时的值,条件为假时的值) • 其作用是对条件进行测试,若条件成立(为真值),则取第一个值(即“条件为真时的值”),否则取第二个值(即“条件为假时的值”)。
(4)Visual Basic 6.0提供Select Case结构替代If…Then…Else,从而可在多个语句块中有选择地执行其中一个。Select Case语句的能力与If…Then…Else语句类似,但对多重选择的情况,Select Case语句使代码更加易读。Select Case在结构的开始便处理一个测试表达式并只计算一次。然后,Visual Basic 6.0将表达式的值与结构中每个Case的值进行比较。如果相等,就执行与该Case相关联的语句块。 • Select Case test 测试表达式 • [Case 表达式列表1 • [语句块1]] • [Case 表达式列表2 • [语句块2]] • ... • [Case Else • [语句块n]] • End Select
按钮单击事件中的代码为 • Private Sub Command1_Click() • Dim a As Integer '定义变量 • a = Val(Text1.Text) '将文本框中输入的值赋给变量a • If a < 0 Then '当a为负数时取其相反数 • a = -a • End If • Text2.Text = Str$(a) • End Sub • 按钮单击事件中的代码为 • Private Sub Command2_Click() • Text1.Text = "" • Text2.Text = "" • End Sub
“确定”按钮单击事件中的代码为 • Private Sub Command1_Click() • Dim x As Integer • x = Val(Text1.Text) • If (x Mod 100) Then '如果X不能被100整除 • If (x Mod 4 = 0) Then '如果x能被4整除但不能被100整除 • Text2.Text = "yes" • Else '如果x不能被4和100整除 • Text2.Text = "no" • End If • ElseIf (x Mod 400 = 0) Then '如果x能被100整除,又能被400整除 • Text2.Text = "yes" • Else • Text2.Text = "no" • End If • End Sub
“清除”按钮单击事件中的代码为 • Private Sub Command2_Click() • Text1.Text = "" • Text2.Text = "" • End Sub
Private Sub Command1_Click() Dim year As Integer, a As Integer year = Val(Text1.Text) a = year Mod 12 Select Case a Case 1 Text2.Text = "鸡" Case 2 Text2.Text = "狗" Case 3 Text2.Text = "猪" Case 4 Text2.Text = "鼠" Case 5 Text2.Text = "牛" • Case 6 • Text2.Text = "虎" • Case 7 • Text2.Text = "兔" • Case 8 • Text2.Text = "龙" • Case 9 • Text2.Text = "蛇" • Case 10 • Text2.Text = "马" • Case 11 • Text2.Text = "羊" • Case 0 • Text2.Text = "猴" • End Select • End Sub
使用If…Then…Else结构,代码如下: Private Sub Command1_Click() Dim year As Integer, a As Integer year = Val(Text1.Text) a = year Mod 12 If a=1 Then Text2.Text = "鸡" ElseIf a=2 Then Text2.Text = "狗" ElseIf a=3 Then Text2.Text = "猪" ElseIf a=4 Then Text2.Text = "鼠" ElseIf a=5 Then Text2.Text = "牛" • ElseIf a=6 Then • Text2.Text = "虎" • ElseIf a=7 Then • Text2.Text = "兔" • ElseIf a=8 Then • Text2.Text = "龙" • ElseIf a=9 Then • Text2.Text = "蛇" • ElseIf a=10 Then • Text2.Text = "马" • ElseIf a=11 Then • Text2.Text = "羊" • Else • Text2.Text = "猴" • End If • End Sub
2.7.3 循环结构 • Do…Loop; • For…Next。
1.Do…Loop • 用Do循环重复执行一语句块,且重复次数不定。Do…Loop语句有几种演变形式,但每种都计算数值条件以决定是否继续执行。如同If…Then 条件必须是一个数值或者值为True(非零)或False(零)的表达式。在下面的Do…Loop循环中,只要“条件”为True就执行“语句块”。 • Do While (条件) • [语句块] • Loop • 当Visual Basic 6.0执行这个Do循环时会首先测试“条件”。如果“条件”为False(零),则跳过所有语句;如果“条件”为True(非零),则Visual Basic 6.0执行语句,然后退回到Do While语句再测试条件。因此,只要“条件”为True或非零,循环可以随意执行多次;如果“条件”一开始便为False,则不会执行语句。
Do…Loop语句的另一种演变形式是先执行语句,然后再在每次执行后测试“条件”。这种形式保证“语句块”至少执行一次: • Do • [语句块] • Loop While (条件) • 其他两种演变形式类似于前两个,所不同的是,只要“条件”为False而不是True,它们就执行循环。
2.For…Next • 与Do循环不同,For循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。For循环的语法如下: • For 循环变量 = 初值 To 终值 [Step 步长] • [语句块] • Next [循环变量] • 参数“循环变量”、“初值”、“终值”和“步长”都是数值型的。 • “步长”参数可正可负。如果“步长”为正,则“初值”必须小于等于“终值”,否则不能执行循环内的语句;如果“步长”为负,则“初值”必须大于等于“终值”,这样才能执行循环体。如果没有设置“Step”(步长),则“步长”缺省值为1。每执行一个循环,“循环变量= 循环变量+步长”。
在执行For循环时,其执行过程如下。 • ① 设置“循环变量”等于“初值”。 • ② 测试“循环变量”是否在“初值”和“终值”之间。若不是的话,则Visual Basic 6.0退出循环;若是的话执行语句。 • ③ 执行完“语句块”语句,执行Next [循环变量],循环变量= 循环变量+步长。 • ④ 重复步骤②~步骤④。
【案例2-10】 人口估算 • 假设我国现有人口约为12亿,设年增长率为1%,计算多少年后增加到20亿。
使用Do…Loop While结构,代码如下: Private Sub Form_Click() Dim a As Double Dim r As Single Dim i As Integer a = 12 r = 0.01 i = 0 Do a = a * (1 + r) i = i + 1 Loop While a < 20 '当人口数大于等于20亿时结束循环 Print i ;"年后中国人口达到20亿" End Sub • Private Sub Form_Click() • Dim a As Double • Dim r As Single • Dim i As Integer • a = 12 • r = 0.01 • i = 0 • Do While a < 20 • '当人口数大于等于20亿时结束循环 • a = a * (1 + r) • i = i + 1 • Loop • Print i ;"年后中国人口达到20亿" • End Sub
【案例2-11】 累加求和 • 求m=1+2+3+4+……100的值。
Private Sub Form_Click() • Dim m As Integer,i As Integer • m = 0 • For i = 1 To 100 '步长省略,默认为1 • m = m + i • Next i • Print m • End Sub
2.7.4 控制结构 • 前面介绍了几种基本的控制语句,而应用这几种基本的控制语句,可以产生各种各样的控制结构,下面讲解几种特殊的控制结构。
(1)嵌套控制结构 • 可以把控制结构放入另一个控制结构之内(例如在For…Next循环中的If…Then块)。一个控制结构内部包含另一个控制结构叫做嵌套(nest)。在Visual Basic 6.0中,控制结构的嵌套层数没有限制。按一般习惯,为了使条件分枝结构和循环结构更具可读性,总是用缩排方式书写条件分枝结构或循环结构的正文部分。
(2)退出控制结构 • 用Exit语句可以直接退出For循环、Do循环、子过程或函数过程。 • For 循环变量 = 初值 To 终值 [Step 步长] • [语句块] • [Exit For] • [语句块] • Next [循环变量[, 循环变量] [,…]] • Do [{While | Until} 条件] • [语句块] • [Exit Do] • [语句块] • Loop • Exit Do语句可以在Do循环语法的所有结构中使用。Exit For和Exit Do非常有用,因为它有时适用于立即退出循环,而且不再执行循环中的任何进一步迭代或者语句。
【案例2-12】 人口估算 • 假设我国现有人口约为12亿,设年增长率为1%,计算多少年后增加到20亿。
Private Sub Form_Click() • Dim a As Double • Dim r As Single • Dim i As Integer • a = 12 • r = 0.01 • For i=0 to 1000 • a = a * (1 + r) • If a >= 20 Then Exit For '当人口数大于等于20亿时跳出循环 • Next i • Print i; "年后中国人口达到20亿" • End Sub
2.8 数组 • 在Visual Basic 6.0中,把一组具有同一名字、不同下标的下标变量称为数组,其一般形式如下: • S(i) • 其中S称为数组名,i是下标。一个数组可以含有若干个下标变量,下标用来指出某个数组元素在数组中的位置,S(8)代表S数组中的第八个元素。
2.8.1 数组的声明 • 声明固定大小的数组有3种方法,用哪一种方法取决于数组应有的有效范围。 • 建立全局数组,在模块的声明段用Public语句声明数组。 • 建立模块或窗体数组,在模块的声明段用Private语句声明数组。 • 建立局部数组,在过程中用Private语句声明数组。
声明数组时,在数组名之后跟一个用括弧括起来的,其上界、下界不得超过Long数据类型的范围(-2 147 483 648~2 147 483 647)。 • 例如,下列数组声明可出现在模块的声明段: • Dim A(4) As Integer • '同时定义了A(0),A(1),A(2),A(3),A(4)5个元素。 • Dim S (20) As Double • '定义了S(0)到S(20)21个元素。 • 为建立公用数组,直接用Public取代Dim: • Public A(4) As Integer • Public S (20) As Double • 第一个声明建立了一个有5个元素的数组,其索引号为0~4;第二个声明建立了一个有21个元素的数组,其索引号范围是0~20。
为了规定下界,可以使用关键字“To”显式提供下界(为Long数据类型):为了规定下界,可以使用关键字“To”显式提供下界(为Long数据类型): • Dim A (1 To 5) As Integer • Dim S (100 To 120) As String • 在前述声明中,“A”的索引值范围为1~5,而“S”的索引值范围为100~120。
有时候,可能需要知道数组的上界值和下界值,这可以通过Lbound和Ubound函数来测试,其格式如下:有时候,可能需要知道数组的上界值和下界值,这可以通过Lbound和Ubound函数来测试,其格式如下: • Lbound(数组名) • '返回数组索引值的上界值 • Ubound(数组名) • '返回数组索引值的下界值
2.8.2 动态数组 • 数组长度到底应该为多大才算合适,有些情况下很难确定,这就需要数组能够在运行时具有改变大小的能力。通过使用动态数组,可以在程序中任意改变数组的长度。在Visual Basic 6.0中,动态数组是最灵活、最方便的,有助于有效管理内存。
(1)如果希望数组为公用数组,则用Public语句声明数组;如果希望数组为模块级,则在模块级用Dim语句声明数组;如果希望数组为局部数组,则在过程中用Static或Dim语句声明数组。给数组赋一个空数组,这样就将数组声明为动态数组。例如:(1)如果希望数组为公用数组,则用Public语句声明数组;如果希望数组为模块级,则在模块级用Dim语句声明数组;如果希望数组为局部数组,则在过程中用Static或Dim语句声明数组。给数组赋一个空数组,这样就将数组声明为动态数组。例如: • Dim A ()
(2)用ReDim语句分配实际的元素个数。 • ReDim A (X + 1) • ReDim语句只能出现在过程中。与Dim语句、Static语句不同,ReDim语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。ReDim语句支持这样的语法,它与固定数组中使用的语法相同。每个ReDim语句都能改变元素数目以及上下界。
2.8.3 数组的基本操作 • 建立一个数组之后,可以对数组或数组元素进行操作。数组的基本操作包括输入、输出及复制,这些操作都是对数组进行的。此外,在Visual Basic 6.0中还提供了For Each…Next语句,可用于对数组的操作。
1.数组元素的引用 • 引用数组元素的格式是:数组名(下标)。 • 例如: • Number(1),A(2),Num(0),B(4)等。
2.给数组元素赋值 • (1)利用循环结构给数组元素赋值,例如为数组元素赋初值3: • For i=1 to 5 • A(i)=3 • Next i
(2)利用Array()函数为数组元素赋值,即把一个数据集读入某个数组。其格式为:(2)利用Array()函数为数组元素赋值,即把一个数据集读入某个数组。其格式为: • 数组变量名=Array(数组元素值) • 例如: • Static Number • Number=Array(1,2,3,4,5) • 说明: • Array()函数对各元素赋值,声明的数组是动态数组或连小括号都省略的数组,并且类型只能是Varient。 • 数组下界默认为0,可通过Option Base语句决定,上界由Array()函数括号内的参数个数决定,也可通过UBound()函数获得。 • “数组元素值”是需要赋给数组各元素的值,各值之间以逗号分开。 • Array()函数只适用于一维数组。
4.数组元素的复制 • (1)单个数组元素可以像简单变量一样从一个数组复制到另一个数组。例如: • Dim b(4),a(6) • … • b(2)=a(3) • (2)要复制整个数组,要使用For循环语句。
(3)要复制整个数组,也可以使用一条简单的赋值语句即可。例如:(3)要复制整个数组,也可以使用一条简单的赋值语句即可。例如: • Dim a(4) as integer,b() as integer • A(0)=0:a(1)=5:a(2)=10:a(3)=13:a(4)=14 • B=a • 使用这种方法赋值时,必须要注意: • 赋值号两边的数据类型必须一致; • 如果赋值号左边的是一个大小固定的数组,则数组赋值出错; • 赋值号左边的必须是一个动态数组,赋值时系统将自动给动态数组分配内存空间,使之与右边数组大小相同。
5.For Each…Next语句 • For Each…Next循环与For…Next循环类似,与For…Next语句类似,两者都是用来执行指定重复次数的语句。但For Each…Next语句是专门用于操作数组的,它的格式如下: • For Each <成员> In <数组名> • [<循环体>] • Next [<成员>]
说明: • 格式中的“成员”必须是一个变体变量,是为循环提供的,代表的是数组中的每个元素。 • 〈数组名〉没有括号和上下界。 • 用For Each…Next语句可以对数组中的每个元素进行处理,它包括查询、显示和读取。它所重复的次数由数组中元素的个数决定,数组中有多少个元素,就自动重复执行多少次。
【案例2-13】 数组复制 • 给数组赋初值,然后复制到另一数组中,并打印输出到窗体上。
Private Sub Form_Click() • Dim a(), b() '定义动态数 • a = Array(1, 2, 3, 4, 5) '给数组赋初值 • ReDim b(UBound(a)) '给动态数组分配内存空间 • For i = 0 To UBound(a) '数组复制 • b(i) = a(i) • Next i • For i = 0 To UBound(a) '数组输出 • Print b(i); • Next i • End Sub