VB第5章 复习资料.docx
- 文档编号:3894946
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:20
- 大小:91.74KB
VB第5章 复习资料.docx
《VB第5章 复习资料.docx》由会员分享,可在线阅读,更多相关《VB第5章 复习资料.docx(20页珍藏版)》请在冰豆网上搜索。
VB第5章复习资料
第5章补充资料
习题解答
1.在VB6.0中,数组的下界默认为0,用什么语句可以重新定义数组的默认下界?
答:
OptionBase语句
2.要分配存放12个元素的整形数组,下列数组声明(下界若无,按默认规定)那些符合要求?
(1)n=12
(2)Dima%()
Dima(1ton)asintergern=11
ReDima(n)
(3)Dima%[2,3](4)Dima(1,1,2)AsInterger
(5)Dima%(10)(6)Dima!
()
ReDima(1To12)ReDima(3,2)AsInterger
(7)Dima%(2,3)(8)Dima(1to31to4)AsInterger
答:
(2)、(4)、(7)、(8)符合要求。
3.程序运行时显示“下标越界”可能产生的错误有哪几种情况?
答:
下标比下界小或者比上界大。
4.已知下面的数组声明,写出它的数组名,数组类型、维数、各维的上下界、数组的大小、并按行的顺序列出各元素。
Dima(-1to2,3)asinterger
答:
数组名为a、数组类型为单精度、二维、各维的下界分别为-1和0、上界分别为2和3、数组的大小4×4共16个元素,各元素排列顺序如下:
a(-1,0)a(-1,1)a(-1,2)a(-1,3)
a(0,0)a(0,1)a(0,2)a(0,3)
a(1,0)a(1,1)a(1,2)a(1,3)
a(2,0)a(2,1)a(2,2)a(2,3)
5.利用随机数生成两个矩阵(数据不一定相同,前者30~70范围、后者101~135),要求:
A=
B=
C=
提示:
假定在通用声明段对数组的声明如下:
Dima%(1to4),b%(1to4),c%(1to4)
在Form_Load事件过程中对a、b数组根据要求随机生成数值:
根据各小题的要求,在各事件过程分别编写代码。
(1)将两个矩阵相加结果存入C矩阵中。
答:
两个矩阵能相加的条件是它们的行数,列数相同,利用两重循环将它们的对应元素逐一相加即可。
程序段如下:
Fori=1to4
Forj=1to4
C(i,j)=a(i,j)+b(i,j)
Nextj
Nexti
(2)将A矩阵转置。
答:
矩阵转置是将矩阵的行变为列、列变为行。
这也通过两重循环实现,程序段如下:
Fori=2to4
Forj=1toi-1
t=a(i,j)
a(i,j)=a(j,i)
a(j,i)=t
Nextj
Nexti
思考:
若类循环的终值由i-1改为4,将会产生什么结果?
(3)统计C矩阵中最大值及其下标
答:
因为C矩阵是两维数组,所以最大值的下标也有两个,即行下标和列下标。
DimMax%,,%Maxj%
Max=c(0,0):
Maxi=0:
Maxj=0
Fori=0to3
Forj=0to3
Ifc(i,j)>Maxthen
Max=c(i,j):
Maxi=i:
Maxj=j
Ensdif
Nextj
Nexti
(4)以下三角形式显示A矩阵、上三角形式显示B矩阵。
答:
两维数组形式输出,必须通过两重循环。
对于下三角形式较简单,每一行总是从最左边开始输出,只要控制每一个元素的宽度即可;而对于上三角形式,则要控制每一行第一个元素输出的位置,这一般通过Tab函数实现。
说明:
Space(4-Len(c(i,j)))表示每个元素占4个,其中空格数目与实际数目值位数有关。
输出下列三角元素输出上列三角元素
Fori=0To3Fori=0To3
Forj=0To3Forj=0to3
Printc(i,j);space(4-Len(c(i,j)));PrintTab(j*4);c(i,j);
NextjNextj
PrintPrint
NextiNexti
(5)将A矩阵第一行与第三行对应元素交换位置,即第一行元素放到第三行;第三行元素放到第一行。
答:
Forj=1to3
t=c(1,j):
c(1,j)=c(3,j):
c(3,j)=t
Nexti
(6)求A矩阵两条对角线元素之和。
答:
对角线有主对角线和副对角线。
Sum=0
Fori=0to3
Sum=Sum+c(i,j)+c(i,3-i)
Nexti
(7)将A矩阵按列的次序把各元素放入一维数组D中,显示结果。
答:
关键要找出两维数组各元素和一维数组各元素的关系。
Dimc(3,3),c2(15)
……
Forj=0to3
Fori=0to3
k=j*4+i
c2(k)=c(i,j)
Nextj
Nexti
6.声明一个一维字符型数组,有20个元素,每一个元素最多存放个10个字符,要求:
(1)由随机数形成小写字母够成的数组,每个元素的字符个数由随机数产生,范围1~10。
答:
本题较简单,主要是利用随机数产生长度不超过11个字符的字符串。
PrivateSubForm_click()
Dimst(1To20)AsString,cAsString*1
Dimi%,n%
Fori=1To20
n=Int(Rnd*11+1)
Forj=1Ton
c=Chr(Int(Rnd*26+97))
st(i)=st(i)&c
Nextj
Printst(i)
Nexti
EndSub
(2)要求将生成的数组分4行显示。
答:
效果如图5.1所示。
分四行显示,则每行五个元素,可利用Mod取余运算符实现,同时要考虑每个字符的长度不等,可增加空格,以便对齐。
假定字符数组已形成,则程序段如下:
图5.1习题6
(2)运行结果
Fori=1To20
Printst(i);Space(15-Len(st(i)));
IfiMod5=0ThenPrint
Nexti
(3)显示生成的字符数组中字符最多的元素。
答:
该题就是求最长的数组元素,程序段如下:
maxlen=0
maxstr=""
Fori=1To20
IfLen(st(i))Then
maxlen=Len(st(i))
maxstr=st(i)
EndIf
Nexti
Printmaxlen,maxstr
7.简述列表框和组合框的异同处。
答:
相同处都是可存放字符串;不同处在于,组合框是文本框和列表框的组合,可以输入内容,但要通过AddItem方法添加;列表框只能选择项目,不能直接输入内容。
8.列表框或组合框中选中的项目、总和数的属性分别是什么?
答:
表示选中的内容,属性有:
Text:
总项目数的属性为ListCounts。
9.简述自定义类型与自定义变量的区别。
答:
前者仅定义类型,这如同系统提供的Integer、String等基本类型;后者系统为其分配了存储单元。
10.自定义一个职工类型,包含职工号、姓名、工资。
声明一个职工类型的动态数组。
输入n各职工的数据;要求按工资递减的顺序排列,并显示排列的结果,每个职工一行显示三项信息。
答:
PrivateTypezgtype
noAsInteger
nameAsString*10
payAsSingle
EndType
Dims()Aszgtype,n%
PrivateSubForm_Load()
n=InputBox("输入人数")
ReDims(1Ton)
Fori=1Ton
Withs(i)
.no=InputBox("输入职工号")
.name=InputBox("输入职工姓名")
.pay=InputBox("输入职工工资")
EndWith
Nexti
Fori=1Ton–1
Forj=i+1Ton
Ifs(j).pay>s(j-1).payThen
t=s(j):
s(j)=s(j-1):
s(j-1)=t
EndIf
Nextj
Nexti
Fori=1Ton
Prints(i).no,s(i).name,s(i).pay
Nexti
EndSub
常见错误和难点分析
1.Dim数组声明如何解决通用性问题
有时用户为了程序的通用性,用变量来表示数组的上界,如下程序段:
n=Inputbox(“输入数组的上界”)
ReDima(1ton)AsInteger
程序运行时将在Dim语句处显示“要求常数表达式”的出错信息,即Dim语句中声明的数组上、下界必须是常数,不能是变量。
解决程序通用性的问题,一是将数组声明的很大,这样浪费了存储空间:
二是利用动态数组,将上例改变如下:
Dima()AsInteger
n=Inputbox(“输入数组的上界”)
ReDima(1ton)AsInteger
2.数组下标越界
数组下标越界引用了不存在的数组元素,即下标比数组的下标范围大或小。
例如,要形成有如下30项的猆波那契数列:
1,1,2,3,5,8,13,21,34,…,,,
正确的程序如下:
Dima(1to30)Aslong,i%
As
(1)=1:
a
(2)=1
Fori=3to30
a(i)=a(i-2)+a(i-1)
Nexti
若将Fori=3To30改为Fori=1To30,程序运行时会显示“下标越界”的出错信息,因为开始循环时i=1,执行到循环语句:
a(i)=a(i-2)+a(i-1),数组下标i-2、i-1均小于下界1。
同样若将上例:
a(i)=a(i-2)+a(i-1)语句改为:
a(i+2)=a(i)+a(i+1)程序运行时也会显示“下标越界”的出错信息,这时是数组下标大于上界30。
3.数组维数错
数组声明时的维数与引用数组元素时的维数不一致。
例如,下程序段为形式和显示3×5的矩阵:
Dima(3,5)Aslong
Fori=1to3
Forj=1to5
A(i)=i*j
Printa(i);””;
Nextj
Nexti
程序运行到a(i)=i*j语句时出现“维数错误”的信息,因为在Dim声明时是二维数组,引用时是一个下标。
4.Array函数的使用问题
Array函数可方便地对数组进行整体赋值,但此时只能声明Variant的变量或仅由括号括起的动态数组。
赋值后的数组大小由赋值的个数决定。
例如,要将1、2、3、4、5、6、7这些值赋给数组a,表5.1列出了三种错误及对应正确的赋值方法。
表5.1Array函数表示方法
错误的Array函数赋值
改正的Array函数赋值
Dima(1to8)
a=Array(1,2,3,4,5,6,7)
Dima()
a=Array(1,2,3,4,5,6,7)
DimaAsInteger
a=Array(1,2,3,4,5,6,7)
Dima
a=Array(1,2,3,4,5,6,7)
Dima
a=Array(1,2,3,4,5,6,7)
Dima
a=Array(1,2,3,4,5,6,7)
5.如何获得数组的上界、下界
Array函数可方便地对数组进行整体的赋值,但在程序中如何获得数组的上界、下界,以保证访问的数组元素在合法的范围内,可通过Ubound和Llbound函数来实现:
Fori=LBound(a)ToUBound(a)
Printa(i)
Nexti
对于多维数组,要获得指定维的上下界,只要增加一个参数即可,例如:
Dima(3,4,5)Asinteger`声明了三维数组
i=Ubound(a)`获得第1维数组的上界,值为3,默认为第一维
il=Lbound(a,1)`获得第1维数组的上界,值为3
j=Ubound(a,2)`获得第2维数组的上界,值为5
k=Lbound(a,3)`获得第3数组的上界,值为0
6.对数组赋值
VB6.0提供了可对数组进行整体赋值的新功能,方便了数组对数组的赋值操作。
但实际使用时有不少限制。
数组赋值形式如下:
数组名2=数组名1
就此形式作讨论:
这里的数组名2,实际上在前面的数组声明时,只能声明为Variant的变量,赋值后的数组2的大小、维数,类型同数组名1;否则,若声明成动态的数组,例如:
Dim数组名1()或Dim数组名2(下标)
程序在运行到上述赋值语句时显示“不能给数组赋值”的出错信息。
所以,为了程序的安全、可靠,建议还是少用VB6.0的这一新功能,适用传统的循环结构来给数组赋值。
7.自定义类型与数组
自定义类型与数组的区别:
数组是存放一批类型相同的数据集合,通过声明时上下界的值决定数组的大小,通过下标引用数组中各元素;自定义类型是一组相关数据的集合,在定义自定义类型时必须逐一声明自定义类型中的每一个元素,各元素类型可以各不相同,通过指定元素名来引用自定义类型中的某元素。
自定义类型数组常用于存放一组相关的信息集合,例如若干个学生的基本情况。
8.列表框和组合框的Style属性的特点
列表框的Style属性值为0和1,表示列表框的项目前有无复选框形式,如图5.2所示。
组合框Style属性值为0,1和2,分别表示下拉式组合框,简单组合框和下拉式列表框,如图5.3所示。
前两种类型组合了文本框和列表框功能,可以输入内容;后一种仅是列表框的下拉形式显示,不能输入内容。
图5.2列表框图5.3组合框
9.列表框、组合框都有Text和ListIndex,二者有何区别
Text属性只能表示选中的项目内容,不能改变;而ListIndex表示选中项目的下标,通过如下语句可以用“新值”改变项目原内容:
List1.List(List1.ListIndex)=新值
Combox1.List(Combox1.ListIndex)=新值
若:
List1.Text=新值
Combox1.Text=新值
则是没有效果的。
测试题
一、选择题
1.下列数组声明语句,()正确。
A.Dima(3,4)Ainteger
B.Dima(3,4)Asinteger
C.Dima(n,n)Asinteger
D.Dima(34)Asinteger
2.要分配存放如下矩阵的数据,()数组声明语句能实现(不能浪费空间)。
A.Dima(9)AsSingle
B.Dima(3,3)AsSingle
C.Dima(-1To1,-5To-3)AsSingle
D.Dima(-13To-1,5To7)AsSingle
3.如下数组声明语句中,则数a包含的元素个数有()。
Dima(3,-2to2,5)
A.120B.75C.60D.13
4.以下程序的输出结果是()。
Dima
A=Array(1,2,3,4,5,6,7)
Fori=Lbound(a)ToUbound(a)
a(i)=a(i)*a(i)
Nexti
Printa(i)
A.49B.0C.不确定D.程序出错
5.下列语句中(假定变量n有值),能正确声明可调数组的是()。
A.Dima()AsintegerB.Dima()Asinteger
ReDima(n)ReDima(n)AsString
C.Dima()AsintegerD.Dima(10)Asinteger
ReDima(3,4)ReDima(n+10)
ReDimPreservea(4,4)
6.在窗体的通用声明中段自定义了数据类型Students,下列()定义方式是正确的。
A.PrivateTypetudentsB.Typetudents
NameAsString*10NameAsString*10
StudnoAsintegerStudnoAsinteger
EndTypeEndStudents
C.TypetudentsD.Typetudents
NameString*10NameAsString*10
StudnointegerStudnoAsinteger
EndTypeEndType
7.以下程序的输出结果是()。
Optionbase1
Privatesubcommand1-click()
Dima,b(3,3)
A=array(1,2,3,4,5,6,7,8,9)
Fori=1to3
Forj=1to3
B(I,j)=a(i*j)
If(j>i)thenprinttab(j*3);format(b(i,j)),”###“)
Nextj
Nexti
Endsub
A.123B.1C.147D.123
4564524646
7897893699
二、填空题
1.数据声明时下标下界默认为0,利用
(1)语句可以使下标为1。
2.由Array函数建立的数组,其变量必须是
(2)类型。
3.要获得数组的上界通过(3)函数,要获得列表框List数组的元素总个数通过(4)属性。
4.若定义一维数组为Dima(NTOM),则该数组的元素为(5)个。
5.随机产生6位学生的分数(分数是1到100),存放在数组a中,以每2分一个“*”显示,如图5.4所示。
图5.4随机分数界面
Privatesubcommand1_click()
Dima(1to6)
Fori=1to6
A(i)=(6)
Print(7)
Nexti
Endsub
6.在一维数组中利用移动的方法显示如图5.5所示的结果。
Privatesubform_click()
Dima(1to7)
Fori=1to7
A(i)=i:
printa(i);
Nexti
Fori=1to7
t=(8)‘最后1位暂存
Forj=6to1step-1
(9)‘其余六个向右移一位
Nextj
(10)‘暂存的移入最左
Forj=1to7
Printa(j);
Nextj
Nexti
EndSub
图5.5习题6运行界面
7.下面程序对已知数组a,删除数组中数组元素中某个元素。
Privatesubcommand1_click()
Dima(),key%,i%,j%
A=array(1,6,8,3,5,9,10,2,7,4)
Key=val(inputbox(“输入要删除的值”))
Fori=0toubound(a)
If(11)then
Forj=i+1toubound(a)
(12
Nextj
Redim(13)
Msgbox(“删除完成“)
Exitsub
endif
Nexti
Msfbox(“找不到要删除的元素”)
Endsub
8.下列程序表示将输入的一个数插入到按递减的有序数列中,插入后使该序列还有序。
Privatesubform_click()
Dima,i%,n%,m%
a=array(19,17,15,13,11,9,7,5,3,1)
n=Ubound(a)
ReDim(14)
m=val(inputbox(“输入欲插入的数“))
Fori=ubound(a)-1to0step-1
Ifm>=a(i)then
(15)
Ifi=0thena(i)=m
Else
(16)
Exitfor
Endif
Nexti
Fori=0toubound(a)
Printa(i)
Nexti
Endsub
9.下列程序在1000到9999之间查找满足如下条件的整数:
该整数,逆向排列得到的另一个4位数是它自身的倍数(2倍以上)。
查找结果和逆向排列数分别显示在对应的列表框,如图5.6所示。
图5.6习题9运行界面
Privatesubcommand1_click()
Dimnasinteger
Dimmasinteger
Dimiasinteger
Fori=1000to9999
M=o
(17)
dowhilen>0
m=(18)+nmod10
n=n\10
Loop
If(19)andm\i>1then
List1.additemi
List2.additem(20)
endif
nexti
endsub
10.下列程序完成如下功能:
随机产生年(10到30)个大写字母,并显示。
将这n个字母按产生的顺序逆时针排列成一个圆环,按逆时针方向统计相邻的两个字母满足升序的次数(如图5.7)。
并输出符合条件的每对字符和统计结果。
图5.7习题10运行界面
Privatesubform_click()
Dima()asstring,countasinteger,iasinteger,nasinteger
Randomize
Form1.cls
N=int(rnd*20)+10
(21)
Cls
Print“产生的字符”
Fori=1ton
s=(22)
A(i)=s
Prints;””;
Nexti
Print“统计结果”
Count=0
Fori=2ton
If(23)then
Count=count+1
Printa(i-1);””;a(i)
Endif
Nexti
If(24)Then
Count=count+1
PrintA
(1);””;A(n)
Endif
Print“符合条件的字符有:
”;(25)
Endsub
11.本程序随机产生n(15)个A到J的大写字母,按字母降序排序后,将连续出现的字母用压缩形式显示。
例如,连续5个H显示为5*H,参见图5.8。
数组a()用于存放随机产生的字母。
图5.8习题11运行界面
Privatesubcommand1_click()
Constn=15
Dima(1toN)asstri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB第5章 复习资料 VB