第05章 数组与过程_第1页
第05章 数组与过程_第2页
第05章 数组与过程_第3页
第05章 数组与过程_第4页
第05章 数组与过程_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章数组与过程学习要点掌握数组的概念区分静态数组和动态数组掌握数组的基本操作(数组元素的输入、输出、排序)掌握控件数组的建立与应用了解二维数组的使用5.1数组的概念

5.1.1数组和数组元素数组由下标变量名和圆括号组成。括号中有一个下标时,叫做一维下标变量,例如:S(1),S(10)

括号中有两个下标时,叫做二维下标变量,例如:A(1,2)。括号中有三个下标时,叫做三维下标变量,例如:C(1,2,2)等。静态数组1.静态数组的声明数组声明的语法格式:Public|Private|Dim}数组名(下标)[As类型]下标的格式:[下界1To]上界1[,[下界2To]上界2]…)例如:DimA(2)AsDouble一维数组A,共有三个双精度元素,分别为A(0)、A(1)、A(2)。

DimB(-2To2)AsSingle一维数组B,共有5个单精度元素,分别为B(-2)、B(-1)、B(0)、B(1)、B(2)。

DimC(2,1To2)AsInteger二维数组C,共有6个整型元素,分别为C(0,1)、C(0,2)、C(1,1)、C(1,2)、C(2,1)、C(2,2)。

DimD(1,1)AsDouble

二维数组D,共有4个双精度元素,分别为D(0,0)、D(0,1)、D(1,0)、D(1,1)。

动态数组

与静态数组对应的是动态数组,即数组元素个数不定的数组。若事先不知道数组的大小,并希望在运行时可以根据需要改变数组的大小(或大小不断改变),这时就要使用动态数组。

动态数组与静态数组不同的是:动态数组灵活、经济、可伸缩,可在任何时候改变数组的大小,从而不会浪费内存。2.动态数组的声明

数组声明的语法格式:

{Public|Private|Dim}数组名()[As类型]

2.创建动态数组的步骤1)声明一个空维数表的数组(不必说明维数和界限)。

例如:DimX()AsInteger。2)在需要指定数组大小时,再使用ReDim语句分配数组中实际元素个数。例如:ReDimX(50,50)。动态数组ReDim语法格式:

ReDim[Preserve]数组名(下标)[As类型]其中:(1)ReDim语句中的[As类型]可以省略,若不省略则必须要和数组声明中的类型一致。(2)使用ReDim相当于数组被重新初始化,原来的数据将全部丢失。(3)Preserve表示再次使用ReDim语句改变数组大小时保留数组中原来的数据,但Preserve只能改变多维数组中最后一维的上界,否则运行程序报错。(4)ReDim

语句用来更改某个已声明维数或大小的数组。如果有一个较大的数组,并且不再需要它的某些元素,ReDim

可通过减小数组大小来释放内存。另一方面,如果代码确定某个数组需要更多元素,也可使用ReDim语句来实现。动态数组5.1数组的概念

5.1.2数组说明语句1.数组说明语句的格式Dim<数组名>([a1To]a2[,[b1To]b2][,…])[As<类型>]或者Dim<数组名><类型符>([a1To]a2[,[b1To]b2][,…])

VisualBasic还允许用OptionBase来指明下界是0还是1。具体的格式为:OptionBase0'数组的下界是0OptionBase1'数组的下界是15.1数组的概念

5.1.2数组说明语句2.功能该语句能为数组定义维数、每维的上界值、下界值和数组的类型。5.1数组的概念

5.1.3数组赋值函数函数Array()被叫做数组赋值函数。

1.格式为:数组变量名=Array(常量列表)2.功能该函数的功能就是将常量列表中的常量依次赋给一个一维数组的对应元素。

3.说明:格式中的数组变量应该被定义为变体变量;数组的上下界值可以通过LBound和UBound函数得到。5.1数组的概念

5.1.4动态数组创建动态数组,可以按照以下步骤执行:(1)和普通数组的声明一样使用Dim语句给数组赋予一个空维数表。(2)使用时用ReDim语句重新分配数组的实际元素个数。

ReDim语句的具体语法格式如下:ReDim[Preserve]<数组名>(<维数定义>)[As类型]5.1数组的概念

5.1.4动态数组说明:1)ReDim语句用来定义或重定义动态数组的大小。2)在执行ReDim语句时,如果使用了Preserve关键字,则在重定义数组最末维的大小同时仍保留数组中的原有内容;如果未使用Preserve关键字,则数组中存放的所有当前值就会消失。5.1数组的概念例5.1用冒泡法排序法对5个无序的数从小到大排序。

分析:冒泡法排序也叫下沉法排序。其思路是在一列数中从前往后每次将两两相邻的数进行比较,然后将小的数调换到前面,大的放到后面。经过第一轮两两比较后,最大的数就排到最后的位置上。然后再从第一个数至倒数第二个数之间开始新一轮的两两比较、调换后,第二大的数已排在倒数第二的位置上。然后再开始新一轮的比较,依此类推,直至所有数从小到大排好队。

数组的排序1.冒泡法排序原则 冒泡法排序模拟水中气泡的排放规则,使份量“较轻”(值较小)的气泡浮到上面,份量“较重”(值较大)的气泡沉到下面,对每一趟排序,从第一个元素开始,按照规则调整相邻元素的大小关系,确定一个最大(或最小)的气泡的位置.

冒泡法排序如:有数组a:41865,使用冒泡法从小到大排序

第一趟排序:41865148651486514685146584186514865148651468514658

经过第一趟排序的四次调整后,使五个数的最大值8放在最后一个位置,这个位置是确定的,在以后的排序过程中不会再改变,因此,在后面的排序中就不再对该位置进行改变 第二趟排序(对前四个元素排序): 在第一次排序的基础上,经过第二趟排序的三次调整后,使前四个数的最大值6放在倒数第二个位置,同样,在后面的排序中就不再对该位置进行改变

第三趟排序(对前三个元素排序):145681456814568数组的排序第四趟排序(对前二个元素排序):1456814568

最后一个元素显然不用再排序了,这样,经过四趟排序,完成了对数组a中的五个元素的排序,即若数组中有N个元素,则需要进行N-1趟排序才能完成对整个数组的排序

数组的排序程序实现:(其中N为数组a的下标上界)Fori=1ToN–1’控制有几趟排序

Forj=1ToN–I’控制每趟排序的个数

Ifa(j)>a(j+1)Thentemp=a(j)

a(j)=a(j+1)

a(j+1)=tempEndIfNextjNexti数组的排序完整的冒泡排序程序1.输入数据DimnAsIntegerDima()n=InputBox("dd")ReDima(n)Forj=1Tona(j)=Int(Rnd*90+10)Printa(j);Nextj2.数据处理(排序)Fori=1Ton-1'控制有几趟排序

Forj=1Ton-i'控制每趟排序的个数

Ifa(j)>a(j+1)Thentemp=a(j)

a(j)=a(j+1)

a(j+1)=tempEndIfNextjNexti3.数据输出

Forj=1TonPrinta(j);Nextj2.选择法排序

1)选择法排序的基本思路将a(0)作为参考标准,在a(0)-a(9)中挑选最小的一个数,跟a(0)交换;再将a(1)到a(9)中最小的数与a(1)对换;依次类推。10个数共需进行9轮比较以达到顺序的目的。假设第1个数据最小,依次同第2、第3、…、第N个数据进行比较,一旦第1个数据大于其他值则交换。这样,第1轮比较完毕,找出了最小数据作为第1个数据。以第2个数据为最小数据,依次同第3、第4、…、第N个数据进行比较,若第2个数据大于其他值则交换。这样,第2轮交换完毕,则找出第二小的数据作为第2个数据。依此类推,第N-1轮比较将找出第N-1小的数据,剩下的一个数据就是最大数,排列在最后。

数组的排序2)实现选择法排序的程序DimiAsInteger,jAsInteger,tempAsInteger

Fori=1Ton-1Forj=i+1TonIfa(i)>a(j)Thentemp=a(i)

a(i)=a(j)

a(j)=tempEndIfNextjNexti

其中i是外循环的循环变量,j是内循环的循环变量。Fori=1Ton-1至Nexti是外循环,表示总共排序的趟数;Forj=1Ton-i至Nextj是内循环,表示每一趟排序时,比较的次数。

数组的排序5.1数组的概念例5.2编写程序,将输入的10个数据按照输入的顺序逆向输出。

5.1数组的概念例5.2编写程序,将输入的10个数据按照输入的顺序逆向输出。程序源代码如下:OptionExplicitOptionBase1DimD(1To10)AsSinglePrivateSubcmdInput_Click()DimI%ForI=1To10D(I)=Val(InputBox("","输入数据"))

txtInput.Text=txtInput.Text&D(I)&""NextIEndSub5.1数组的概念例5.2编写程序,将输入的10个数据按照输入的顺序逆向输出。程序源代码如下:PrivateSubcmdOutput_Click()DimI%ForI=10To1Step-1

txtOutput.Text=txtOutput.Text&D(I)&""NextIEndSub5.1.2二维数组及多维数组1.二维数组的定义格式:Dim数组名([<下界>]to<上界>,[<下界>to]<上界>)[As<数据类型>]其中的参数与一维数组完全相同。例如:Dima(2,3)AsSingle二维数组在内存的存放顺序是“先行后列”。例如数组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)→(2,1)→a(2,2)→a(2,3)2.二维数组的引用格式:数组名(下标1,下标2)例如:a(1,2)=10a(i+2,j)=a(2,3)*2在程序中常常通过二重循环来操作使用二维数组元素。

二维数组的使用

二维数组通常是指由两个下标的数组元素所组成的数组。一个二维表格就是一个二维数组。数学上形如矩阵{aij}表示的数据均可用二维数组来处理。例5.3矩阵的加减运算。

PrivateSubCommand1_Click()Dima(1To4,1To5)AsIntegerDimb(1To4,1To5)AsIntegerDimc(1To4,1To5)AsInteger

Fori=1To4Forj=1To5

a(i,j)=Int(Rnd*40)+10

'通过Int和Rnd函数产生20个10~50之间的整数构成矩阵a

b(i,j)=Int(Rnd*40)+10

c(i,j)=a(i,j)+b(i,j)

'矩阵a和矩阵b对应元素之和放入矩阵c中

NextjNexti

Fori=1To4Forj=1To5Printa(i,j)&"";'输出矩阵a中的数据

NextjPrint

NextiPrint"----------------------"'两个矩阵之间用"-"隔开

Fori=1To4Forj=1To5Printb(i,j)&"";'输出矩阵b中的数据

NextjPrint

NextiPrint"----------------------"二维数组的使用

Fori=1To4Forj=1To5Printc(i,j)&"";'输出矩阵c中的数据

NextjPrint

NextiEndSubPrivateSubCommand2_Click()

ClsEndSub二维数组的使用

【例5.3】求方阵的转置方法一程序代码如下:Fori=2ToMForj=1ToI-1Temp=a(i,j)

a(i,j)=a(j,i)

a(j,i)=TempNextjNexti设A是M*N的矩阵,要重新定义一个N*M的二级数组B,将A转置得到B。方法二程序代码如下:Fori=1ToMForj=1ToN

b(j,i)=a(i,j)NextjNexti5.3.1动态数组动态数组:在声明时未给出数组的大小。在程序执行时分配存储空间。1.动态数组的建立及使用建立动态数组包括声明和大小说明两步:

(1)在使用Dim、Private或Public语句声明括号内为空的数组。格式:Dim|Private|Public

数组名()As数据类型例:Dima()AsInteger(2)在过程中用ReDim语句指明该数组的大小。格式:ReDim[Preserve]数组名(下标1[,下标2…])Preserve参数:保留数组中原来的数据例:RedimA(10)

RedimPreserveA(20)说明:

(1)ReDim语句是一个可执行语句,只能出现在过程中,并且可以多次使用,改变数组的维数和大小。

(2)定长数组声明中的下标只能是常量,而动态数组ReDim

语句中的下标是常量,也可以是有了确定值的变量。例:

PrivateSubForm_Click()DimNAsIntegerN=Val(InputBox(“输入N=?”))Dima(N)AsIntegerEndsub【例5.4】多次使用ReDim

语句。在窗体层声明如下数组:OptionBase1 '规定数组默认下界值为1DimsName()AsString ' sName

为变长字符串类型数组然后编写如下事件过程:PrivateSubForm_Click()ReDimsName(2) '第一次重定义含2个元素sName(1)="赵阳"sName(2)="张明"PrintsName(1);sName(2)ReDimPreservesName(3) '第二次重定义含3个元素,使用Preserve选项sName(3)="李好"PrintsName(1);sName(2);sName(3)ReDimsName(4) '第三次重定义含4个元素,不使用Preserve选项sName(4)="王华"PrintsName(1);sName(2);sName(3);ame(4)EndSub

5.1.4ForEachNext语句

ForEach…Next语句与For…Next语句类似,都是实现循环结构的语句。但ForEach…Next语句是专用于数组和对象集合的。格式:ForEach成员In 数组循环体[Exit For]…Next成员

说明:(1)成员:为一个Variant变量,是为循环提供的,在ForEach…Next语句中代表数组中的每个元素,数组中有几个元素,此成员就重复使用几次,循环体就执行几遍。(2)在此之前经过定义的数组,用在此处时仅仅是一个数组名,没有括号和上下界。(3)ForEach…Next语句可以对数组元素进行读取、查询、输出等操作。例如:DimTest(1To20)…ForEach t In TestPrint t;Next t【例5.6】统计成绩高于80分的学生人数。分析:假设有N个学生,学生成绩已知,则定义一个数组变量Score,用Array函数,给数组元素赋初值。在ForEach…Next循环体内用行If语句检查每一个元素的值,如果大于80就进行统计(设Count为统计人数的变量)。VisualBasic应用程序设计步骤如下:(1)建立应用程序用户界面:(2)建立Form1窗体界面。(3)设置界面中各对象的属性:设置Form1的Caption为“统计成绩大于80的人数”。(4)编写程序:OptionBase1PrivateSubForm_Load()ShowConstN=10DimCountAsInteger'Count变量用于统计人数Dimone,Score'one和Score都是Variant类型Score=Array(67,78,45,90,85,63,93,82,48,88)'数组初始化Count=0ForEachoneInScoreIfone>80ThenCount=Count+1'若有成绩>80的数,Count值增1Nextone'输出部分Print"成绩分别是:"ForEachoneInScorePrintone;'输出每个元素NextonePrint'输出换行Print"成绩>80的人数有";Count;"个"EndSub5.1.5控件数组1.控件数组的概念控件数组是由一组相同类型的控件组成。它们共用一个控件名,绝大部分属性也相同,但有一个属性不同,即Index属性的值不同。当建立控件数组时,系统给每个元素赋一个唯一的索引号(Index),通过属性窗口的Index属性,可以知道该控件的下标是多少,第1个元素下标是0。例如,CmdNum(8)表示名为CmdNum的控件数组的第9个元素。2.控件数组的建立控件数组的建立有两种方法:(1)在设计时建立建立的步骤如下:①窗体上画出某控件,可进行控件名的属性设置,这是建立的第一个元素。②选中该控件,进行“复制”和“粘贴”操作,系统会提示对话框(假设先画了一个“Command1”命令按钮)。单击【是】按钮后,就建立了一个控件数组元素,进行若干次“粘贴”操作,即可建立所需个数的控件数组元素。【例5.7】按图5-6设计窗体,其中单选按钮(共5个)构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小5.2过程5.2.1过程的概念通用过程告诉应用程序如何完成一项指定的任务。一旦确定了通用过程,就必须由应用程序来调用。反之,直到为响应用户引发的事件或系统引发的事件而调用事件过程时,事件过程通常总是处于空闲状态。5.2.2子程序过程Sub1.子程序过程的定义格式:[Private|Public][Static]Sub<过程名>[<形参表>][<语句序列>][ExitSub][<语句序列>]EndSub2.子程序过程的建立Sub过程的建立操作步骤如下:(1)执行“工程”菜单中的“添加模块”命令,打开“添加模块”对话框,在该对话框中选择“新建”选项卡,然后双击“模块”图标,打开模块代码窗口。(2)选择“工具”菜单中的“添加过程”菜单项,打开“添加过程”对话框。(3)在“名称”文本框中输入过程名,从“类型”组中选择过程类型,从“范围”组中选择范围。(4)在“范围”栏内选择过程的适用范围,可以选择“公有的”或“私有的”。(5)单击“确定”按钮。3.子程序过程的调用调用引起过程的执行。也就是说,要执行一个过程,必须调用该过程。每次调用子过程都会执行Sub与EndSub之间的语句序列。调用子过程有多种技巧,它们与过程的类型、位置以及在应用程序中的使用方法有关。调用子过程有两种方法:(1)使用Call语句:Call<过程名>([<实参表>](2)直接使用过程名:<过程名>[<实参表>]

【例5.8】编写交换两个数的子过程,并调用该过程交换a和b,c和d两组变量的值。分析:首先要编写一个交换两个数的过程。交换a和b的值时,调用该过程一次,交换c和d的值时再调用该过程一次。编一个交换两个整型变量值的子过程。PrivateSubSwap(XAsInteger,YAsInteger)DimtempAsIntegerTemp=X:X=Y:Y=TempEndSub编写事件过程来调用通用过程。PrivateSubCmdchange1_Click()DimaAsInteger,bAsIntegera=4:b=5Print"交换前a,b的值为:"Print"a=";a,"b=";bCallswap(a,b)Print"交换后a,b的值为:"Print"a=";a,"b=";bEndSubPrivateSubCmdchange2_Click()DimcAsInteger,dAsIntegerc=2:d=3Print"交换前c,d的值为:"Print"c=";c,"d=";dSwapc,dPrint"交换后c,d的值为:"Print"c=";c,"d=";dEndSub程序运行结果如下图所示

5.2.3函数过程Function1.函数过程的定义函数过程的定义与子过程的定义很相似。不同的是,函数过程可以返回一个值。Function函数的语法格式如下:[Private|Public][Static]Function<函数名>[<形参表>][As<类型>][<语句序列>][<函数名>=<表达式>][ExitFunction][<语句序列>]EndFunction【例题5.9】编写计算任意整数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论