第4章数组与过程学习目标:掌握数组和过程的概念掌握数组的定义和应用掌握Sub过程和Function过程的应用掌握过程的参数传递与过程的作用域了解Shell函数第4章数组与过程教学内容:4.1数组4.2过程4.3Shell函数4.1数组-数组的概念数组用于保存大量的、逻辑上有联系的数据数组的特点:数据中的元素在类型上是一致的数组元素在内存空间上是连续存放的数组元素的引用可通过下标进行数组在使用前必须要定义(声明)返回目录4.1数组-一维数组的定义和使用1.数组的定义(声明)Dim数组名([下界To]上界)As数据类型例如:DimData(1To40)AsInteger定义数组可以使用类型符例,DimData%(1To40)下界的默认值为0例,DimSalary(1000)AsCurrency通过数组名和下标可引用数组中的元素例,Data(25)=95Form1.PrintData(25)返回目录4.1数组-一维数组的定义和使用说明-1:数组定义后的初值:数值型数组各元素为0,逻辑型数组各元素为False,字符串数组各元素为空串()。可同时声明几个数组,用逗号分隔,例如DimA%(10To100),B(800)AsLong定义数组时,下标的下界和上界值只能是常数或常数表达式。下例的定义是错误的N=100:DimData(N)AsInteger定义时,数组的上界值不得超出长整型范围,且数组的上界值不得小于下界值。返回目录4.1数组-一维数组的定义和使用说明-2:数组的元素个数称为数组长度。Lbound()、Ubound()函数可测定数组的下界与上界值例如:PrivateSubForm_Click()DimA%(12To24)PrintLBound(A),UBound(A)EndSub用OptionBasen可设定数组的默认下界n的取值只能是0或1设定方法:在代码窗口的通用声明段中输入OptionBase0或OptionBase1返回目录4.1数组-一维数组的定义和使用2.数组元素的使用通过数组名和下标[例4.1]PrivateSubCommand1_Click()DimData(5)AsIntegerDimSum,IAsIntegerForI=1To5'输入5个数据到数组中Data(I)=InputBox(输入第&I&个数据)NextIForI=1To5'完成5个数组元素的相加Sum=Sum+Data(I)NextIPrintSumEndSub返回目录ForI=1To5Data(I)=InputBox(输入第&I&个数据)Sum=Sum+Data(I)NextI4.1数组-一维数组的定义和使用说明:数组实际上是用一个变量名字代表一组数,这组数是连续排列的,用顺序号作为下标区分各个数。数组下标是一个整型量,如果有小数则自动按四舍五入取整。例如,Data(3.4)=3,而Data(3.5)=2。数组常见的错误:下标出界返回目录Test(1)=4Test(2)=3Test(3)=2Test(4)超出定义4.1数组-一维数组应用例题[例4.3]输出斐波那契级数的前20项PrivateSubForm_Click()DimF(20)AsInteger,IAsIntegerF(1)=1:F(2)=1'第一、第二项为1ForI=3To20'第三项起每项为前二项之和F(I)=F(I-2)+F(I-1)NextIForI=1To20'在窗体上输出PrintF(I);IfIMod5=0ThenPrintNextIEndSub返回目录4.1数组-一维数组应用例题[例4.4]输入一组不重复的数据,找出最大值及其位置PrivateSubForm_Click()ConstLength=5'定义常量Length作为数组最大下标DimTest%(Length),I%,Max%,L%ForI=1ToLength'通过键盘输入给数组赋值Test(I)=InputBox(输入第&I&个数据)NextIMax=Test(1):L=1'设数组第一个元素为最大值ForI=2ToLengthIfMaxTest(I)Then'找到新的最大值,记录其值和位置Max=Test(I)L=IEndIfNextIMsgBox最大值x=&Max&,位置是&LEndSub返回目录4.1数组-一维数组应用例题[例4.5]产生10个整数到数组中,将其顺序颠倒后输出PrivateSubForm_Click()ConstLength=10:DimD(Length)AsInteger,I%,Temp%ForI=1ToLength'给数组赋值并输出D(I)=14+I:PrintD(I);NextIPrint:Print'换行ForI=1ToLength/2'交换Temp=D(I)D(I)=D(Length-I+1)D(Length-I+1)=TempNextIForI=1ToLength'交换后输出PrintD(I);NextIEndSub返回目录D(1)与D(10)交换D(2)与D(9)交换……D(I)与D(10-I+1)4.1数组-一维数组应用例题[例4.8]产生100个不重复的3位随机整数,并按每行7列的格式输出PrivateSubForm_Click()DimData(100)AsInteger,I%,J%RandomizeTimer'设置随机化种子,保证每组数据不重复ForI=1To100'循环产生100个数据Data(I)=Int(Rnd()*900)+100ForJ=1ToI–1'与已经产生的数据比较IfData(I)=Data(J)Then'数据已存在则舍弃,重新产生I=I-1ExitFor'提前退出数据比较的循环EndIfNextJNextI返回目录4.1数组-一维数组应用例题I=1:J=1DoWhileI=100ForJ=1To7'每行打印7列IfI100ThenExitForPrintData(I);I=I+1NextJPrint'打印换行LoopEndSub返回目录ForI=1To100PrintData(I);IfIMod7=0ThenPrintNextI4.1数组-一维数组应用例题[例4.10]统计成绩分布PrivateSubForm_Click()DimN(10)AsInteger,IAsInteger,XAsIntegerConstm=10ForI=1TomX=InputBox(请输入+Str(I)+个学生的成绩)X=Int(X/10)'也可写成X=X\10N(X)=N(X)+1NextIPrint100;--;100;N(10)ForI=9To0Step-1Print10*I;--;10*I+9;N(I)NextIEndSub返回目录4.1数组-排序问题1.选择法排序(N个数据升序)1)先假设第1个数据最小,依次同第2、第3、…、第N个数据进行比较,一旦第1个数据大于其它值则交换。这样,第1轮比较完毕,找出了最小数据作为第1个数据。2)以第2个数据为最小数据,依次同第3、第4、…、第N个数据进行比较,若第2个数据大于其它值则交换。这样,第2轮交换完毕,则找出第二小的数据作为第2个数据。3)依此类推,第N-1轮比较将找出第N-1小的数据,剩下的一个数据就是最大数,排列在最后。以6个数据为例:返回目录原始序列:30,20,10,90,50,60第1轮比较结果:10|30,20,90,50,60第2轮比较结果:10,20|30,90,50,60第3轮比较结果:10,20,30|90,50,60第4轮比较结果:10,20,30,50|90,60第5轮比较结果:10,20,30,50,60|904.1数组-排序问题[例4.11]用选择法完成10个随机数据的升序排序。ConstN=10:DimD(N)AsInteger,I%,J%,T%RandomizeTimerForI=1ToND(I)=Rnd*100:PrintD(I);'排序前的数据序列NextIPrint:PrintForI=1ToN-1'挑出前N-1个小的数ForJ=I+1ToNIfD(I)D(J)Then'数据元素交换T=D(I):D(I)=D(J):D(J)=TEndIfNextJNextIForI=1ToN'输出排序结果PrintD(I);NextI返回目录找最小数据作为第1个数据:I=1ForJ=2ToN'这里2等价I+1IfD(1)D(J)ThenT=D(1):D(1)=D(J):D(J)=TEndIfNextJ4.1数组-排序问题2.选择法排序(N个数据升序)1)第1轮比较:从第1个元素开始,两两相邻比较到N-1,值大的放在后面。比较完毕,最大的数成为第N个元素(沉底)。2)第2轮比较:从第1个元素开始,两两相邻比较到N-2,值大的放在后面。比较完毕,最大的数成为第N-1个元素。3)依此类推,直至最后一次比较。返回目录第1轮比较:原序列:30,20,10,90,50,60第1次比较结果:20,30,10,90,50,60第2次比较结果:20,10,30,90,50,60第3次比较结果:20,10,30,90,50,60第4次比较结果:20,10,30,50,90,60第5次比较结果:20,10,30,50,60,90第2轮比较:原序列:20,10,30,50,60,90第1次比较结果:10,20,30,50,60,90第2次比较结果:10,20,30,50,60,90第3次比较结果:10,20,30,50,60,90第4次比较结果:10,20,30,50,60,904.1数组-排序问题[例4.12]用冒泡法完成10个随机数的升序排序ConstN=10:DimD(N)AsInteger,I%,J%,T%RandomizeTimerForI=1ToND(I)=Rnd*100:PrintD(I);NextIPrint:PrintForI=N-1To1Step-1'大数逐个沉底ForJ=1ToIIfD(J)D(J+1)ThenT=D(J):D(J)=D(J+1):D(J+1)=TEndIfNextJNextIForI=1ToN'输出排序结果PrintD(I);NextI返回目录最大的数成为第N个元素(沉底):I=N-1ForJ=1ToN-1'这里N-1等价IIfD(J)D(J+1)ThenT=D(J):D(J)=D(J+1):D(J+1)=TEndIfNextJ4.1数组-排序问题[例4.13]PrivateSubForm_Click()DimS_Name(7)AsString,S_Age(7)AsIntegerDimI%,J%,N%N=7S_Name(1)=李大明:S_Age(1)=18S_Name(2)=王超:S_Age(2)=21S_Name(3)=张弓:S_Age(3)=20S_Name(4)=陈卫国:S_Age(4)=24S_Name(5)=马太原:S_Age(5)=25S_Name(6)=吴济贫:S_Age(6)=19S_Name(7)=戴天:S_Age(7)=18返回目录对字符串数组S_Name和S_Age赋值4.1数组-排序问题ForI=1ToN-1'用选择法排序ForJ=I+1ToNIfS_Age(I)S_Age(J)ThenS_Age(0)=S_Age(I)S_Age(I)=S_Age(J)S_Age(J)=S_Age(0)S_Name(0)=S_Name(I)S_Name(I)=S_Name(J)S_Name(J)=S_Name(0)EndIfNextJNextIForI=1ToNPrintLeftB(S_Name(I),2);S_Age(I);;NextIEndSub返回目录在交换年龄值的同时,也要交换姓名,以保持姓名和年龄下标的一致。函数LeftB()表示按字节取出指定数量的字符。一个汉字占两个字节。4.1数组-动态数组与静态数组1.动态数组的声明与使用声明:说明数组的名称和类型(不说明下标范围)使用前用R