第5章数组案例Word文档格式.docx
- 文档编号:20600501
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:40
- 大小:445.32KB
第5章数组案例Word文档格式.docx
《第5章数组案例Word文档格式.docx》由会员分享,可在线阅读,更多相关《第5章数组案例Word文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
省略[As类型]则概念的数组为变体数组
概念了一个数组就在内存中分派了一组持续的存储单元。
如Dims(1to50)Integer的内存分派情形如下:
s
(1)
s
(2)
s(3)
……
s(49)
s(50)
2.数组的大体操作
(1)数组的输入
①利用循环结构别离给数组元素赋值。
数据的输入能够通过InputBox函数或文本框等
例如:
②在一维数组中利用Array函数为数组元素赋值,其格式为:
数组名=Array(数组元素值)
Dims()
s=Array(1,2,3,4,5)
将1,2,3,4,5这5个数赋值给数组s即s(0),s
(1),s
(2),s(3),s(4)的值别离为1,2,3,4,5。
③数组名到数组名的直接赋值。
Dima(),b()
a=Array(1,2,3,4,5)
b=a
将数组a的值1,2,3,4,5赋值给数组b相应的元素。
(2)ForEach...Next语句
ForEach...Next语句类似于For...Next语句,用来指定重复次数的一组操作。
但ForEach...Next语句专门用于数组和集合。
其一般格式为:
ForEach成员In数组
循环体
[ExitFor]
Next[成员]
其中,“成员”是一个变体变量,代表数组元素;
“数组”为已概念的数组名。
循环体语句对数组中的每一个元素进行处置。
Dims(1to5)
ForEachxins
printx;
Nextx
数组s由5个元素组成,语句重复执行输出数组元素x的操作5次。
(3)数组的输出
用循环结构或ForEach...Next语句。
【实例】输入大赛选手的姓名和成绩,输出成绩列表。
窗体运行界面如图5-1所示。
(1)实例要求
“姓名”(txtname)文本框用于输入选手姓名;
“成绩”(txtscore)文本框用于输入选手相应的成绩;
单击“显示”(cmdshow)按钮,列表框(lstscore)显示选手成绩单。
“排序”按钮的事件进程将在实例2中完成。
列表框的利用参见本章节。
图5-1成绩窗体运行界面
(2)实例目的
掌握一维数组的输入方式及列表框的利用。
(3)实例界面属性设置
“成绩”窗体及主要对象属性值见表5-1。
属性设置中别离设置两个用于输入数据的文本框的TabIndex属性为0和1;
其它可响应Tab键的控件的TabStop属性为False即不可用Tab选择这些对象,如此Tab只在两个文本框之间移动,从而可用Tab键的移动配合数据输入。
表5-1窗体及主要对象属性值
对象
属性名
属性值
说明
Form1
Caption
成绩
窗体的标题
Text1
(名称)
txtname
代码中标识文本框的名称
MaxLength
10
文本框中输入最大字符数
TabIndex
响应Tab键的顺序
Text2
txtscore
1
Command1
cmdshow
代码中标识按钮的名称
显示
按钮名称
TabStop
False
不可用Tab键选择此对象
Command2
Cmdsort
排序
List1
lstscore
代码中标识标签的名称
Font
宋体,五号
列表框字体
(4)实例代码分析及编写:
本例的代码由两部份组成。
第一部份是将选手的姓名和成绩别离存入数组nem和score;
第二部份是显示选手的成绩于列表框lstscore中。
选手的姓名和成绩别离存入数组nem和score。
通过文本框失去核心事件进程完成数组的赋值。
●焦点是接收用户鼠标和键盘输入的能力。
当一个对象具有焦点时,它可以接收用户的输入。
当对象得到焦点时,会产生GotFocus事件;
当对象失去焦点时,将产生LostFocus事件。
LostFocus事件过程常用来对更新进行确认和有效性检查,也可用于修正或改变在GoFocus事件过程中设立的条件
●Tab顺序是在按Tab键时焦点在控件间移动的顺序。
Tab顺序由控件建立的先后顺序确定,但在程序设计阶段可以用TabIndex属性来改变Tab顺序。
如果控件的TabStop属性值设置为False,则在用Tab移动焦点时会跳过该控件。
代码段如下:
●数组赋值
Dimnam(9)AsString,score(9)AsSingle,bAsBoolean,iAsInteger,jAsInteger
ConstN=9
PrivateSubtxtname_LostFocus()
If<
>
"
"
Then
nam(i)=
Else
nam(i)="
*"
EndIf
i=i+1
Ifi>
NThen=False'
下标出界后,文本框将不得输入
PrivateSubtxtscore_LostFocus()
score(j)=Val
score(j)=0
j=j+1
="
Ifj>
●列表框lstscore中显示选手的成绩
PrivateSubcmdshow_Click()
DimiAsInteger
Ifb=FalseThen'
控制添加一组项目的操作,只允许一次。
当b的值为False时(逻辑变量b的默许
值为False)添加一组项目,添加一组项目后改变b的值为true.
Fori=0ToN
Space$(3)+nam(i)+Space$(7)+Str$(score(i))
'
添加项目到列表框。
函数Space$(N)的值为N个空格。
b=True
【实例】单击“排序”(cmdsort)按钮,将实例中的选手成绩按降序排列。
排序结果界面见图5-2。
图5-2排序结果
(1)实例目的
掌握选择排序方式,熟悉Split(C,D)函数的利用。
(2)实例代码分析及编写
排序是将一组数按必然的顺序(升序或降序)排列。
常常利用的排序算法有:
冒泡法、选择法、插入法、归并排序等。
本例选用选择排序法。
●选择排序法
以数组元素score(0),score
(2),score(3),……,score(8),score(9)的降序排序为例。
选择排序的思想是:
第一在score(0),score
(2),score(3),……,score(8),score(9)当选择值最大的元素,然后将此元素的值与score(0)的值互换,如此数组的第一个位置上即score(0)中寄存这组数中的最大值;
一样,在score
(1),score
(2),……,score(8),score(9)当选择值最大的元素,然后将此元素的值与score
(1)的值互换;
……;
在score(i),score(i+1),……score(8),score(9)当选择值最大的元素,然后此元素的值与score(i)的值互换(i=0,2,…8),如此,数组就成为有序数组。
也就是重复“选择一组数中值最大的元素,然后此元素的值与这组数中的第一个元素的值互换”的操作9次,可用循环结构实现。
如此,选择排序的大体框架为:
Fori=0To8
选择score(i),score(i+1),……score(8),score(9)中值最大的元素,然后此元素的值与score(i)的值互换。
Nexti
下一步的工作是细化循环体:
“选择score(i),score(i+1),……score(8),score(9)中值最大的元素,然后将其与score(i)互换值”。
选择score(i),score(i+1),……score(8),score(9)中值最大的元素,是求最大值问题。
可是,这里找“值最大的元素”,涉及两个问题,一是“值”的问题,二是“元素”的问题即下标的问题(在数组顶用下标区分数组元素)。
因此,在求最大值的进程中需要记录最大值所在的位置即下标。
咱们用下面程序段实现。
'
求出最大值
maxs=score(i);
maxs为最大元素。
Forj=i+1To9
Ifscore(j)>
maxsthen
maxs=score(j)
max=j'
max为最大元素的下标
Nextj
互换最大值所在元素的值与score(i)
t=score(i):
score(i)=score(max):
score(max)=t
若max为最大元素下标,则score(max)为最大元素。
那么,在上程序段中的maxs就可以够用score(max)来代替。
从而以上程序段能够简化为:
max=i'
max为最大元素的下标,即最大元素为score(max)。
ifscore(j)>
score(max)thenmax=j
t=score(i):
score(i)=score(max):
如此,完整的选择排序程序段为:
max=i;
Forj=i+1To9
Ifscore(j)>
t=score(i):
●“排序”按钮代码的编写。
由于排序的对象是列表框中的数据,所以第一需要将列表框中的数据赋值给到数组,然后对数组排序,最后再将排好序的数据输出到列表框。
①列表框中的数据赋值给数组。
由于列表项是字符串,所以需要将字符串中的数据分离,然后别离赋值给数组nam和score。
列表项字符串为列表属性list数组元素(i),i=0,1,……9;
分离数组元素用函数Split(C,D),其功能是将字符串C按分割符D分割成字符数组。
该数组不能是定长数组,数组的上界通过Ubound函数取得。
liststr=LTrim$(i))'
去掉列表项(i)中左侧的空格
s=Split(liststr,"
)'
将列表项字符分割成字符数组。
分割符是7个空格,由于列表项中姓名和成绩之间由7个空格分隔。
nam(i)=s(0)
score(i)=Val(s
(1))
②数组排序。
成绩按降序排列。
由于成绩和姓名相关,故在排序中姓名所在的数组nam的元素与成绩score的元素同步互换。
Fori=0ToN-1
max=i
Forj=i+1ToN
Ifscore(j)>
score(max)Thenmax=j
t=score(i):
score(i)=score(max):
score(max)=t
st=nam(i):
nam(i)=nam(max):
nam(max)=st
③排好序的数据输出到列表框。
第一用列表框方式Clear清空列表框,然后将数组元素的值依次赋值给列表框的属性List。
代码如下:
(i)=Space$(3)+nam(i)+Space$(7)+Str$(score(i))
3.二维数组
有两下标的数组称为二维数组。
二维数组的声明形式如下:
Dim数组名(下标1,下标2)[As类型]
(1)下标1和下标2的规定与一维下标相同。
如,Dima(2,3)AsInteger概念二维数组a,数组的元素为:
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)
3行4列共12个元素。
常常利用二维数组处置表格或矩阵。
下标1肯定二维表格的行数故称为行标,下标2肯定二维表格的列数故称为列标。
处置两维数组通常常利用双重循环。
(2)二维数组数组概念后,在内存中占持续的存储单元。
存储单元按行持续,如数组a的存储结构为:
(3)OptionBasen语句,其中n能够取1或0。
当n为1时,能够使所有概念时省略下界的数组的初始下标从1开始;
为0下标从0开始。
此语句必需出此刻数组声明之前,且位于所有事件进程的前面。
其作用范围仅限于出此刻同一代码窗口的未声明下界的数组。
一个代码窗口中OptionBasen语句只能出现一次。
【实例】输入10个学生某门课程的平时成绩,期中考试成绩和期末考试成绩,依照平时成绩占15%,期中成绩占25%,期末成绩占60%的比例,计算出10个学生此门课程的最后成绩。
实例运行界面如图5-3所示。
图5-3学生成绩表运行界面
(1)实例设计要求
输入一条数据到文本框(txtin)中,数据之间用逗号分割,单击“录入”按钮(cmdin)完成一条数据的录入或当“录入”按钮或取得核心后按回车。
单击“学生成绩表”框架中的文本框(txttable)显示学生各项成绩及最后成绩。
了解大量数据输入的方式及处置的方式。
掌握二维数组的输入输出及简单运算。
(3)实例界面属性设置:
主要控件属性值见表5-2
表5-2窗体及主要对象属性值
学生成绩表
Txtin
Text
按顺序输入,各输入项之间用逗号分割
文本框中的文本
响应Tab键顺序
txttable
单击显示学生成绩
Multiline
True
文本框可接受多行文本
ScrollBars
2-Vertical
文本框具有垂直滚动条
不可用Tab键选定文本框
Cmdin
录入
(4)实例代码编写分析:
●“录入”按钮(cmdin)代码。
这组代码的主要功能是将文本框(txtin)中的数据分离到数组。
代码段中数组studentn用来存下学生的姓名和学号,students中下学生的成绩。
OptionBase1
Dimstudentn(10,2)AsString,students(10,4)AsSingle
ConstM=10,N1=2,N2=4
PrivateSubcmdin_Click()
Dims()AsString
Ifi<
=MThen
s=Split,"
"
studentn(i,1)=s(0)
studentn(i,2)=s
(1)
Forj=1ToN2-1
students(i,j)=s(j+1)
=False
●文本框(txttable)代码。
这组代码由两部份组成,一是计算“最后成绩”,存放在数组students的最后一个元素中,二是将二维数组studentn和students输出到文本框(txttable)中。
用双重循环结构完成两维数组的输出,由于按行输出,所以外循环控制行,内循环控制列。
在两维数组处置进程中,若是输出按列,则通常外循环用来控制列,内循环用来控制行。
PrivateSubtxttable_Click()
DimiAsInteger,jAsInteger
DimtstrAsString
计算“最后成绩”
Fori=1ToM
students(i,4)=students(i,1)*+students(i,2)*+students(i,3)*
输出数组到文本框
Forj=1ToN1
tstr=tstr+studentn(i,j)+Space$(10-Len(studentn(i,j)))
Nextj
Forj=1ToN2
tstr=tstr+str$(students(i,j))+Space$(10-Len(str$(students(i,j))))
=tstr+Chr$(13)+chr$(10)
●其它代码。
此代码的功能是当文本框(txin)或得核心后,文本框中内容呈选定状态。
如此方便输入新的内容。
PrivateSubtxtin_GotFocus()
=0'
选定的开始位置,第一个字符的位置是零
=Len'
选定的长度
5.1.2动态数组
动态数组是指在程序运行期间能够改变其大小的数组。
动态数组也必需先声明后利用,可是在声明时不用指出其大小(只写括弧,省略上下界),能够在程序运行中按照需要利用ReDim语句随时指定从而有效地利用存储空间。
系统在编译时为静态数组分派存储单元,而动态数组的存储空间是在程序运行时才开辟,即当执行到ReDim语句时分派存储空间。
成立动态数组的方式:
(1)用Dim、Private、Public语句声明。
(2)在进程顶用ReDim语句指明数组的大小,形式如下:
ReDim数组名(下标1[,下标2……])
其中,下标能够使常量,也能够是已有肯定值的变量。
(1)在进程能够多次利用ReDim来改变数组的大小,也能够改变数组的维数。
(2)利用ReDim语句会使原来数组中的值丢失,能够在ReDim语句后加Preserve参数用来保留数组中的数据,但利用Preserve后只能改变最后一维的大小。
在下面的程序中第一成立了动态数组s,大小为程序运行中输入的值n(运行中输入n的值为4);
然后改变s的大小为n+1,而且加参数Preserve保留原数组中的数据;
最后改变s的维数,使其由一维成为两维,但原值丢失。
注意,不可同时改变维数和保留原数组中的数据。
图5-4为运行界面。
图5-4动态数组示例界面
PrivateSubForm_Click()
DimnAsInteger
输入学生人数
n=InputBox("
请输入学生人数"
)
ReDims(n)
Fori=1Ton
s(i)=InputBox("
输入学生姓名"
PrintSpc
(2);
s(i);
Spc
(2);
Next
Print"
改变数组的大小且保留数组中的值"
ReDimPreserves(n+1)
Fori=1Ton+1
改变数组的维数,原数组值丢失"
ReDims(n,3)
s(i,1);
【实例】自概念数据类型完成实例3。
(1)实例目的:
熟悉自概念数据类型。
(2)实例代码设计:
实例3中处置的数据中既有字符(姓名,学号),又有数值(成绩),所以声明了两个数组别离用来处置字符串和数值。
若是自概念数据类型,那么实例3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 案例