visual basic第六章.docx
- 文档编号:13583783
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:25
- 大小:47.36KB
visual basic第六章.docx
《visual basic第六章.docx》由会员分享,可在线阅读,更多相关《visual basic第六章.docx(25页珍藏版)》请在冰点文库上搜索。
visualbasic第六章
第6章数组
前面各章使用的变量均为简单变量。
在处理某些实际问题时,使用简单变量很不方便,甚至难以胜任。
例如,成批数据的排序,找出高于或低于平均值的数据等。
6.1数组的概念
6.1.1数组与数组元素
数组—─用一个统一的名称表示的、顺序排列的一组变量.
将若干个具有相同性质的变量组合在一起形成的变量表格。
数组名—─变量表格的名称,数组的命名与简单变量的命名规则相同。
数组元素(下标变量)—─数组中的变量。
下标—─变量在表格中的存放位置。
可以用数组名及下标惟一地识别一个数组的元素。
例如:
S(5)代表数组S中的下标为5的数组元素。
其中:
S是数组名,5是下标。
注意:
(1)下标必须用括号括起来。
S(5)是一个下标变量,而S5是一个简单变量。
(2)下标可以是常量、变量或表达式,还可以是下标变量。
例如:
例:
设A=2,A1=3,B=1,C=4。
根据给出的数组X写出下列下标变量的值。
X
(1)
57
X
(2)
42
X(3)
18
X(4)
98
X(5)
76
X(6)
6
解:
1.X(3)=18
2.X(C)=X(4)=98
3.X(A+A1)=X(5)=76
4.X(X(A+C)-A1)=X(X(6)-A1)=X(3)=18
(3)下标为整数,否则将自动取整(舍去小数部分)。
(4)下标的最大值和最小值分别称为数组的上界和下界。
6.1.2数组的类型
与简单变量一样,可以声明任何基本数据类型的数组,以及用户自定义类型和对象类型的数组。
但在同一个数组中,所有元素的类型相同(除了Variant类型)。
6.1.3数组的维数
数组的维数—─描述元素在数组中的位置所需的下标个数。
一维数组—─数组元素用一个下标表示。
二维数组—─数组元素用两个下标表示。
例如,记录30个学生,每个学生5门课程的成绩(灰色部分)。
语文
数学
外语
物理
化学
学生1
85
60
55
78
88
学生2
69
74
80
76
79
学生3
77
86
72
80
95
…
…
…
…
…
…
学生30
88
90
75
88
82
如果数组的名称为S,则有:
S(i,j)表示第i个学生、第j门课程的成绩。
VisualBasic最多可以使用16维的数组。
数组的三要素—─类型、维数、每维下标的范围。
6.1.4数组的形式
固定大小的数组——数组中元素的个数固定不变。
动态数组——经重新声明后,可以改变数组的大小(下标范围)。
6.2固定大小的数组
6.2.1数组的声明
一、变量的作用范围
工程级(全局)变量——在整个工程的所有模块中有效。
窗体级(模块级)变量——在声明变量的窗体内的所有过程中有效。
过程级变量——仅在声明变量的过程内有效。
例如,声明窗体级变量:
在窗体顶部的声明段中:
DimaAsInteger'或PrivateaAsInteger
过程代码:
PrivateSubCommand1_Click()
'DimaAsInteger'此语句将变量a声明为私有变量
a=12
EndSub
PrivateSubCommand2_Click()
Printa&"byCommand2"
EndSub
PrivateSubCommand3_Click()
Printa&"byCommand3"
EndSub
例如,声明全局变量:
在标准模块的声明段中:
PublicaaAsInteger
Form1中的代码:
PrivateSubCommand1_Click()
aa=12
Form2.Show
EndSub
Form2中的代码:
PrivateSubCommand1_Click()
Printaa
EndSub
二、数组的声明
1.建立公用数组(全局)
在标准模块的通用段用Public语句声明数组:
Public数组名(维数定义)[As类型]
(教材图6-1有错)
2.建立模块级数组(窗体级)
在窗体的通用段用Private或Dim语句声明数组:
Private|Dim数组名(维数定义)[As类型]
3.建立局部(过程级)数组
在过程中用Dim语句声明数组:
(不能使用Private,教材中有错)
Dim数组名(维数定义)[As类型]
说明:
(1)数组名:
遵循标准的变量命名约定。
(2)维数定义:
指定数组的维数以及各维的范围。
[下标下界1To]下标上界1[,[下标下界2To]下标上界2]……
缺省“下标下界”时,下标的下界由OptionBase语句控制。
缺省OptionBase语句时,则缺省的下界为0。
例如:
Dima(8)AsInteger等同于Dima(0To8)AsInteger
例如:
OptionBase1
Dima(8)AsInteger等同于Dima(1To8)AsInteger
例如:
Dimb(30,5)AsSingle等同于Dimb(0To30,0To5)AsSingle
可以使用具有一定意义的下标,例如:
DimStudent(1980To2000)AsInteger
6.2.2数组的使用
使用数组时,应注意以下几点:
(1)对数组元素的操作如同对简单变量的操作。
(2)在声明数组时,VB已经对数组进行初始化(数值型数组的元素值初始化为0,字符型数组的元素值初始化为空等)。
(3)数组名、数组类型和维数必须与数组声明时一致。
(4)下标值不可越界(在声明数组时指定的范围内)。
(5)在同一过程中,数组与简单变量不能同名。
【例6.1】统计选票问题。
设有20个候选人,代号分别为1,2,3……20。
设-1为数据结束标记。
PrivateSubCommand1_Click()
x=InputBox("请输入选票")
DoWhilex<>-1
SelectCasex
Case1
a1=a1+1
Case2
a2=a2+1
Case3
a3=a3+1
Case4
a4=a4+1
'……省略了Case5~Case20这16个分支
EndSelect
x=InputBox("请输入选票")
Loop
List1.AddItem"No1"&a1
List1.AddItem"No2"&a2
List1.AddItem"No3"&a3
List1.AddItem"No4"&a4
'……省略了a5~a20这16个输出语句
EndSub
有了数组,代码如下:
PrivateSubCommand1_Click()
Dima(1To20)AsInteger
x=InputBox("请输入选票")
DoWhilex<>-1
a(x)=a(x)+1
RemIfx>=1Andx<=20Thena(x)=a(x)+1
x=InputBox("请输入选票")
Loop
Fori=1To20
List1.AddItem"No"&i&""&a(i)
Nexti
EndSub
如果采用数据文件,代码如下:
PrivateSubCommand1_Click()
Dima(1To20)AsInteger
Open"d:
\xp.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,x
a(x)=a(x)+1
Loop
Close#1
Fori=1To20
List1.AddItem"No"&i&""&a(i)
Nexti
EndSub
【例6.2】随机产生10个[100,300]之间的整数,找出其最大值、最小值和平均值,统计高出平均值的数据个数。
(教材P.126【例6.1】)
窗体通用段代码:
Constn=10
Dima(1Ton)AsInteger
DimAverAsSingle
产生数据:
PrivateSubCommand1_Click()
List1.Clear
Randomize
Fori=1Ton
a(i)=100+Int(Rnd*201)
List1.AddItema(i)
Nexti
EndSub
查找最大数、最小数和平均值:
PrivateSubCommand2_Click()
Max=a
(1):
Min=a
(1):
Sum=a
(1)
Fori=2Ton
Sum=Sum+a(i)
Ifa(i)>MaxThenMax=a(i)
Ifa(i) Nexti Aver=Sum/n Text1.Text=Max Text2.Text=Min Text3.Text=Aver EndSub 统计超出平均值的数据个数: PrivateSubCommand3_Click() Fori=1Ton Ifa(i)>AverThenc=c+1 Nexti MsgBox"超出平均值的数据有"&c&"个" EndSub 【例6.3】斐波纳奇(Fibonacci)数列问题(要求产生数列的前15项)。 (教材P.129【例6.3】) 事件代码: PrivateSubCommand1_Click() Dimf(15)AsInteger List1.Clear f (1)=1: f (2)=1 List1.AddItemf (1) List1.AddItemf (2) Fori=3To15 f(i)=f(i-1)+f(i-2) List1.AddItemf(i) Next EndSub 【例6.4】设有一个5×5的方阵,其中元素为随机产生的一位整数。 求: (教材P.130【例6.4】) (1)主对角线与次对角线上元素之和(分别求出)。 (2)各行元素之和。 (3)各列元素之和。 (3)方阵中最大的元素。 分析: (1)主对角线与次对角线上元素的下标特征。 (2)如何求各行元素之和、各列元素之和。 (3)如何求方阵中最大的元素。 编写代码: PrivateSubCommand1_Click() '声明数组 Dima(1To5,1To5)AsInteger '数组元素赋值 Randomize Fori=1To5 Forj=1To5 a(i,j)=10+Int(Rnd*90) Printa(i,j); Nextj Print Nexti '求两条对角线上的元素之和(方法一) Fori=1To5 d1=d1+a(i,i) d2=d2+a(i,6-i) Nexti Printd1,d2 '求两条对角线上的元素之和(方法二) d1=0: d2=0 Fori=1To5 Forj=1To5 Ifi=jThend1=d1+a(i,j) Ifi+j=6Thend2=d2+a(i,j) Nextj Nexti Printd1,d2 '求各行元素之和 Fori=1To5 Sum=0 Forj=1To5 Sum=Sum+a(i,j) Nextj PrintSum; Nexti Print '求各列元素之和 Forj=1To5 Sum=0 Fori=1To5 Sum=Sum+a(i,j) Nexti PrintSum; Nextj Print '求数组中最大元素及其位置 Max=a(1,1): row=1: col=1 Fori=1To5 Forj=1To5 Ifa(i,j)>MaxThen Max=a(i,j) row=i: col=j EndIf Nextj Nexti PrintMax,row,col EndSub 补充: 求 PrivateSubCommand2_Click() DimxAsSingle n=0: tn=1: s=1 x=InputBox("") Do n=n+1 tn=tn*x/n s=s+tn LoopUntiltn<0.00001 Prints EndSub 6.2.3排序问题 一、比较法排序(直接排序) 设有10个数,存放在数组A中: A (1) A (2) A(3) A(4) A(5) A(6) A(7) A(8) A(9) A(10) 67 42 47 14 51 27 40 37 88 71 (讲解比较法排序的算法) 【例6.5】由计算机产生10个两位随机整数,并将这些数按由小到大的顺序排列(教材【例6.6】)。 编写代码: PrivateSubCommand1_Click() Dima(1To10)AsInteger Randomize Print"原数组: " Fori=1To10 a(i)=Int(Rnd*90)+10 Printa(i); Nexti Print '排序 Print"排序后的数组: " Fori=1To9 Forj=i+1To10 Ifa(i)>a(j)Then t=a(i): a(i)=a(j): a(j)=t EndIf Nextj Nexti '输出数组 Fori=1To10 Printa(i); Nexti Print: Print EndSub (讨论: 如何将输出合并到排序循环中) 6.3动态数组 作业: P.156—3,4,6,7,9 如果希望在运行时能够改变数组的大小,就要用到动态数组。 例如,将【例6.5】改为“由计算机产生n个两位随机整数,并将这些数按由小到大的顺序排列”。 6.3.1创建动态数组 创建动态数组的步骤: (1)用Public、Dim或Static语句声明一个空维数组。 (删除教材P.141第4行“在过程中”4个字) (2)用ReDim语句分配实际的元素个数(维数和每维下标范围)。 ReDim语句的格式与Dim语句相同,但通常不必指定数组的类型(数组的类型应在声明空维数组时确定) 【例6.6】由计算机产生n个两位随机整数,并将这些数按由小到大的顺序排列。 编写代码: PrivateSubCommand1_Click() Dima()AsInteger'声明空维数组 n=InputBox("请输入数据的个数") ReDima(1Ton)'确定维数及每维下标范围 '给数组赋值 Randomize Fori=1Ton a(i)=Int(Rnd*90)+10 List1.AddItema(i) Nexti '排序并输出 Fori=1Ton-1 Forj=i+1Ton Ifa(i)>a(j)Then t=a(i): a(i)=a(j): a(j)=t EndIf Nextj List2.AddItema(i) Nexti List2.AddItema(n) EndSub 说明: (1)ReDim是一个可执行语句,因此,只能出现在过程中。 (2)ReDim语句可以改变数组的维数、上界和下界,但是,不能改变数组的类型。 (3)执行ReDim语句后,原先存储在数组中的数据将全部丢失。 为了保留数组中的原有数据,可以在ReDim语句中使用Preserve关键字(参考教材6.3.2),例如: ReDimPreserveA(1to20) 【例6.7】编程序,输出杨辉三角形(教材【例6.11】)。 分析: 杨辉三角形中的各行是二项式(a+b)n展开式中各项的系数。 其中,每行的第一列和斜边线上的元素值均为1,其余各项的值都是其上一行中前一列元素与上一行中同列元素之和,即: 编写代码: PrivateSubCommand1_Click() Dima()AsInteger,nAsInteger n=InputBox("请输入杨辉三角形的行数","输入",10) ReDima(n,n) Cls Fori=1Ton a(i,1)=1: a(i,i)=1 Next Fori=3Ton Forj=2Toi-1 a(i,j)=a(i-1,j-1)+a(i-1,j) Next Next Fori=1Ton Forj=1Toi PrintTab(j*5);a(i,j); Nextj Print Nexti EndSub 教材P.142【例6.11】的代码: PrivateSubText1_KeyPress(KeyAsciiAsInteger) Dima()AsInteger DimnAsInteger IfKeyAscii=13Then n=Text1.Text ReDima(n,n) Fori=1Ton a(i,1)=1: a(i,i)=1 Next p=Format(1,"! @@@@@")&Chr(13) p=p&Format(1,"! @@@@@")&Format(1,"! @@@@@")&Chr(13) Fori=3Ton p=p&Format(a(i,1),"! @@@@@") Forj=2Toi-1 a(i,j)=a(i-1,j-1)+a(i-1,j) p=p&Format(a(i,j),"! @@@@@") Next p=p&Format(a(i,i),"! @@@@@")&Chr(13) Next MsgBoxp,0,"杨辉三角形" EndIf EndSub 修改以上代码,可以更清楚地看到如何产生杨辉三角形。 6.4控件数组 6.4.1控件数组的概念 控件数组是一组具有共同名称和类型的控件。 一个控件数组至少应有一个元素,其成员具有相同的事件过程。 控件数组的成员具有: (1)相同的名称(Name)。 (2)以下标——索引值(Index)来识别各个控件。 6.4.2控件数组的建立 在设计阶段,创建控件数组的方法有3种: (1)将相同名字赋予多个控件。 用这种方法创建的控件数组,其成员仅仅共享数组的Name属性,其他属性与最初画出控件时的值相同。 (2)复制现有的控件并将其粘贴到窗体上。 利用复制、粘贴的功能建立的控件数组,其成员的大部分属性与第一个控件相同。 (3)将控件的Index属性设置为非Null数值,然后利用前两种方法之一添加控件数组的成员。 6.4.3控件数组的使用 控件数组共享同样的事件过程,在程序运行中,可以利用返回的索引值来识别事件是由哪个控件所引发的。 【例6.8】创建一个具有3个成员的标签控件数组,输入如下代码: PrivateSubLabel1_Click(IndexAsInteger) i=Index Label1(i).Left=360 Label1(i).FontSize=18 Label1(i).AutoSize=True SelectCasei Case0 Label1(i).Top=120+i*760 Label1(i).Caption="Welcome" Label1(i).ForeColor=vbRed Case1 Label1(i).Top=120+i*760 Label1(i).Caption="Welcome" Label1(i).ForeColor=vbGreen Case2 Label1(i).Top=120+i*760 Label1(i).Caption="Welcome" Label1(i).ForeColor=vbBlue EndSelect EndSub 可以在运行时创建控件数组中新的成员,步骤: (1)用Load语句将新的控件加载到内存中。 (2)将该控件的Visible属性设置为True。 例如: 为了在运行时添加控件,可在上例的基础上增加如下代码: PrivateSubCommand1_Click() n=Label1.Count LoadLabel1(n) Label1(n).Left=360 Label1(n).Top=120+n*760 Label1(n).Visible=True Label1(n).Caption="Welcome"&Label1.UBound EndSub 说明: 1.Lbound、Ubound属性分别返回控件数组中控件的最小、最大索引值。 2.函数LBound(数组名,维数),UBound(数组名,维数)分别返回数组中指定维的最小、最大下标值。 例如: Dima(10To40) PrintLBound(a),UBound(a) Dimb(1To40,-4To20) PrintLBound(b,1),UBound(b,1) PrintLBound(b,2),UBound(b,2) 【例6.9】简易计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- visual basic第六章 basic 第六