VB程序设计 第五章 数组Word格式.docx
- 文档编号:20952737
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:36
- 大小:178.44KB
VB程序设计 第五章 数组Word格式.docx
《VB程序设计 第五章 数组Word格式.docx》由会员分享,可在线阅读,更多相关《VB程序设计 第五章 数组Word格式.docx(36页珍藏版)》请在冰豆网上搜索。
数组维数:
定义数组是用几个下标就表示数组是几维数组,最多60维。
定义数组是下标的形式为[下界To]上界省略下界则系统默认下界为0,下界上界的值必须为数值常数或常数表达式(也可含逻辑常数或数值字符串)。
数组每一维大小:
上界-下界+1。
数组元素的个数(或称大小):
每一维大小的乘积
[例]Dimmark(1to100)AsInteger
定义数组mark为一维整型数组,其下界为1,上界为100,大小为100(即mark有100个元素)。
DimlArray(0To3,0To4)AsLong
它等价于:
DimlArray(3,4)AsLong
类型为长整型,二维数组,行下界为0,行上界为3,列下界为0,,列上界为4,共有4×
5个元素。
又如定义,Dima(-3.5To9,7)
定义了数组a为两维变体数组(这样数组内的元素的值类型可以不同,如a(-1,4)="
aa"
:
a(-1,5)=3),其中行下界为-4,行上界为9;
列下界为0,列上界为7。
数组mark在内存中的分配形式(连续的一个区域):
mark
(1)
mark
(2)
mark(3)
……
mark(99)
mark(100)
数组lArray在内存中的分配形式(连续的一个区域):
lArray(0,0)
lArray(0,1)
lArray(0,2)
lArray(0,3)
lArray(0,4)
lArray(1,0)
lArray(1,1)
lArray(1,2)
lArray(1,3)
lArray(1,4)
lArray(2,0)
lArray(2,1)
lArray(2,2)
lArray(2,3)
lArray(2,4)
lArray(3,0)
lArray(3,1)
lArray(3,2)
lArray(3,3)
lArray(3,4)
注意:
(1)下界缺省为0,也可在定义数组时改变确省的下界值为1(注意:
下界缺省值只能是0或1)。
这就要求在窗体或模块的通用部分写上:
OptionBase1。
(2)错误的声明(下标是变量)
n=Inputbox(“输入n”)
Dimx(n)AsSingle
(3)在数组声明中的下标说明了数组的整体,即每一维的大小;
而在程序其他地方出现的下标表示数组中的一个元素。
两者写法形式相同,但意义不同。
[例如]
Dimx(10)AsInteger'
声明了x数组有11个元素
x(10)=100'
对x(10)这个数组元素赋值
(4)数组声明以后,就可以使用数组中的元素了,但要注意不要使数组的下标越界,以免程序在运行时出错(运行时系统会报下(上)界错误)。
[例如]Dimscore(1to50)assingle
score
(1),scor(15)是正确的使用数组元素,但score(0)则不是正确的使用数组元素,而score(I+j*m)则应注意其表达式的结果是否在1~50之内,是则是正确引用,不是,则犯下标越界错误。
数组的下标表达式结果可以是一个实数或数值型字符串,但是最终对这个值四舍五入成整数。
(特例,只有一位小数时,整数是偶数时则五舍)如元素a(2.5),a(3.5),a(-2.5),a(-3.5)分别相当于a
(2)、a(4)、a(-2)、a(-4)。
这一点对于定义数组也是适用的。
考查定义:
Dima(-6.5To7.5)AsSingle,它的下界是-6,上界是8。
(5)在通常情况下,数组中的各元素类型必须相同,但若数组类型为Variant时,可包含不同类型的数据。
5.3动态数组及声明
动态数组指在声明数组时未给出数组的大小(省略括号中的下标),当要使用它时,随时用ReDim语句重新指出数组大小。
使用动态数组的优点:
有效地利用存储空间,它在程序执行到ReDim语句时分配存储空间,而静态数组是在程序编译时分配存储空间的。
动态数组的定义:
建立动态数组的方法是:
使用Dim、Private或Public语句声明时括号内为空的数组,然后在过程中用ReDim语句指明该数组的大小。
ReDim形式如下:
ReDim数组名(下标[,下标2…])[As类型]
[例]SubPrivateForm_Load()
DimsArray()AsSingle‘定义sArray为单精度动态(不定长)数组
…
ReDimsArray(4,8)
‘重新定义sArray为数组5行9列共45个元素的二维数组存储空间
…
ReDimsArray(5)‘重新定义sArray为6个元素的一维数组
…
EndSub
说明:
(1)Dim、Private、Public变量声明语句是说明性语句,可出现在过程内或通用声明段;
而ReDim语句是执行语句,只能出现在过程内。
(2)在过程中可多次使用ReDim来改变数组的大小,也可改变数组的维数。
(3)每次使用ReDim语句都会使原来数组中的值丢失,可以在ReDim语句后加Preserve参数用来保留数组中的数据,但使用Preserve只能改变最后一维的大小,前面几维大小不能改变。
(4)ReDim中的下标可以是常量,也可以是有了确定值的变量。
(5)ReDim中As类型可以省略不写,如不省略,则类型必须与dim定义时的类型一致(即重定义数组不能改变其原来的存储类型)。
(6)一个变体变量可以重定义为具有不同类型的数组。
但如果是一个变体数组,在重定义时也只能是变体数组。
例如:
Dima()AsVariant或Dima()
ReDima(8)AsVariant或ReDima(8)正确
而
Dima()AsVariant
ReDima(8)asinteger则错误
但
Dima或DimaAsVariant
ReDima(8)Asinteger正确(可继续重定义a为其他类型的数组,但如类型不同就不能使用Presever来保留原数组的非覆盖部分的值了,如硬性使用关键字Presever系统则按出错处理。
)如:
PrivateSubForm_click()
Dima
ReDima(8)AsString
a
(1)="
12"
a
(2)="
4"
a(3)=#1/2/200312:
03:
00PM#
Printa
(1),a
(2),a(3)‘显示1242003-1-212:
00
ReDimPreservea(9)Asboolean‘去掉Preserve即可运行
Printa
(1),a
(2),a(7),a(8)‘显示FalseFalseFalseFalse
[例5.2]输入若干名学生的成绩。
计算平均分和高于平均分的人数并将这两项放在数组的后面。
[例5.2]在myvb\vb5\ex5_2下
PrivateSubForm_Load()
Form2.Caption="
动态数组的应用(请单击)"
PrivateSubPicture1_Click()
Dimmark()AsInteger
Dimn%,i%,aver!
num%,n1AsString
Picture1.Cls'
可以求不同的人数,而不退出程序
Randomize‘随机数发生器,以系统时钟为参数
Do'
保证输入的内容可用预定义数组
n1=InputBox(prompt:
="
输入学生人数"
Default:
=10,_
Title:
输入"
xpos:
=1000,ypos:
=2000)
LoopUntiln1<
>
EmptyAndIsNumeric(n1)AndVal(n1)>
1
n=n1
ReDimmark(1Ton)'
定义动态数组
Fori=1Ton'
产生n个学生的成绩
mark(i)=Rnd*101
Nexti
Fori=1Ton
aver=aver+mark(i)
'
重新定义数组大小,Preserve位置是固定的
ReDimPreservemark(1Ton+2)
mark(n+1)=aver/n
Ifmark(i)>
aver/nThenmark(n+2)=mark(n+2)+1
Picture1.PrintTab(10);
mark("
;
i;
)="
mark(i)
平均成绩:
"
mark(n+1)
高于平均分成绩人数:
mark(n+2)
5.4数组的基本操作
设有以下声明语句:
DimiA(1TO10)AsInteger
DimSb(3,4)AsSingle,Sc(4,4)AsSingle
Dimi%,j%,t%
1.数组元素的赋初值
(1)用循环结构
Fori=1To10
iA(i)=0
Nexti
(2)利用Array函数
[例5.3]在myvb\vb5\ex5_3下
OptionBase1'
改变系统默认数组下界为1
赋初值并显示(单击)"
要想通过Array函数给数祖赋初值,必须说明数组是变体变量
DimaAsVariant,bAsVariant,i%,m%
a=Array(InputBox(prompt:
=15,xpos:
=2000),2,3,4)
‘数组a的第一个元素值通过inputbox函数输入
b=Array("
abc"
#10/1/2002#,26)‘数组b有三种类型的数据
Picture1.Cls
Picture1.Print"
arraralist"
---------------"
Fori=1ToUBound(a)
Picture1.Printa(i);
Spc
(2);
Picture1.Print
arraravartypelist"
-----------------------"
m=VarType(a(i))
Calltype1(m)
Picture1.Print:
Picture1.Print
列出数组a各个元素的类型
arrarblist"
Fori=1ToUBound(b)
Picture1.Printb(i);
列出数组b各个元素的类型
arrarbvartypelist"
m=VarType(b(i))
Calltype1(m)
PrivateSubtype1(kAsInteger)'
显示数据类型名称常数过程,顺回顾函数Switch
DimstrtypeAsString
strtype=Switch(k=0,"
vbEmpty"
k=1,"
vbNull"
k=2,"
vbInteger"
_
k=3,"
vbLong"
k=4,"
vbSingle"
k=5,"
vbDouble"
k=6,"
vbCurrency"
k=7,"
vbDate"
k=8,"
vbString"
k=9,"
vbObject"
k=10,"
vbError"
k=11,"
vbBoolean"
k=12,"
vbVariant"
k=13,"
vbDataObject"
k=14,"
vbDecimal"
k=17,"
vbByte"
k=8192,"
vbArray"
)
Picture1.Printstrtype;
Space
(2);
EndSub
(1)利用Array对数组各元素赋值,声明的数组是可调数组或连圆括号都可省并且其类型只能是Variant。
(2)数组的下界为0,也可通过optionBase声明来决定由Array所产生的数组的下界,这一点与Split函数不同(下界必须是0)。
上界由Array函数括号内的参数个数可决定,也可通过函数Ubound获得。
2.数组的输入
可以通过文本控件输入,也可通过InputBox函数输入。
[例]利用ForEach变体变量in数组名…Next语句给一个数组A赋值。
参见MYVB\VB5\EX5_14
PrivateSubCommand1_Click()
DimA%(),B()AsInteger
DimN%,i,k%
Cls
N=Val(InputBox("
输入数组A的上界"
,4,1000,2000))
ReDimA(N),B(N)
k=0
'
ForEach的变量i必须是变体且i的值由系统自动计算,
'
用语句是不能改变其值的;
数组B和变量K必须开辟,B的下界必须是0。
ForEach是不能保留数组B的值的。
ForEachiInB
B(i)=Val(InputBox("
输入数组元素的值"
A(k)=B(i)
PrintA(k)&
"
k=k+1
Print"
----------------------"
Fork=0ToUBound(A)
Next
ReDimB(0)
---------------------"
PrintLBound(B),UBound(B)
相当于:
Fori=0ToUBound(a)
b(i)=a(i)
3.数组的赋值
在VB6.0中,提供了直接对数组的赋值。
Dima()AsVariant,b()AsVariant,i%
a=Array(1,2,3,4,5)‘使用Array时a必须是变体
ReDimb(UBound(a))
b=a
数组对数组赋值时应注意:
(1)赋值号两边的数组的数据类型必须一致
(2)如果赋值号左边的数组必须定义成动态数组,则赋值时系统自动将动态数组Redim成右边同样大小的数值。
(3)如果赋值号的左边的是一个大小固定的数组,则数组赋值出错。
[例子]
a,b数据类型必须相同,b必须是动态数组
Dima(5)AsInteger,b()AsInteger,i%
Fori=0To5
a(i)=i
b=a
Fori=0To5
Picture1.Printb(i);
Spc(3);
4
.数组的输出
输出方阵sc中的下三角元素
Fori=0To4
Forj=0Toi
sc(i,j)=i*5+j
Printsc(i,j);
Nextj
Print'
起换行效果
5.求数组中最大元素及所在下标
DimMaxAsInteger,iMaxAsInteger
Max=iA
(1):
iMax=1‘Max存放最大元素的值,iMax存放最大元素的下标
Fori=2To10
IfiA(i)>
MaxThen
Max=iA(i)
iMax=i
EndIf
NextI
6.将数组中各元素交换
[例5.4]将数组iA的各元素倒排。
即若iA各元素的值依次为1,5,7,35,-26,0,78。
经过倒排后iA内的各元素依次是78,0,-26,35,7,5,1。
[例5.4]在myvb\vb5\ex5_4下
DimiAAsVariant,i%,j%,k%
iA=Array(1,5,7,35,-26,0,78)'
给数组赋初值
Picture1.Cls
Picture1.PrintTab
(2);
交换前数组中的值"
--------------------------"
Fori=LBound(iA)ToUBound(iA)'
打印原数组值
Picture1.PrintiA(i);
k=UBound(iA)'
实现倒排
Fori=LBound(iA)Tok\2
j=iA(i):
iA(i)=iA(k-i):
iA(k-i)=j
Picture1.Print:
交换后数组中的值"
打印倒排后的数组值
5.5
控件数组
1.控件数组的概念
控件是由一组相同类型的控件组成。
它们共用一个控件名,具有相同的属性,建立时系统自动给每个元素赋一个唯一的索引号(Index)。
控件数组共享同样的事件过程,通过返回的下标值(系统赋予的索引号)来区分控件数组中的各个元素。
[例]PrivateSubcmdName_Click(IndexAsInteger)
…
IfIndex=3then
‘处理第四个命令按钮的操作,第一个命令按钮的Index=0
EndIf
2.控件数组的建立
(1)在设计时建立控件数组
●在窗体上画出控件,进行属性设置,这是建立控件数组的第一个元素
●选中该控件,使用“Copy”和“Paste”命令操作若干次,建立所需控件数组元素的个数,然后对各元素的位置进行适当调整。
●对事件过程进行编程。
[例5.5]建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。
[例5.5]在myvb\vb5\ex5_5下
PrivateSubCommand1_Click(IndexAsInteger)
Picture1.ScaleMode=1'
单位是缇,系统默认值
Picture1.FillStyle=6'
用交叉线填充
Picture1.FillColor=RGB(255,255,0)
SelectCaseIndex
Case0
Picture1.Print"
画直线"
Picture1.Line(200,200)-(1600,1600)
Case1
画矩形"
Picture1.Line(500,200)-(1600,1600),,B'
BFF标是画实心矩形
Case2
画圆"
画长椭圆,大于1,Y轴长;
小于1,x轴长
Picture1.Circle(1200,800),700,QBColor(5),,,0.7
CaseElse
End
EndSelect
Command1(0).Caption="
直线"
Command1
(1).Caption="
矩形"
Command1
(2).Caption="
园"
Command1(3).Caption="
结束"
设计时建立的控件数组"
(2)运
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB程序设计 第五章 数组 VB 程序设计 第五