第05章数组与自定义数据类型课件_第1页
第05章数组与自定义数据类型课件_第2页
第05章数组与自定义数据类型课件_第3页
第05章数组与自定义数据类型课件_第4页
第05章数组与自定义数据类型课件_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

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

文档简介

第05章数组与自定义数据类型1.数组基本概念(数组和数组元素、分类)2.数组的基本操作(声明、赋值、输出)3.数组应用举例(统计、查找、排序、矩阵运算)4.控件数组5.自定义数据类型1第05章数组与自定义数据类型1.数组基本概念(数组和数组元引例输入10个学生的成绩,将高于平均成绩的值输出。2引例输入10个学生的成绩,将高于平均成绩的值输出。2Dimw1,w2,w3,w4,w5,w6,w7,w8,w9,w10Dimaverw1=Val(InputBox("请输入第"&1&"个学生的成绩:"))w2=Val(InputBox("请输入第"&2&"个学生的成绩:"))w3=Val(InputBox("请输入第"&3&"个学生的成绩:"))……w9=Val(InputBox("请输入第"&9&"个学生的成绩:"))w10=Val(InputBox("请输入第"&10&"个学生的成绩:"))aver=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10Ifw1<averThenPrintw1Ifw2<averThenPrintw2Ifw3<averThenPrintw3……Ifw9<averThenPrintw9Ifw10<averThenPrintw10使用普通变量若学生人数为100?占用内存3Dimw1,w2,w3,w4,w5,w6,w7使用循环结构?计算10个人的平均成绩Fori=1To10x=InputBox("请输入第"&i&"个同学的成绩")s=s+xNextiaver=s/10Ifx<averthenprintx

此时x的值4使用循环结构?计算10个人的平均成绩此时x的值4一、基本概念1、数组、数组元素数组:用一些连续的地址空间来存储类型相同的一组数数组元素:构成数组的每一数据成员,用圆括号和下标表示例:数组a(2):数组为a,a(0)、a(1)、a(2)是该数组的元素;0、1、2分别为响应数组元素的下标数组必须先定义后使用好处:让一批相同性质的数据用同一个变量名,书写方便,可读性高;便于使用循环语句。5一、基本概念1、数组、数组元素5例如,数组w(9)可表示如下6例如,数组w(9)可表示如下62.数组的分类根据声明数组时是否限定数组元素的个数,分为:静态数组:声明时数组元素个数已知动态数组:声明时数组元素个数未知根据维数分:一维数组、二维数组、多维数组:一、基本概念72.数组的分类根据声明数组时是否限定数组元素的个数,分为:一二、数组的声明:1.静态一维数组的声明:格式:Dim数组名(下界to上界)[as<数据类型>]例:以下定义从a(1)到a(6)连续的6个数组元素Dima(1to6)assingle以下语句定义从a(0)到a(6)连续的7个数组元素Dima!(6)

若希望下标从1开始可以采用如下方法:OptionBase1’写在通用模块中dima(6)asinteger’则定义从a(1)到a(6)连续的6个数组元素作用:定义(上界-下界+1)个数组元素8二、数组的声明:1.静态一维数组的声明:8其中:Dim数组名(下界to上界)[as<数据类型>]数组名

要符合变量命名规则。下界To上界

用于确定数组元素下标的范围如果下界省略,默认为0。[As<数据类型>]

用来定义数组的数据类型,数组中各个元素的数据类型都为此类型,如果省略则为变体数据类型·。下界、上界可以是常量常量表达式不能是变量含变量的表达式若下界省去,默认:0变量名只能由字母、数字、汉字和下划线组成必须以字母开头,大小写等价长度不超过255个字符不能和VB保留字重名(if、then)不能含有标点符号,类型说明符只能出现在名称的最后dima%(1ton),错误!9其中:Dim数组名(下界to上界)[as<数据类定义数组时注意事项:通用声明段中如果有“OptionBase1”可设定数组默认下标下界从1开始在一个事件过程内,不能出现重名现象声明数组和声明变量一样,也有作用范围

声明数组后,各数组元素的初值与数组的数据类型有关。重名:数组名和既有数组名重名数组名和既有变量名重名10定义数组时注意事项:重名:10二、数组的声明:

2.静态二维数组

Dim数组名(下界1To上界1,下界2To上界2)[As<数据类型>]例如:Dimx(0to3,0to4)assingleDimheight%(-4to8,1to10)作用:

定义含有(上界1-下限1+1)×(上界2-下限2+1)个数组元素的一个数组。11二、数组的声明:2.静态二维数组11二维数组举例例:dimb%(1to3,1to3)则二维数组各元素分别为:B(1,1)B(1,2)B(1,3)B(2,1)B(2,2)B(2,3)B(3,1)B(3,2)B(3,3)但实际存储时是连续存储的:B(1,1)B(1,2)B(1,3)B(2,1)B(2,2)B(2,3)B(3,1)B(3,2)B(3,3)12二维数组举例例:dimb%(1to3,1to3)但

二、数组的声明:3.动态数组的声明(一维数组、二维数组)声明动态数组通常分3步:第1步声明一个省略维说明的数组Dim数组名()As

<数据类型>第2步指定数组元素个数n第3步用ReDim重新声明ReDim[Preserve]数组名()As

数据类型13

二、数组的声明:3.动态数组的声明(一维数组、二维数组)13.动态数组的声明一维:dima()asintegern=inputbox(“请输入元素个数”)redimPreservea(1ton)asinteger二维:Dima()asintegerm=inputbox(“请输入行数:”)n=inputbox(“请输入列数:”)ReDimpreservea(1Tom,1Ton)AsInteger

二、数组的声明:143.动态数组的声明一维:

二、数组的声明:14preserve的作用Dima()AsInteger,nAsIntegern=6ReDima(1Ton)AsIntegerFori=1To6a(i)=8Nexti888888a(1)a(3)a(4)a(5)a(6)a(2)00000000a(1)a(3)a(4)a(5)a(6)a(2)a(7)a(8)88888800a(1)a(3)a(4)a(5)a(6)a(2)a(7)a(8)ReDima(1To8)AsIntegerReDimPreservea(1To8)AsInteger15preserve的作用Dima()AsIntege三、数组元素值的赋值、输出赋值(利用赋值语句)对一个数组元素赋值:直接赋值:a(1)=8使用InputBox()函数:a(1)=inputbox(“请输入”)使用随机函数a(1)=int(Rnd*100)(用于测试程序)对多个数组元素赋值:一维:fornext循环(用array,split函数时除外)二维:for…next循环嵌套使用array()、split()函数Dima%(1to10)Fori=1to10 a(i)=rnd*10Nexti16三、数组元素值的赋值、输出赋值(利用赋值语句)Dima%(三、数组元素值的输入、输出2.输出方法:Print语句输出到text中输出到文件中输出一个元素:printa(1)输出多个元素:一维:for…next循环二维:for…next循环嵌套例:

PrivateSubForm_Click()Dima%(1to5,1to5)Fori=1To5

Forj=1To5a(i,j)=Int(Rnd*80)PrintTab(j*8+1);a(i,j);

Nextj

NextiEndSubDima%(1to10)Fori=1to10 a(i)=rnd*10NextiPrinta(i)错误!17三、数组元素值的输入、输出2.输出方法:PrivateSu数组基本操作举例:静态一维数组Dima(1to10)AsIntegerFori=1To10a(i)=Int(Rnd*101)NextiFori=1To10Printa(i);NextiPrintFori=1To10s=s+a(i)Nextiaver=s/10PrintaverFori=1To10Ifa(i)>averThenPrinta(i);Nexti18数组基本操作举例:静态一维数组Dima(1to10)数组基本操作举例:静态二维数组Dima(1to5,1to5)AsIntegerFori=1To5Forj=1To5a(i,j)=Int(Rnd*80)NextjNextiFori=1To5Forj=1To5Printa(i,j);NextjPrintNexti19数组基本操作举例:静态二维数组Dima(1to5,1数组基本操作举例:动态一维数组Dima()AsIntegern=InputBox("请输入学生人数:")ReDimPreservea(1Ton)AsIntegerFori=1Tona(i)=Int(Rnd*101)NextiFori=1TonPrinta(i);NextiPrintFori=1Tons=s+a(i)Nextiaver=s/nPrintaverFori=1TonIfa(i)>averThenPrinta(i);Nexti20数组基本操作举例:动态一维数组Dima()AsInte数组基本操作举例:动态二维数组Dima()AsIntegerm=InputBox("请输入行数:")n=InputBox("请输入列数:")ReDimPreservea(1Tom,1Ton)AsIntegerFori=1TomForj=1Tona(i,j)=Int(Rnd*80)NextjNextiFori=1TomForj=1TonPrinta(i,j);NextjPrintNexti21数组基本操作举例:动态二维数组Dima()AsIntArray()函数Array函数可方便地对数组一次整体赋值格式:数组名=Array(<数组元素值表>)用于给一维动态、变体类型数组其中:数组名可以是已经声明过的变体动态数组,也可以是没有声明过的数组名例:a=array(1,3,4,5,-6)或Dima()a()=array(1,3,4,5,-6)22Array()函数Array函数可方便地对数组一次整体赋值Array()函数应用PrivateSubForm_click()Dima(),b()a=Array(1,3,4,5,-6)b=Array("abc","def","67","5","-6")Fori=LBound(a)ToUBound(a)

Printa(i);"";NextIPrintFori=LBound(b)ToUBound(b)Printb(i);"";NextiEndSubLBound(a),取数组a的下界函数UBound(a),取数组a的下界函数可以不定义,但如果定义,必须为:动态、变体类型赋值没有用循环23Array()函数应用PrivateSubForm_cl求数组的上界Ubound()函数、下界Lbound()函数Ubound()函数和Lbound()函数功能:用来确定数组某一维的上界和下界值。使用形式如下:

Ubound(<数组名>[,<N>])

Lbound(<数组名>[,<N>])其中:<数组名>:必需的。数组变量的名称,遵循标准变量命名约定。<N>:可选的;一般是整型常量或变量。指定返回哪一维的上界。1表示第一维,2表示第二维,如此等等。如果省略默认是1。24求数组的上界Ubound()函数、下界Lbound(split()函数格式为:<数组名>=Split(字符串表达式,分隔符)适用条件动态数组字符型字符串表达式是一组将要为数组赋值的数据,这些数据之间有固定的分隔符。数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。25split()函数格式为:25Slplit()函数应用举例例使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示8个数据)。26Slplit()函数应用举例例使用文本框录入大量的数据,Slplit()函数应用举例PrivateSubCommand1_Click() dima()asstringa=Split(Text1,",")EndSubPrivateSubCommand2_Click()Fori=0ToUBound(a)Picture1.PrintTab(6*(iMod5)+1);a(i);NextiEndSub可以不定义,但如果定义,必须为:动态、字符类型的27Slplit()函数应用举例PrivateSubComm

Split函数只能给字符型数组赋值;而Array函数只能给变体类型数组赋值。这两个函数只能给一维数组赋值,如果要为二维数组赋值,必须先将数据放入一维数组,再通过程序的方法转入二维数组。用Array函数赋值的数组元素的最小下标受OptionBase语句影响;用Split函数赋值的数组的最小下标与OptionBase语句无关,不管OptionBase语句设置为0还是1,数组元素的最小下标均从0开始。Split函数和Array函数应用小结28Split函数只能给字符型数组赋值;而Array函数只能给四、数组应用利用数组编程的一般步骤为:声明数组;为数组元素赋值;(3)运算处理(4)结果输出。29四、数组应用利用数组编程的一般步骤为:29四、数组应用举例:输出fabonaccii数列前12项。在一组给定的数中查找一个数x存在否简单统计求最大数及其位置N个数排序(重点、难点))30四、数组应用举例:输出fabonaccii数列前12项。30二维数组应用特例输出如下矩阵31二维数组应用特例输出如下矩阵31数组应用-查找查找方法:顺序法、二分法例:对给定的一组数15、8、4、13、6、10、17、1,从键盘输入一个数,找出该数在数组中的位置。32数组应用-查找查找方法:顺序法、二分法32用随机函数产生10个两位整数,求最大值及其位置

OptionBase1PrivateSubForm_Click()Dima%(10),i%Fori=1To10a(i)=Int(Rnd*(90)+10)Print"第"&i&"个随机数是:"&a(i)Nexti

Max=a(1)k=1Fori=2To10Ifa(i)>MaxThenMax=a(i):k=iNextiPrint"最大数是第"&k&"个"EndSub数组应用-求最大数33用随机函数产生10个两位整数,求最大值及其位置数组应用-求数组应用-简单统计例在文本框中输入多名学生的一门课程的考试成绩,统计各分数段学生人数。34数组应用-简单统计例在文本框中输入多名学生的一门课程的考PrivateSubCommand1_Click()Dimi%,k%,a()AsString,counter(0To10)AsIntegera=Split(Text1,",")Fori=0ToUBound(a)Ifa(i)<=100Anda(i)>=0Thenk=a(i)\10counter(k)=counter(k)+1EndIfNextiPrint"统计结果如下:"Fori=0To10Ifcounter(i)<>0ThenPrint"第"&i*10&"--"&i*10+9&"段共有"&counter(i)EndIfNextiEndSub35PrivateSubCommand1_Click()35输入N名同学的成绩,显示于文本框Text1中,按成绩从低到高的次序排序,并将结果显示于另一个文本框Text2中。数组应用—排序(重点、难点算法)36输入N名同学的成绩,显示于文本框Text1中,按成绩从低到高(1)将第1个数与第2个数到第N个数依次比较,如果X(1)>X(j)(j=2,3,…,N),则交换X(1)、X(j)的内容;(2)将第2个数与第3个数到第N个数依次比较,如果X(2)>X(j)(j=3,4,…,N),则交换X(2)、X(J)的内容;(3)重复以上方法,将第i个数与第i+1个数到第N个数依次比较,如果X(i)>X(j)(j=i+1,…,N),则交换X(i)、X(j)的内容;共重复N-1轮。比较交换法:对N个数进行排序(自学)37(1)将第1个数与第2个数到第N个数依次比较,如果X(1)1)将9与15比较,9与20比较,9与14比较,9与13比较,9与17比较 915201413172)将15与20比较,15与14比较(交换),14与13比较(交换),13与17比较 91420151317 913201514173)将20与15比较(交换)、15与14比较(交换)、14与17比较

91315

201417 913142015174)将20与15比较(交换)、15与17比较 913141520175)将20与17比较(交换) 91314151720例:对数91520141317用比较交换法排序381)将9与15比较,9与20比较,9与14比较,9与1比较交换法:对N个数进行排序(升序)Fori=1ToN-1Forj=i+1ToNIfa(i)>a(j)Thent=a(i)a(i)=a(j)a(j)=tEndIfNextjNexti39比较交换法:对N个数进行排序(升序)Fori=1T选择排序法:对N个数进行排序(升序)1)将第1个数与第2个数到第N个数依次比较,找出第1个数到第N个数中的最小值,记下其位置k,交换X(1)与X(k)的值。这时X(1)为原X(1)到X(N)中的最小值。2)将第2个数与第3个数到第N个数依次比较,找出第2个数到第N个数中的最小值,记下其位置k,交换X(2)与X(k)的值。这时X(2)为原X(2)到X(N)中的最小值。3)重复以上方法,将第i个数与第i+1个数到第N个数依次比较,找出第i个数到第N个数中的最小值,记下其位置k,交换X(i)与X(k)的值。这时X(i)为原X(i)到X(N)中的最小值。共重复N-1轮40选择排序法:对N个数进行排序(升序)1)将第1个数与第2个数例5-8用选择排序法,将15、8、4、13、6、10、17、1按照由小到大的顺序递增排列。

第一步:把要排序的数用一个数组存储,并输出原始数据optionbase1Dima(),i%,k%,j%a=Array(15,8,4,13,6,10,17,1)n=UBound(a)Print"排序前:";Fori=1TonPrinta(i);NextiPrint41例5-8用选择排序法,将15、8、4、13、6、10、1第二步:排序,可以分解为如下几个小的步骤(1)先从n个数中找出最小数的下标(用k表示),并将最小数与第一个数交换位置k=1Forj=2TonIfa(k)>a(j)Thenk=jNextjt=a(1):a(1)=a(k):a(k)=t42第二步:排序,可以分解为如下几个小的步骤(1)先从n个数中(2)从第2~n个数中找出最小数的下标(用k表示),并将最小数与第2个数交换位置k=2Forj=3TonIfa(k)>a(j)Thenk=jNextjt=a(2):a(2)=a(k):a(k)=t第二步:排序,可以分解为如下几个小的步骤43(2)从第2~n个数中找出最小数的下标(用k表示),并将最(3)从第3~n个数中找出最小数的下标(用k表示),并将最小数与第3个数交换位置k=3Forj=4TonIfa(k)>a(j)Thenk=jNextjt=a(3):a(3)=a(k):a(k)=t

……第二步:排序,可以分解为如下几个小的步骤44(3)从第3~n个数中找出最小数的下标(用k表示),并将最(n-1)从第n-1~n个数中找出最小数的下标(用k表示),并将最小数与第n-1个数交换位置。k=n-1Forj=n-1TonIfa(k)>a(j)Thenk=jNextjt=a(n-1):a(n-1)=a(k):a(k)=t第二步:排序,可以分解为如下几个小的步骤45(n-1)从第n-1~n个数中找出最小数的下标(用k表示),Fori=1Ton-1

k=iForj=i+1TonIfa(k)>a(j)Thenk=jNextjt=a(i):a(i)=a(k):a(k)=tNexti第二步,找出以下规律46Fori=1Ton-1第二步,找出以下规律46第三步输出排序后的数据Print"排序后:";Fori=1TonPrinta(i);Nexti47第三步输出排序后的数据Print"排序后:";47Fori=1Ton-1k=iForj=i+1Ton

Ifa(j)<a(k)Thenk=jEndIfNextj

t=a(i)a(i)=a(k)a(k)=TNextI选择排序法:对N个数进行排序(升序)找出最小数的位置(下标)k如果最小值不是X(i),则交换X(i)与X(k)的48Fori=1Ton-1选择排序法:对N个数进行15、8、4、13、6、10、17、1(升序排序)循环次数i值k值交换交换后第1次1k=815和11、8、4、13、6、10、17、15第2次2k=38和41、4、8、13、6、10、17、15第3次3k=58和61、4、6、13、8、10、17、15第4次4k=513和81、4、6、8、13、10、17、15第5次5k=613和101、4、6、8、10、13、17、15第6次6k=6不交换1、4、6、8、10、13、17、15第7次7k=817和151、4、6、8、10、13、15、174915、8、4、13、6、10、17、1(升序排序)循环次数i例如,要对数据91520141317用选择排序法排序1)k=1,将9与15比较、9与20比较、9与14比较、9与13比较、9与17比较 915201413172)k=2,将15与20比较、15与14比较(k=4)、14与13比较(k=5)、13与17比较 913201415173)k=3,将20与14比较(k=4)、14与15比较、14与17比较 913142015174)k=4,将20与15比较(k=5)、15与17比较 913141520175)k=5,将20与17比较(k=6) 9131415172050例如,要对数据91520141317数组应用-插入元素在一个已有数组中插入元素的过程是:(1)输入插入的位置及要插入的数;(2)增加数组元素个数;(3)将待插入位置以后的数逐一后移一位,腾出插入位置;(4)在插入位置上插入数。例:在数组第二个位置上插入667815A(1)A(2)A(3)A(1)A(2)A(3)7815A(4)A(1)A(2)A(3)7815A(4)A(1)A(2)A(3)786615A(4)第1步:输入:p=2,m=66第2步:增加数组元素个数第3步:插入位置以后的数后移一位第4步:在插入位置上插入数。51数组应用-插入元素在一个已有数组中插入元素的过程是:7815PrivateSubForm_Click()'第1步输入插入的位置及要插入的数x=InputBox("请输入要插入的数")Dok=InputBox("请输入要插入的数的位置,范围是"&m&"~"&n)LoopUntilk>=mAndk<=nPrint"要在"&k&"位置插入"&x

'第2步增加数组元素个数n=n+1ReDimPreservea(n)

'第3步将待插入位置以后的数逐一后移一位,腾出插入位置Fori=n-1TokStep-1a(i+1)=a(i)Nexti

'第4步在插入位置上插入数a(k)=xEndSubKX52PrivateSubForm_Click()KX52插入数组元素-界面设计53插入数组元素-界面设计53数组应用-删除元素数组中元素的删除过程是:(1)输入要删除的数;(2)在数组中找到要删除的数的位置k,如果数组中没有要删除的数,输出相应信息;(3)将k以后的每一个元素前移一位,覆盖要删除的数;(4)减少数组元素的个数,完成删除。pos54数组应用-删除元素数组中元素的删除过程是:pos54PrivateSubCommand1_Click()

Dima(),n%,Key%

a=Array(1,6,8,3,5,9,10,2,7,4)

n=UBound(a)‘获得数组的上界

Key=InputBox(“请输入要删除的数”)

Fori=0Ton’查找欲删除数在数组中的位置

IfKey=a(i)ThenExitFor

Nexti

Ifi=n+1ThenMsgBox(“找不到此数”):ExitSub

Forj=i+1Ton‘将欲删除数后面的元素依次左移

a(j-1)=a(j)

Nextj

ReDimPreservea(n-1)’数组元素个数减少一个

Fori=0Ton-1‘打印删除后的各数组元素的值

Printa(i);

Nexti

EndSub删除一个元素55PrivateSubCommand1_Click()

数组使用小结使用原则—先定义后使用使用顺序数组声明(静态、动态,一维、二维)初始化—对数组各个元素赋值根据程序进行计算输出注意:初始化、输出一般要用到循环结构初始化、输出是对数组元素(不是数组名)而言的Dimx%(1to10)x=3Printx原因:不能直接给数组名赋值56数组使用小结使用原则—先定义后使用Dimx%(1本章常见错误:下标越界Dima(1to3)Fori=1To6a(i)=iNextiPrinta(10)Fori=1To3a(i)=iNextiPrinta(i)出现此错误,原因一定是使用的下标超出了定义时所允许的下标范围,数组没有定义也可导致此错误57本章常见错误:下标越界Dima(1to3)Fori控件数组基本概念控件数组各控件名称相同以索引号区分彼此建立控件数组的方法设计时建立运行时建立58控件数组基本概念58应用举例—简单调色板59应用举例—简单调色板59Shape控件主要属性shape控件外观fillcolor填充颜色Fillstyle填充样式60Shape控件主要属性60滚动条(scrollbar)分类:HscrollbarVscrollbar主要属性value滑块所处位置(是一个整数值)max滑块处最大位置时所表示的值min滑块处最小位置时所表示的值smallchange单击左右箭头时滑块移动距离大小largechange单击滚动条空白处滑块移动距离大小61滚动条(scrollbar)分类:61自定义数据类型在VB中,利用系统提供的标准数据类型定义变量,可以存储那些相互独立、没有内在联系的数据,借助数组能存储一组性质相同的数据。但实际应用中,对事物的描述往往需要两个或两个以上的基本数据项学号姓名性别出生日期语文数学总分99310李小华男1985年2月859518099311张红玉女1984年12月73.587160.599312田宝男1986年1月8279161学生成绩登记表62自定义数据类型在VB中,利用系统提供的标准数据类自定义数据类型若采用数组存储,则需要3个字符型数组分别存储学号、姓名和性别,1个日期型数组存储出生日期,1个二维数组存储成绩,这种方法尽管解决了数据的存储问题,但处理起来将会非常麻烦。学号姓名性别出生日期语文数学总分99310李小华男1985年2月859518099311张红玉女1984年12月73.587160.599312田宝男1986年1月8279161字段纪录字段名63自定义数据类型若采用数组存储,则需要3个字符型数自定义数据类型1、自定义数据类型的定义格式:Type〈自定义类型名〉〈字段1〉as〈类型名1〉〈字段2〉as〈类型名2〉……〈字段n〉as〈类型名n〉EndType其中:〈自定义类型名〉是用户欲定义的数据类型名(注意,它不是变量名),其命名规则与变量名命名规则相同;〈字段〉是组成自定义数据类型的元素,其命名规则也与变量名命名规则相同;〈类型名〉可以是任何基本数据类型,也可以是用户定义数据类型。64自定义数据类型1、自定义数据类型的定义64自定义数据类型如:Typestudtypexhasstring*5xmasstring*8xbasstring*2csrqasdateywassinglesxassinglezfassingleEndType在使用Type语句时,应注意以下两点:(1)自定义类型一般放在标准模块中,默认为Public;(2)自定义类型中的字符型字段必须设置成定长字符串。65自定义数据类型如:Typestudtype65自定义数据类型2、使用自定义数据类型声明变量

完成自定义数据类型定义后,自定义数据类型就自动保存在“列出成员”中。就可以象使用标准数据类型一样定义变量类型,格式如下:Dim变量名as自定义类型名3、为自定义数据类型的变量赋值

当变量被声明成自定义数据类型后,它就具有这种数据类型的各个字段(或称域),为各字段赋值的格式如下:变量名.字段名=表达式66自定义数据类型2、使用自定义数据类型声明变量66数组课后作业题1.求二维数组最大元素及其所在的行和列2.输入整数n,显示出具有n行的杨辉三角形

67数组课后作业题1.求二维数组最大元素及其所在的行和列67第05章数组与自定义数据类型1.数组基本概念(数组和数组元素、分类)2.数组的基本操作(声明、赋值、输出)3.数组应用举例(统计、查找、排序、矩阵运算)4.控件数组5.自定义数据类型68第05章数组与自定义数据类型1.数组基本概念(数组和数组元引例输入10个学生的成绩,将高于平均成绩的值输出。69引例输入10个学生的成绩,将高于平均成绩的值输出。2Dimw1,w2,w3,w4,w5,w6,w7,w8,w9,w10Dimaverw1=Val(InputBox("请输入第"&1&"个学生的成绩:"))w2=Val(InputBox("请输入第"&2&"个学生的成绩:"))w3=Val(InputBox("请输入第"&3&"个学生的成绩:"))……w9=Val(InputBox("请输入第"&9&"个学生的成绩:"))w10=Val(InputBox("请输入第"&10&"个学生的成绩:"))aver=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10Ifw1<averThenPrintw1Ifw2<averThenPrintw2Ifw3<averThenPrintw3……Ifw9<averThenPrintw9Ifw10<averThenPrintw10使用普通变量若学生人数为100?占用内存70Dimw1,w2,w3,w4,w5,w6,w7使用循环结构?计算10个人的平均成绩Fori=1To10x=InputBox("请输入第"&i&"个同学的成绩")s=s+xNextiaver=s/10Ifx<averthenprintx

此时x的值71使用循环结构?计算10个人的平均成绩此时x的值4一、基本概念1、数组、数组元素数组:用一些连续的地址空间来存储类型相同的一组数数组元素:构成数组的每一数据成员,用圆括号和下标表示例:数组a(2):数组为a,a(0)、a(1)、a(2)是该数组的元素;0、1、2分别为响应数组元素的下标数组必须先定义后使用好处:让一批相同性质的数据用同一个变量名,书写方便,可读性高;便于使用循环语句。72一、基本概念1、数组、数组元素5例如,数组w(9)可表示如下73例如,数组w(9)可表示如下62.数组的分类根据声明数组时是否限定数组元素的个数,分为:静态数组:声明时数组元素个数已知动态数组:声明时数组元素个数未知根据维数分:一维数组、二维数组、多维数组:一、基本概念742.数组的分类根据声明数组时是否限定数组元素的个数,分为:一二、数组的声明:1.静态一维数组的声明:格式:Dim数组名(下界to上界)[as<数据类型>]例:以下定义从a(1)到a(6)连续的6个数组元素Dima(1to6)assingle以下语句定义从a(0)到a(6)连续的7个数组元素Dima!(6)

若希望下标从1开始可以采用如下方法:OptionBase1’写在通用模块中dima(6)asinteger’则定义从a(1)到a(6)连续的6个数组元素作用:定义(上界-下界+1)个数组元素75二、数组的声明:1.静态一维数组的声明:8其中:Dim数组名(下界to上界)[as<数据类型>]数组名

要符合变量命名规则。下界To上界

用于确定数组元素下标的范围如果下界省略,默认为0。[As<数据类型>]

用来定义数组的数据类型,数组中各个元素的数据类型都为此类型,如果省略则为变体数据类型·。下界、上界可以是常量常量表达式不能是变量含变量的表达式若下界省去,默认:0变量名只能由字母、数字、汉字和下划线组成必须以字母开头,大小写等价长度不超过255个字符不能和VB保留字重名(if、then)不能含有标点符号,类型说明符只能出现在名称的最后dima%(1ton),错误!76其中:Dim数组名(下界to上界)[as<数据类定义数组时注意事项:通用声明段中如果有“OptionBase1”可设定数组默认下标下界从1开始在一个事件过程内,不能出现重名现象声明数组和声明变量一样,也有作用范围

声明数组后,各数组元素的初值与数组的数据类型有关。重名:数组名和既有数组名重名数组名和既有变量名重名77定义数组时注意事项:重名:10二、数组的声明:

2.静态二维数组

Dim数组名(下界1To上界1,下界2To上界2)[As<数据类型>]例如:Dimx(0to3,0to4)assingleDimheight%(-4to8,1to10)作用:

定义含有(上界1-下限1+1)×(上界2-下限2+1)个数组元素的一个数组。78二、数组的声明:2.静态二维数组11二维数组举例例:dimb%(1to3,1to3)则二维数组各元素分别为:B(1,1)B(1,2)B(1,3)B(2,1)B(2,2)B(2,3)B(3,1)B(3,2)B(3,3)但实际存储时是连续存储的:B(1,1)B(1,2)B(1,3)B(2,1)B(2,2)B(2,3)B(3,1)B(3,2)B(3,3)79二维数组举例例:dimb%(1to3,1to3)但

二、数组的声明:3.动态数组的声明(一维数组、二维数组)声明动态数组通常分3步:第1步声明一个省略维说明的数组Dim数组名()As

<数据类型>第2步指定数组元素个数n第3步用ReDim重新声明ReDim[Preserve]数组名()As

数据类型80

二、数组的声明:3.动态数组的声明(一维数组、二维数组)13.动态数组的声明一维:dima()asintegern=inputbox(“请输入元素个数”)redimPreservea(1ton)asinteger二维:Dima()asintegerm=inputbox(“请输入行数:”)n=inputbox(“请输入列数:”)ReDimpreservea(1Tom,1Ton)AsInteger

二、数组的声明:813.动态数组的声明一维:

二、数组的声明:14preserve的作用Dima()AsInteger,nAsIntegern=6ReDima(1Ton)AsIntegerFori=1To6a(i)=8Nexti888888a(1)a(3)a(4)a(5)a(6)a(2)00000000a(1)a(3)a(4)a(5)a(6)a(2)a(7)a(8)88888800a(1)a(3)a(4)a(5)a(6)a(2)a(7)a(8)ReDima(1To8)AsIntegerReDimPreservea(1To8)AsInteger82preserve的作用Dima()AsIntege三、数组元素值的赋值、输出赋值(利用赋值语句)对一个数组元素赋值:直接赋值:a(1)=8使用InputBox()函数:a(1)=inputbox(“请输入”)使用随机函数a(1)=int(Rnd*100)(用于测试程序)对多个数组元素赋值:一维:fornext循环(用array,split函数时除外)二维:for…next循环嵌套使用array()、split()函数Dima%(1to10)Fori=1to10 a(i)=rnd*10Nexti83三、数组元素值的赋值、输出赋值(利用赋值语句)Dima%(三、数组元素值的输入、输出2.输出方法:Print语句输出到text中输出到文件中输出一个元素:printa(1)输出多个元素:一维:for…next循环二维:for…next循环嵌套例:

PrivateSubForm_Click()Dima%(1to5,1to5)Fori=1To5

Forj=1To5a(i,j)=Int(Rnd*80)PrintTab(j*8+1);a(i,j);

Nextj

NextiEndSubDima%(1to10)Fori=1to10 a(i)=rnd*10NextiPrinta(i)错误!84三、数组元素值的输入、输出2.输出方法:PrivateSu数组基本操作举例:静态一维数组Dima(1to10)AsIntegerFori=1To10a(i)=Int(Rnd*101)NextiFori=1To10Printa(i);NextiPrintFori=1To10s=s+a(i)Nextiaver=s/10PrintaverFori=1To10Ifa(i)>averThenPrinta(i);Nexti85数组基本操作举例:静态一维数组Dima(1to10)数组基本操作举例:静态二维数组Dima(1to5,1to5)AsIntegerFori=1To5Forj=1To5a(i,j)=Int(Rnd*80)NextjNextiFori=1To5Forj=1To5Printa(i,j);NextjPrintNexti86数组基本操作举例:静态二维数组Dima(1to5,1数组基本操作举例:动态一维数组Dima()AsIntegern=InputBox("请输入学生人数:")ReDimPreservea(1Ton)AsIntegerFori=1Tona(i)=Int(Rnd*101)NextiFori=1TonPrinta(i);NextiPrintFori=1Tons=s+a(i)Nextiaver=s/nPrintaverFori=1TonIfa(i)>averThenPrinta(i);Nexti87数组基本操作举例:动态一维数组Dima()AsInte数组基本操作举例:动态二维数组Dima()AsIntegerm=InputBox("请输入行数:")n=InputBox("请输入列数:")ReDimPreservea(1Tom,1Ton)AsIntegerFori=1TomForj=1Tona(i,j)=Int(Rnd*80)NextjNextiFori=1TomForj=1TonPrinta(i,j);NextjPrintNexti88数组基本操作举例:动态二维数组Dima()AsIntArray()函数Array函数可方便地对数组一次整体赋值格式:数组名=Array(<数组元素值表>)用于给一维动态、变体类型数组其中:数组名可以是已经声明过的变体动态数组,也可以是没有声明过的数组名例:a=array(1,3,4,5,-6)或Dima()a()=array(1,3,4,5,-6)89Array()函数Array函数可方便地对数组一次整体赋值Array()函数应用PrivateSubForm_click()Dima(),b()a=Array(1,3,4,5,-6)b=Array("abc","def","67","5","-6")Fori=LBound(a)ToUBound(a)

Printa(i);"";NextIPrintFori=LBound(b)ToUBound(b)Printb(i);"";NextiEndSubLBound(a),取数组a的下界函数UBound(a),取数组a的下界函数可以不定义,但如果定义,必须为:动态、变体类型赋值没有用循环90Array()函数应用PrivateSubForm_cl求数组的上界Ubound()函数、下界Lbound()函数Ubound()函数和Lbound()函数功能:用来确定数组某一维的上界和下界值。使用形式如下:

Ubound(<数组名>[,<N>])

Lbound(<数组名>[,<N>])其中:<数组名>:必需的。数组变量的名称,遵循标准变量命名约定。<N>:可选的;一般是整型常量或变量。指定返回哪一维的上界。1表示第一维,2表示第二维,如此等等。如果省略默认是1。91求数组的上界Ubound()函数、下界Lbound(split()函数格式为:<数组名>=Split(字符串表达式,分隔符)适用条件动态数组字符型字符串表达式是一组将要为数组赋值的数据,这些数据之间有固定的分隔符。数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。92split()函数格式为:25Slplit()函数应用举例例使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示8个数据)。93Slplit()函数应用举例例使用文本框录入大量的数据,Slplit()函数应用举例PrivateSubCommand1_Click() dima()asstringa=Split(Text1,",")EndSubPrivateSubCommand2_Click()Fori=0ToUBound(a)Picture1.PrintTab(6*(iMod5)+1);a(i);NextiEndSub可以不定义,但如果定义,必须为:动态、字符类型的94Slplit()函数应用举例PrivateSubComm

Split函数只能给字符型数组赋值;而Array函数只能给变体类型数组赋值。这两个函数只能给一维数组赋值,如果要为二维数组赋值,必须先将数据放入一维数组,再通过程序的方法转入二维数组。用Array函数赋值的数组元素的最小下标受OptionBase语句影响;用Split函数赋值的数组的最小下标与OptionBase语句无关,不管OptionBase语句设置为0还是1,数组元素的最小下标均从0开始。Split函数和Array函数应用小结95Split函数只能给字符型数组赋值;而Array函数只能给四、数组应用利用数组编程的一般步骤为:声明数组;为数组元素赋值;(3)运算处理(4)结果输出。96四、数组应用利用数组编程的一般步骤为:29四、数组应用举例:输出fabonaccii数列前12项。在一组给定的数中查找一个数x存在否简单统计求最大数及其位置N个数排序(重点、难点))97四、数组应用举例:输出fabonaccii数列前12项。30二维数组应用特例输出如下矩阵98二维数组应用特例输出如下矩阵31数组应用-查找查找方法:顺序法、二分法例:对给定的一组数15、8、4、13、6、10、17、1,从键盘输入一个数,找出该数在数组中的位置。99数组应用-查找查找方法:顺序法、二分法32用随机函数产生10个两位整数,求最大值及其位置

OptionBase1PrivateSubForm_Click()Dima%(10),i%Fori=1To10a(i)=Int(Rnd*(90)+10)Print"第"&i&"个随机数是:"&a(i)Nexti

Max=a(1)k=1Fori=2To10Ifa(i)>MaxThenMax=a(i):k=iNextiPrint"最大数是第"&k&"个"EndSub数组应用-求最大数100用随机函数产生10个两位整数,求最大值及其位置数组应用-求数组应用-简单统计例在文本框中输入多名学生的一门课程的考试成绩,统计各分数段学生人数。101数组应用-简单统计例在文本框中输入多名学生的一门课程的考PrivateSubCommand1_Click()Dimi%,k%,a()AsString,counter(0To10)AsIntegera=Split(Text1,",")Fori=0ToUBound(a)Ifa(i)<=100Anda(i)>=0Thenk=a(i)\10counter(k)=counter(k)+1EndIfNextiPrint"统计结果如下:"Fori=0To10Ifcounter(i)<>0ThenPrint"第"&i*10&"--"&i*10+9&"段共有"&counter(i)EndIfNextiEndSub102PrivateSubCommand1_Click()35输入N名同学的成绩,显示于文本框Text1中,按成绩从低到高的次序排序,并将结果显示于另一个文本框Text2中。数组应用—排序(重点、难点算法)103输入N名同学的成绩,显示于文本框Text1中,按成绩从低到高(1)将第1个数与第2个数到第N个数依次比较,如果X(1)>X(j)(j=2,3,…,N),则交换X(1)、X(j)的内容;(2)将第2个数与第3个数到第N个数依次比较,如果X(2)>X(j)(j=3,4,…,N),则交换X(2)、X(J)的内容;(3)重复以上方法,将第i个数与第i+1个数到第N个数依次比较,如果X(i)>X(j)(j=i+1,…,N),则交换X(i)、X(j)的内容;共重复N-1轮。比较交换法:对N个数进行排序(自学)104(1)将第1个数与第2个数到第N个数依次比较,如果X(1)1)将9与15比较,9与20比较,9与14比较,9与13比较,9与17比较 915201413172)将15与20比较,15与14比较(交换),14与13比较(交换),13与17比较 91420151317 913201514173)将20与15比较(交换)、15与14比较(交换)、14与17比较

91315

201417 913142015174)将20与15比较(交换)、15与17比较 913141520175)将20与17比较(交换) 91314151720例:对数91520141317用比较交换法排序1051)将9与15比较,9与20比较,9与14比较,9与1比较交换法:对N个数进行排序(升序)Fori=1ToN-1Forj=i+1ToNIfa(i)>a(j)Thent=a(i)a(i)=a(j)a(j)=tEndIfNextjNexti106比较交换法:对N个数进行排序(升序)Fori=1T选择排序法:对N个数进行排序(升序)1)将第1个数与第2个数到第N个数依次比较,找出第1个数到第N个数中的最小值,记下其位置k,交换X(1)与X(k)的值。这时X(1)为原X(1)到X(N)中的最小值。2)将第2个数与第3个数到第N个数依次比较,找出第2个数到第N个数中的最小值,记下其位置k,交换X(2)与X(k)的值。这时X(2)为原X(2)到X(N)中的最小值。3)重复以上方法,将第i个数与第i+1个数到第N个数依次比较,找出第i个数到第N个数中的最小值,记下其位置k,交换X(i)与X(k)的值。这时X(i)为原X(i)到X(N)中的最小值。共重复N-1轮107选择排序法:对N个数进行排序(升序)1)将第1个数与第2个数例5-8用选择排序法,将15、8、4、13、6、10、17、1按照由小到大的顺序递增排列。

第一步:把要排序的数用一个数组存储,并输出原始数据optionbase1Dima(),i%,k%,j%a=Array(15,8,4,13,6,10,17,1)n=UBound(a)Print"排序前:";Fori=1TonPrinta(i);NextiPrint108例5-8用选择排序法,将15、8、4、13、6、10、1第二步:排序,可以分解为如下几个小的步骤(1)先从n个数中找出最小数的下标(用k表示),并将最小数与第一个数交换位置k=1Forj=2TonIfa(k)>a(j)Thenk=jNextjt=a(1):a(1)=a(k):a(k)=t109第二步:排序,可以分解为如下几个小的步骤(1)先从n个数中(2)从第2~n个数中找出最小数的下标(用k表示),并将最小数与第2个数交换位置k=2Forj=3TonIfa(k)>a(j)Thenk=jNextjt=

温馨提示

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

最新文档

评论

0/150

提交评论