【VB开源代码栏目提醒】:网学会员--在 VB开源代码编辑为广大网友搜集整理了:VB程序设计 第五章 数组 - 大学课件绩等信息,祝愿广大网友取得需要的信息,参考学习。
第五章 数组主要内容 数组的概念 静态数组及声明 动态数组及声明 数组的基本操作 控件数组 自定义数据类型
常用算法(二) 常见错误 5.1 数组的概念1.引例 若我们要求一个班 100 个学生的平均成绩,然后统计高于平均分的人数。
按以前简单变量的使用和循环结构相结合,求平均成绩程序段如下: aver 0 For i 1 To 100 mark ValInputBoxquot输入第 quot amp i amp quot 位学生的成绩quot aver aver mark Next i aver aver / 100但若要统计高于平均分的人数,则无法实现。
mark 是一个简单变量,存放的是最后一个学生的成绩。
从已有知识解决方法:再重复输入成绩,逐一与平均分比较。
这样带来两个问题: (1)输入数据的
工作量成倍增加; (2)若本次输入的成绩与上次不同,则统计的结果不正确。
解决此
问题的根本方法是:始终保持输入的数据,一次输入,多次使用,为此必须引入有关数组的内容。
2.数组的概念 数组并不是一种新的数据类型,而是一组相同类型的变量的集合。
数组必须先声明后使用。
在
VB 中有两类数组,一类是静态定长数组另一类称为动态可变长数组。
5.2 静态数组及声明 在声明数组时就确定了数组元素的个数的数组称为静态数组。
定义格式: Dim 数组名下标 1下标 2… As 类型数组维数:定义数组是用几个下标就表示数组是几维数组,最多 60 维。
定义数组是下标的形式为 下界 To 上界 省略下界则系统默认下界为 0,下界上界的值必须为数值常数或常数表达式(也可含逻辑常数或数值字符串)。
:数组每一维大小: 上界-下界1。
数组元素的个数(或称大小) 每一维大小的乘积例 Dim mark1 to 100 As Integer 定义数组 mark 为一维整型数组,其下界为 1,上界为 100,大小为 100(即 mark 。
有 100 个元素) Dim lArray 0 To 3, 0 To 4 As Long 它等价于: Dim lArray3, 4 As Long类型为长整型,二维数组,行下界为 0,行上界为 3,列下界为 0, ,列上界为 4,共有 4×5 个元素。
又如定义, Dim a-3.5 To 9 7定义了数组 a 为两维变体数组 如 (这样数组内的元素的值类型可以不同, a-1 4 quotaaquot:a-1 5 3),其中行下界为 -4,行上界为 9;列下界为 0,列上界为 7。
数组 mark 在内存中的分配形式(连续的一个区域):mark1 mark2 mark3 …… mark99 mark100 :数组 lArray 在内存中的分配形式(连续的一个区域)lArray00 lArray01 lArray02 lArray03 lArray04lArray10 lArray11 lArray12 lArray13 lArray14lArray20 lArray21 lArray22 lArray23 lArray24lArray30 lArray31 lArray32 lArray33 lArray34注意: 1 下界缺省为 0 也可在定义数组时改变确省的下界值为 1(注意:下界缺省值只能 。
这就要求在窗体或模块的通用部分写上:Option Base 1。
是 0 或 1) 2 错误的声明(下标是变量) ) n Inputbox“输入 n” Dim xn As Single(3)在数组声明中的下标说明了数组的整体即每一维的大小;而在程序其他地方出现的下标表示数组中的一个元素。
两者写法形式相同,但意义不同。
例如 Dim x10 As Integer 声明了 x 数组有 11 个元素 x10100 对 x10这个数组元素赋值(4)数组声明以后,就可以使用数组中的元素了,但要注意不要使数组的下标越界,以 。
免程序在运行时出错(运行时系统会报下(上)界错误) 例如 Dim score 1 to 50 as singlescore1 scor15是正确的使用数组元素,但 score0则不是正确的使用数组元素,而 scoreIjm则应注意其表达式的结果是否在 1~50 之内,是则是正确引用,不是,则犯下标越界错误。
数组的下标表达式结果可以是一个实数或数值型字符串,但是最终对这个值四舍五入成整数。
(特例,只有一位小数时,整数是偶数时则五舍)如元素 a2.5 a3.5 a-2.5 a-3.5分别相当于 a2、a4、a-2、a-4。
这一点对于定义数组也是适用的。
考查定义:Dim a-6.5 To 7.5As Single,它的下界是 -6,上界是 8。
5 在通常情况下,数组中的各元素类型必须相同,但若数组类型为 Variant时,可包含不同类型的数据。
5.3 动态数组及声明 动态数组指在声明数组时未给出数组的大小省略括号中的下标,当要使用它时,随时用 ReDim 语句重新指出数组大小。
使用动态数组的优点:有效地利用存储空间, 它在
程序执行到 ReDim 语句时分配存储空间,而静态数组是在程序编译时分配存储空间的。
动态数组的定义: 建立动态数组的方法是:使用 Dim、Private 或 Public 语句声明时括号内为空的数组,然后在过程中用 ReDim 语句指明该数组的大小。
ReDim 形式如下: ReDim 数组名下标,下标 2… As 类型例 Sub Private Form_Load Dim sArray As Single ‘定义 sArray 为单精度动态(不定长)数组 … ReDim sArray4,8 ‘重新定义 sArray 为数组 5 行 9 列共 45 个元素的二维数组存储空间 … ReDim sArray5 ‘重新定义 sArray 为 6 个元素的一维数组 … End Sub 说明:1 Dim、Private、Public 变量声明语句是说明性语句,可出现在过程内或通用声明段;而 ReDim 语句是执行语句,只能出现在过程内。
2 在过程中可多次使用 ReDim 来改变数组的大小,也可改变数组的维数。
3 每次使用 ReDim 语句都会使原来数组中的值丢失, 可以在 ReDim 语句后加Preserve 参数用来保留数组中的数据,但使用 Preserve 只能改变最后一维的大小,前面几维大小不能改变。
4 ReDim 中的下标可以是常量,也可以是有了确定值的变量。
(5)ReDim 中 As 类型可以省略不写,如不省略,则类型必须与 dim 定义时的类型一致(即重定义数组不能改变其原来的存储类型) 。
6一个变体变量可以重定义为具有不同类型的数组。
但如果是一个变体数组,在重定义时也只能是变体数组。
例如:Dim a As Variant 或 Dim aReDim a8 As Variant 或 ReDim a8 正确而Dim a As VariantReDim a8 as integer 则错误但Dim a 或 Dim a As VariantReDim a8 As integer 正确可继续重定义 a 为其他类型的数组,但如类型不同就不能使用 Presever 来保留原数组的非覆盖部分的值了,如硬性使用关键字 Presever 系统则按出错处理。
如:Private Sub Form_click Dim a ReDim a8 As String a1 quot12quot: a2 quot4quot: a3 1/2/2003 12:03:00 PM Print a1 a2 a3 ‘显示 12 4 2003-1-2 12:03:00 ReDim Preserve a9 As boolean ‘去掉 Preserve 即可运行 Print a1 a2 a7 a8 ‘显示 False False False FalseEnd Sub例 5.2 输入若干名学生的成绩。
计算平均分和高于平均分的人数并将这两项放在数组的后面。
例 5.2 在 myvbvb5ex5_2 下Private Sub Form_Load Form2.Caption quot动态数组的应用(请单击)quotEnd SubPrivate Sub Picture1_ClickDim mark As IntegerDim n i aver num n1 As StringPicture1.Cls 可以求不同的人数,而不退出程序Randomize ‘随机数发生器,以系统时钟为参数Do 保证输入的内容可用预定义数组 n1 InputBoxprompt:quot输入学生人数quot Default:10 _ Title:quot输入quot xpos:1000 ypos:2000Loop Until n1 ltgt Empty And IsNumericn1 And Valn1 gt 1n n1ReDim mark1 To n 定义动态数组For i 1 To n 产生 n 个学生的成绩 marki Rnd 101Next iFor i 1 To n aver aver markiNext i重新定义数组大小,Preserve 位置是固定的ReDim Preserve mark1 To n 2markn 1 aver / nFor i 1 To n If marki gt aver / n Then markn 2 markn 2 1Next iFor i 1 To n Picture1.Print Tab10 quotmarkquot i quotquot markiNext i Picture1.Print Tab10 quot平均成绩:quot markn 1 Picture1.Print Tab10 quot高于平均分成绩人数:quot markn 2End Sub 5.4 数组的基本操作设有以下声明语句:Dim iA1 TO 10 As IntegerDim Sb34 As SingleSc44 As SingleDim ijt1.数组元素的赋初值 1 用循环结构 For i 1 To 10 iAi0 Next i 2 利用 Array 函数 例 5.3 在 myvbvb5ex5_3 下 Option Base 1 改变系统默认数组下界为 1 Private Sub Form_Load Form2.Caption quot赋初值并显示单击quot End SubPrivate Sub Picture1_Click要想通过 Array 函数给数祖赋初值,必须说明数组是变体变量Dim a As Variant b As Variant i ma ArrayInputBoxprompt:quot输入quot Default:15 xpos:1000 ypos:2000 2 3 4‘数组 a 的第一个元素值通过 inputbox 函数输入b Arrayquotabcquot 10/1/2002 26 ‘数组 b 有三种类型的数据Picture1.ClsPicture1.Print quot arrar a listquotPicture1.Print quot---------------quotFor i 1 To UBounda Picture1.Print ai Spc2Next iPicture1.PrintPicture1.Print quot arrar a vartype listquotPicture1.Print quot-----------------------quotFor i 1 To UBounda m VarTypeai Call type1mNext iPicture1.Print: Picture1.Print列出数组 a 各个元素的类型Picture1.Print quot arrar b listquotPicture1.Print quot---------------quotFor i 1 To UBoundbPicture1.Print bi Spc2Next iPicture1.Print列出数组 b 各个元素的类型Picture1.Print quot arrar b vartype listquotPicture1.Print quot-----------------------quotFor i 1 To UBoundb m VarTypebi Call type1mNext iEnd SubPrivate Sub type1k As Integer 显示数据类型名称常数过程,顺回顾函数 Switch Dim strtype As String strtype Switchk 0 quotvbEmptyquot k 1 quotvbNullquot k 2 quotvbIntegerquot _ k 3 quotvbLongquot k 4 quotvbSinglequot k 5 quotvbDoublequot k 6 quotvbCurrencyquot _ k 7 quotvbDatequot k 8 quotvbStringquot k 9 quotvbObjectquot k 10 quotvbErrorquot _ k 11 quotvbBooleanquot k 12 quotvbVariantquot k 13 quotvbDataObjectquot _ k 14 quotvbDecimalquot k 17 quotvbBytequot k 8192 quotvbArrayquot Picture1.Print strtype Space2 End Sub注意:1 利用 Array 对数组各元素赋值,声明的数组是可调数组或连圆括号都可省并且其类型只能是 Variant。
2 数组的下界为 0,也可通过 optionBase 声明来决定由 Array 所产生的数组的下界,这一点与 Split 函数不同(下界必须是 0)。
上界由 Array 函数括号内的参数个数可决定,也可通过函数 Ubound 获得。
2.数组的输入可以通过文本控件输入,也可通过 InputBox 函数输入。
例利用 For Each 变体变量 in 数组名 … Next 语句给一个数组 A 赋值。
Private Sub Command1_Click Dim A B As Integer Dim N i k Cls N ValInputBoxquot输入数组 A 的上界quot 4 1000 2000 ReDim AN BN k 0 For Each 的变量 i 必须是变体且 i 的值由
系统自动计算, 用语句是不能改变其值的; B 数组 B 和变量 K 必须开辟, 的下界必须是 0。
For Each 是不能保留数组 B 的值的。
For Each i In B Bi ValInputBoxquot输入数组元素的值quot Ak Bi Print Ak amp quot quot k k 1 Next i Print Print quot----------------------quot For k 0 To UBoundA Print Ak amp quot quot Next ReDim B0 Print Print quot---------------------quot Print LBoundB UBoundB End Sub3.数组的赋值 相当于: 在
VB6.0 中,提供了直接对数组的赋值。
For i 0 To UBounda 例如 bi ai Dim a As Variant b As Variant i Next i a Array1 2 3 4 5‘使用 Array 时 a 必须是变体 ReDim bUBounda ba数组对数组赋值时应注意:1赋值号两边的数组的数据类型必须一致2如果赋值号左边的数组必须定义成动态数组,则赋值时系统自动将动态数组 Redim 成右边同样大小的数值。
3如果赋值号的左边的是一个大小固定的数组,则数组赋值出错。
例子Private Sub Picture1_Clicka,b 数据类型必须相同,b 必须是动态数组Dim a5 As Integer b As Integer iFor i 0 To 5 ai i Next i b a For i 0 To 5 Picture1.Print bi Spc3 Next iEnd Sub4. 数组的输出输出方阵 sc 中的下三角元素For i 0 To 4 For j 0 To i sci j i 5 j Print sci j quot quot Next j Print 起换行效果 Next i5. 求数组中最大元素及所在下标 Dim Max As IntegeriMax As Integer … MaxiA1:iMax1 ‘Max 存放最大元素的值,iMax 存放最大元素的下标 For i 2 To 10 If iAigtMax Then MaxiAi iMaxi End If Next I6. 将数组中各元素交换 例 5.4 将数组 iA 的各元素倒排。
即若 iA 各元素的值依次为 1,5,7,35,-26,0,78。
经过倒排后 iA 内的各元素依次是 78,0,-26,35,7,5,1。
例 5.4 在 myvbvb5ex5_4 下Private Sub Picture1_Click Dim iA As Variant i j k iA Array1 5 7 35 -26 0 78 给数组赋初值 Picture1.Cls Picture1.Print Tab2 quot 交换前数组中的值 quot Picture1.Print Tab2 quot--------------------------quot For i LBoundiA To UBoundiA 打印原数组值 Picture1.Print iAi Spc2 Next i k UBoundiA 实现倒排 For i LBoundiA To k 2 j iAi: iAi iAk - i: iAk - i j Next i Picture1.Print : Picture1.Print Picture1.Print Tab2 quot 交换后数组中的值 quot Picture1.Print Tab2 quot--------------------------quot For i LBoundiA To UBoundiA 打印倒排后的数组值 Picture1.Print iAi Spc2Next iEnd Sub 5.5 控件数组1.控件数组的概念 控件是由一组相同类型的控件组成。
它们共用一个控件名,具有相同的属性,建立时系统自动给每个元素赋一个唯一的索引号Index。
控件数组共享同样的事件过程,通过返回的下标值(系统赋予的索引号)来区分控件数组中的各个元素。
例 Private Sub cmdName _ClickIndex As Integer … If Index3 then ‘ 处理第四个命令按钮的操作第一个命令按钮的 Index0 End If … End Sub2.控件数组的建立(1)在设计时建立控件数组 在窗体上画出控件,进行属性设置,这是建立控件数组的第一个元素 选中该控件使用“Copy”和“Paste”命令操作若干次,建立所需控件数组元素的 个数,然后对各元素的位置进行适当调整。
对事件过程进行编程。
例 5.5 建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。
例 5.5 在 myvbvb5ex5_5 下Private Sub Command1_ClickIndex As Integer Picture1.ScaleMode 1 单位是缇,系统默认值 Picture1.Cls Picture1.FillStyle 6 用交叉线填充 Picture1.FillColor RGB255 255 0 Select Case Index Case 0 Picture1.Print quot画直线quot Picture1.Line 200 200-1600 1600 Case 1 Picture1.Print quot画矩形quot Picture1.Line 500 200-1600 1600 B BF F 标是画实心矩形 Case 2 Picture1.Print quot画圆quot 画长椭圆大于 1,Y 轴长;小于 1,x 轴长 Picture1.Circle 1200 800 700 QBColor5 0.7 Case Else End End Select End SubPrivate Sub Form_Load Command10.Caption quot直线quot Command11.Caption quot矩形quot Command12.Caption quot园quot Command13.Caption quot结束quot Form2.Caption quot
设计时建立的控件数组quotEnd Sub2运行时添加控件数组建立的步骤如下: 在窗体上画出某控件,设置该控件的 Index 值为 0(一般设其 visible 属 性False),表示该控件为数组这是建立的第一个元素。
● 在编程时通过 Load 方法添加其余的若干个元素, 也可以通过 Unload 方法删除某个添加的元素。
● 每个新添加的控件数组通过 Left 和 Top 属性确定其在窗体的位置,并将Visible 属性设置为 True。
例 5.6 利用在运行时产生控件数组,构成一个国际象棋棋盘。
当单击棋格,显示对应的序号并且将所有棋格颜色变反。
例 5.6 在 myvbvb5ex5_6 下程序
代码Private Sub Form_Load ‘产生控件数组Dim mtop mleft i j k As IntegerForm2.Caption quot运行时产生控件数组quotmtop 0Label10.Visible False 使 label10仅仅是为了运行时产生控件数组而设计的引子,不可少For i 1 To 8 mleft 50 For j 1 To 8 k i - 1 8 j Load Label1k 加载一个控件数组元素。
QBColor0色为黑,QBColor15色为白 Label1k.BackColor IIfi j Mod 2 QBColor0 QBColor15 设置颜色 Label1k.Visible True 使加载的控件可见,不可少 Label1k.Top mtop 确定加载控件的位置 Label1k.Left mleft Label1k.Caption quotquot mleft mleft Label10.Width Next j mtop mtop Label10.HeightNext iEnd SubPrivate Sub Label1_Clickindex As Integer ‘点击任一个标签,均使全体标签反色 Dim tag As Boolean i j k Label1index index 被点击的标签置其 caption 属性为数组序号值 For i 1 To 8 For j 1 To 8 k i - 1 8 j If Label1k.BackColor ampH0amp Then 黑色 Label1k.BackColor ampHFFFFFF 白色 Else Label1k.BackColor ampH0amp End If Next j Next iEnd Sub 5.6 自定义数据类型 数组能够存放一组类型相同的数据集合,要想存放一组能够存放不同类型的数据,例如,存放一个学生的学号,年龄,家庭住址,手机号码,个人爱好,社会背景等,就必须要用自定义数据类型。
因此可以说自定义数据类型是一组类型不同的变量的集合。
1.自定义类型的定义形式如下:PublicPrivateType 自定义类型名 元素名下标 As 类型名 … 元素名下标 As 类型名End Type 例如以下定义了一个有关学生信息的自定义类型:Type StudType No As Integer 学号 Name As String 20 姓名 Sex As String 1 性别 Mark1 To 4 As Single 4 门
课程成绩 Total As Single 总分End Type注意: 1自定义类型一般在标准模块.BAS中定义,默认是 Public;在窗体必须是 Private。
2不要将自定义类型名和该类型的变量名混淆,前者表示了如同 Intege.