1、第第5 5章章 数组和记录数组和记录 5.1 5.1 数组的概念数组的概念 5.2 5.2 数组的定义数组的定义 5.3 5.3 数组的基本操作数组的基本操作 5.4 5.4 数组的应用数组的应用 5.5 5.5 控件数组控件数组 5.6 5.6 记录记录 5.7 5.7 常用算法(二)常用算法(二)5.1 5.1 数组的概念数组的概念 1.数组的作用数组的作用 数组通常和循环一起使用可以大大减少编程的复杂性,数组通常和循环一起使用可以大大减少编程的复杂性,有些算法不用数组就无法实现。有些算法不用数组就无法实现。例例5.1 计算计算100个学生某门课的平均分,并统计高于平均个学生某门课的平均分
2、,并统计高于平均分的人数。不用数组就很难编程。分的人数。不用数组就很难编程。Dim mark(1 To 100)As Integer,aver!,over%,i%aver=0:over=o For i=1 To 100 mark(i)=InputBox(输入成绩输入成绩)aver=aver+mark(i)计算总分计算总分 Next i aver=aver/100 over=0 For i=1 To 100 If(mark(i)aver)Then over=over+1 Next I Print aver,over2.数组的概念数组的概念 数组是一批数据或控件的集合。数组是一批数据或控件的集合。
3、普通数组普通数组存放一批相同类型的数据存放一批相同类型的数据 控件数组控件数组存放一批相同名称的控件存放一批相同名称的控件例如,定义一个例如,定义一个integer型数组型数组a(10),它包含,它包含11个个同类型的变量:同类型的变量:a(0),a(1),a(10)Variant型数组则可以存放不同类型的数据型数组则可以存放不同类型的数据又如,在窗体上画一个标签又如,在窗体上画一个标签label1,并用复制和粘,并用复制和粘贴的方法操作贴的方法操作5次,可以得到一个名称为次,可以得到一个名称为label1的的控件数组,含控件数组,含6个标签,每个标签的名称均为个标签,每个标签的名称均为lab
4、el1,但各个控件的,但各个控件的index属性值分别是属性值分别是0,1,5。3.数组元素和数组的维数数组元素和数组的维数 数组的成员称为数组元素,其名称与数组名相同,其下数组的成员称为数组元素,其名称与数组名相同,其下标表示该元素在数组中的位置。因此,数组元素也称下标表示该元素在数组中的位置。因此,数组元素也称下标变量。标变量。数组的维数表示数组元素需要几个下标才能正确表示其数组的维数表示数组元素需要几个下标才能正确表示其在数组中的位置,它代表数组的逻辑结构,最多在数组中的位置,它代表数组的逻辑结构,最多60维。维。一维数组的逻辑结构是线性的,只用一个下标表示各个一维数组的逻辑结构是线性的
5、,只用一个下标表示各个元素在数组中的位置元素在数组中的位置 例例 a(10):含含11个元素的一维数组个元素的一维数组 a(0),a(1),a(2),a(3),a(4),a(5),a(6),a(7),a(8),a(9),a(10)二维数组的逻辑结构是一个二维表,用两个下标表示各二维数组的逻辑结构是一个二维表,用两个下标表示各个元素在数组中的位置:第一个下标表示行,第二个下个元素在数组中的位置:第一个下标表示行,第二个下标表示列。标表示列。例例 b(2,3):含三行四列共含三行四列共12个元素的二维数组个元素的二维数组 b(0,0)b(0,1)b(0,2)b(0,3)b(1,0)b(1,1)b(
6、1,2)b(1,3)b(2,0)b(2,1)b(2,2)b(2,3)4.数组的存储结构数组的存储结构 数组在内存中占用一片连续的存储单元。数组在内存中占用一片连续的存储单元。一维数组一维数组的存储结构与逻辑结构相同,即各个元素按下的存储结构与逻辑结构相同,即各个元素按下标顺序依次存放;标顺序依次存放;二维数组二维数组的存储结构是按行的顺序存储各个元素。例如,的存储结构是按行的顺序存储各个元素。例如,数组数组b(2,3)的存储形式为:的存储形式为:b(0,0)b(0,1)b(0,2)b(0,3)b(1,0)b(1,1)b(1,2)b(1,3)b(2,0)b(2,1)b(2,2)b(2,3)三维数
7、组三维数组是由若干个二维数组组成的,其存储结构是按是由若干个二维数组组成的,其存储结构是按顺序存储各个二维数组。例如,数组顺序存储各个二维数组。例如,数组c(1,2,1)的存储形式的存储形式为:为:c(0,0,0)c(0,1,0)c(0,2,0)c(1,0,0)c(1,1,0)c(1,2,0)c(0,0,1)c(0,1,1)c(0,2,1)c(1,0,1)c(1,1,1)c(1,2,1)5.2 数组的定义数组的定义 静态数组(定界数组)静态数组(定界数组)动态数组(可变数组、可调数组)动态数组(可变数组、可调数组)静态数组静态数组:在定义时明确规定数组的大小,且在:在定义时明确规定数组的大小,
8、且在程序运行过程中,其大小不能再改变程序运行过程中,其大小不能再改变 动态数组动态数组:在定义时不指定数组的大小,在运行:在定义时不指定数组的大小,在运行过程中可以根据需要用过程中可以根据需要用ReDim重新规定其大小重新规定其大小数组数组 1.静态数组的定义静态数组的定义 形式形式:Dim 数组名数组名(维界维界1,维界维界2)As 类型类型 维界维界1、维界、维界2等表示各维的大小,形式为等表示各维的大小,形式为:下界下界 To 上界上界 下界和上界为常数表达式:下界和上界为常数表达式:-2147483648 到到 2147483647 下界缺省时默认下界缺省时默认0 维界用来确定数组的体
9、积。维界用来确定数组的体积。类型缺省时,默认变体型类型缺省时,默认变体型 除了用除了用Dim外,还可以用外,还可以用static、private和和public来定义数组,它们可以在不同的窗体和模块内定来定义数组,它们可以在不同的窗体和模块内定义,所定义的数组的作用范围也不相同。义,所定义的数组的作用范围也不相同。下界可以缺省,系统默认的下界缺省值为下界可以缺省,系统默认的下界缺省值为0。例:例:Dim lArray(0 To 3,0 To 4)As Long 等价于等价于:Dim lArray(3,4)As Long 例:例:Dim mark(1 to 100)As Integer如果需要默
10、认的下界缺省值不是如果需要默认的下界缺省值不是0,则可以在通用声明段,则可以在通用声明段内用内用Option Base语句确定,例如用语句确定,例如用 Option Base 1来定义下界缺省值为来定义下界缺省值为1,此后,若定义,此后,若定义 Dim a(2,3)则等价于则等价于Dim a(1 to 2,1 to 3)注意:注意:(1)在数组定义中,数组名后面括号中数值表示数组的维在数组定义中,数组名后面括号中数值表示数组的维界界,即每一维的大小;而在程序其他地方出现的带扩号的即每一维的大小;而在程序其他地方出现的带扩号的则表示数组中的某一个元素,括号中的数值表示该元素在则表示数组中的某一个
11、元素,括号中的数值表示该元素在数组中的位置。两者写法形式相同,但意义不同。数组中的位置。两者写法形式相同,但意义不同。Dim x(10)As Integer 定义定义x数组有数组有11个元素个元素 x(10)=100 对对x(10)这个数组元素赋值这个数组元素赋值 (2)静态数组一经定义,编译系统为其安排存储空间,其静态数组一经定义,编译系统为其安排存储空间,其维数和各维大小不能再改变维数和各维大小不能再改变 2.动态数组的定义动态数组的定义 定义动态数组时,数组名后面的括号内不含维界。定义动态数组时,数组名后面的括号内不含维界。这时,编译系统并不为该数组安排存储空间。而这时,编译系统并不为该
12、数组安排存储空间。而在程序运行时,用在程序运行时,用ReDim语句指明该数组的大小,语句指明该数组的大小,并安排存储空间并安排存储空间 Dim sArray()As Single Sub Form_Load()ReDim sArray(4,8)sArray原有值丢失原有值丢失 ReDim Preserve sArray(4,100)sArray原有值保留原有值保留 End Sub (1)重新定义动态数组的大小时,既可以改变其大重新定义动态数组的大小时,既可以改变其大小,也可以改变其维数,下标可以用常数,也可小,也可以改变其维数,下标可以用常数,也可以用有确定值的变量。例如:以用有确定值的变量。
13、例如:Dim a()As Integer a为动态数组为动态数组 Private Sub Command1_click()ReDim a(4,5)重新定义动态数组重新定义动态数组 n=InputBox(“请输入请输入n的值的值”)ReDim a(n)重新定义动态数组重新定义动态数组 End Sub (2)定义定义Variant型动态数组时,可以省略数组名型动态数组时,可以省略数组名后面的圆括号后面的圆括号 Dim a a为为variant型变量或数组型变量或数组 a=5 a为简单变量为简单变量 Print a Redim a(5)a为数组为数组 For I=0 to 5 a(I)=I Prin
14、t a(I);Next I (3)每次使用每次使用ReDim语句都会使数组中原有的数据语句都会使数组中原有的数据丢失,当希望改变数组大小而又要保留数组中原丢失,当希望改变数组大小而又要保留数组中原有的数据时,可以在数组名前面增加有的数据时,可以在数组名前面增加Preserve关键关键字,这时,只能改变多维数组中最后一维的上界字,这时,只能改变多维数组中最后一维的上界,而不允许改变其它维的大小及最后一维的下界,而不允许改变其它维的大小及最后一维的下界。Dim a()As Integer ReDim a(10,10)ReDim Preserve a(10,Ubound(a)+2)正确正确 ReDi
15、m Preserve a(Ubound(a)+2,10)错误错误5.3 数组的基本操作数组的基本操作1.数组元素的赋值数组元素的赋值(1)静态数组只能对数组元素逐一赋值,不能用数静态数组只能对数组元素逐一赋值,不能用数组名整体赋值组名整体赋值 Dim a(4)As Integer For i=0 To 4 a(i)=10 a数组的每个元素值为数组的每个元素值为10 Next I是允许的。是允许的。a=(1,2,3,4,5)是不允许的。是不允许的。(2)变体型动态数组可以用变体型动态数组可以用Array函数定界和整体函数定界和整体赋值赋值 Dim a As Variant,b()As varia
16、nt,i%a=Array(1,2,3,4,5)b=Array(“abc”,”derf”,67,True)For i=Lbound(a)To Ubound(a)Picture1.Print a(i)Next i For i=Lbound(b)To Ubound(b)Picture1.Print b(i)Next I 其中,其中,Lbound()和和Ubound()用来确定数组的下界用来确定数组的下界和上界和上界 (3)动态数组也可以用动态数组也可以用同类型同类型的静态数组整体赋值的静态数组整体赋值 Dim a(4)As Integer,b()As Integer a(0)=1:a(1)=3:a(
17、2)=5:a(3)=-8:a(4)=7 b=a 将数组将数组a整体赋给数组整体赋给数组b,b为动态数组为动态数组 其中,其中,b=a相当于相当于 For i=Lbound(a)To Ubound(a)b(i)=a(i)Next i2.数组的输入数组的输入 可以用可以用InputBox函数或文本框函数或文本框实现数组的输入实现数组的输入 Dim sB(4,5)As Integer,i%,j%For i=0 To 4 For j=0 To 5 sB(i,j)=InputBox(输入输入sB(&i&,&j&)的值的值)Next j Next i For i=0 To 4 For j=0 To 5 P
18、rint Format$(sB(i,j),00);spc(2);Next j Print Next i3.数组的输出数组的输出数组的输出只能对数组的各个元素进行。数组的输出只能对数组的各个元素进行。例:输出方阵例:输出方阵sc中的下三角元素中的下三角元素 Dim sc(4,4)As Integer For i=0 To 4 For j=0 To i sc(i,j)=i*5+j Print sc(i,j);“;Next j Print Next i如何输出上三角?如何输出上三角?4.求数组中最大元素及所在下标及各元素之和求数组中最大元素及所在下标及各元素之和 Option Base 1 Dim
19、Max As Integer,iMax As Integer Dim Sum As Integer,iA(10)Max=iA(1):iMax=1:Sum=iA(1)For i=2 To 10 If iA(i)Max Then 求最大值求最大值 Max=iA(i)iMax=i End If Sum=Sum+iA(i)求各元素之和求各元素之和 Next i Picture1.Print Max,iMax,Sum5.将数组将数组iA(10)中第一个元素与最后一个元素交换中第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,直到整个数,第二个元素与倒数第二个元素交换,直到整个数组各元素按逆序
20、存放。组各元素按逆序存放。For i=1 To 102 t=iA(i)iA(i)=iA(10-i+1)iA(10-i+1)=t Next i1.控件数组的概念控件数组的概念 一组相同的控件可以组成一个控件数组一组相同的控件可以组成一个控件数组,它们共用一个它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号个唯一的索引号(Index=0,1,2,.),类似数组的下标。,类似数组的下标。使用控件数组的最大优点是数组中的各个控制件可以共使用控件数组的最大优点是数组中的各个控制件可以共享同样的事件过程,从而减少编程工作量。享同样的
21、事件过程,从而减少编程工作量。例:例:Private Sub cmdName_Click(Index As Integer)If Index=3 then 处理第四个命令按钮的操作处理第四个命令按钮的操作 End If End Sub5.4 5.4 控件数组控件数组2.控件数组的建立控件数组的建立(1)在设计阶段建立在设计阶段建立 第一步先建立第一个控件第一步先建立第一个控件,即在窗体上画出该控件即在窗体上画出该控件,设置其,设置其Name属性属性,作为控件数组名。作为控件数组名。第二步选中该控件,进行第二步选中该控件,进行“复制复制”和和“粘贴粘贴”,当弹出的对话框中出现当弹出的对话框中出现
22、“已经有一个控件为已经有一个控件为.,创建控件数组吗创建控件数组吗”信息时,单击信息时,单击“是是”按钮,就按钮,就建立了一个控件数组,经过若干次建立了一个控件数组,经过若干次“复制复制”和和“粘贴粘贴”,可以建立该控件数组的各个元素。每个,可以建立该控件数组的各个元素。每个元素都是一个控件元素都是一个控件,它们具有相同的它们具有相同的Name,各个控,各个控件的件的index属性值为该控件在数组中的位置属性值为该控件在数组中的位置(索引索引)号号,从从0开始。开始。第三步编制控件数组的事件过程。第三步编制控件数组的事件过程。例例5.3 建立含有四个命令按钮的控件数组,当单击某个建立含有四个命
23、令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。命令按钮,分别显示不同的图形或结束操作。Private Sub command1_Click(Index As Integer)Picture1.Cls Picture1.FillStyle=5 填充右斜线图案填充右斜线图案 Select Case Index Case 0 Picture1.Print 画直线画直线 Picture1.Line(2,2)-(7,7)Case 1 Picture1.Print 画矩形画矩形 Picture1.Line(2,2)-(7,7),BF Case 2 Picture1.Print 画圆画
24、圆 Picture1.Circle(4.5,4.5),3.5,1 Case Else End End SelectEnd Sub(2)在程序运行阶段建立在程序运行阶段建立 第一步在窗体上画出某控件(如第一步在窗体上画出某控件(如Label1),并设),并设置该控件的置该控件的Index属性值为属性值为0,表示该控件为数组,表示该控件为数组,从而建立控件数组的第一个元素从而建立控件数组的第一个元素 第二步在编程时通过第二步在编程时通过Load方法添加其余的若干个方法添加其余的若干个元素,也可以通过元素,也可以通过Unload方法删除某个添加的元方法删除某个添加的元素。如:素。如:Load lab
25、el1(i)i=1 第三步在程序中为每个新添加的控件数组元素设第三步在程序中为每个新添加的控件数组元素设置置Left和和Top属性以确定其在窗体的位置,并将其属性以确定其在窗体的位置,并将其Visible 属性设置为属性设置为True(或或-1)。程序运行时会自动按程序中的设置,将各个控件程序运行时会自动按程序中的设置,将各个控件显示在窗体上。显示在窗体上。例例5.4 通过程序建立的方法在窗体上用通过程序建立的方法在窗体上用64个标签框组成一个标签框组成一个国际象棋的棋盘。个国际象棋的棋盘。先在窗体上画先在窗体上画label1控件,设置其控件,设置其Index属性值为属性值为0,表,表示该控件
26、为数组示该控件为数组,从而建立控件数组的第一个元素从而建立控件数组的第一个元素在在Form_load()事件中用两重循环由事件中用两重循环由Load方法自动生成方法自动生成8行行8列列label1(k),k=8(i-1)+j,并确定每个控件的并确定每个控件的Left和和Top在在label1_click()事件中获得被单击的事件中获得被单击的label1控件的控件的index值,并改变所有控件的颜色值,并改变所有控件的颜色用程序建立的方法用程序建立的方法*VB程序设置颜色的四种方法程序设置颜色的四种方法用用RGB(x,y,z)函数函数x、y、z在在0255之间取值之间取值黑色黑色RGB(0,0
27、,0)兰色兰色RGB(0,0,255)绿色绿色RGB(0,255,0)青色青色RGB(0,255,255)红色红色RGB(255,0,0)洋红色洋红色RGB(255,0,255)黄色黄色RGB(255,255,0)白色白色RGB(255,255,255)用用Quick BASIC提供的颜色函数提供的颜色函数QBColor(i)0 黑色黑色 1 兰色兰色 2 绿色绿色 3 青色青色 4 红色红色 5 洋红色洋红色 6 黄色黄色 7 白色白色 8 灰色灰色 9 亮兰色亮兰色 10 亮绿色亮绿色 11亮青色亮青色12 亮红色亮红色 13 亮洋红色亮洋红色 14 亮黄色亮黄色 15 亮白亮白使用使用“
28、对象浏览器对象浏览器”中列出的内部常数中列出的内部常数 vbBlack黑黑 vbBlue蓝蓝 vbCyan青青 vbGreen绿绿 vbMagenta洋红洋红 vbRed红红 vbWhite白白 vbYellow黄黄直接用十六进制长整数表示直接用十六进制长整数表示(数值越小颜色越深数值越小颜色越深)&H0&黑黑&HFFFFFF&白白5.5 5.5 自定义数据类型自定义数据类型(记录记录)记录的概念记录的概念 记录是由一组相关的数据项(字段)组成的整体。记录是由一组相关的数据项(字段)组成的整体。例如,一个学生的记录包括学号、姓名、性别、各例如,一个学生的记录包括学号、姓名、性别、各门课的分数等
29、,均称为数据项或字段,它们可以是不门课的分数等,均称为数据项或字段,它们可以是不同的数据类型。同的数据类型。在在VB中,每个控件是一个对象,一个对象的所有属中,每个控件是一个对象,一个对象的所有属性组成一个记录,属性名则是记录的一个数据项(字性组成一个记录,属性名则是记录的一个数据项(字段)。当用户自己创建类或对象时,就要定义属性记段)。当用户自己创建类或对象时,就要定义属性记录。录。2.2.记录的定义记录的定义 定义记录时,要先定义记录类型,然后再定义该记录类定义记录时,要先定义记录类型,然后再定义该记录类型的变量或数组。型的变量或数组。记录类型的定义记录类型的定义(1)Type 自定义类型
30、名自定义类型名 元素名元素名(下标下标)As 类型名类型名 元素名元素名(下标下标)As 类型名类型名End Type 例:例:Type StudType No As Integer 学号学号 Name As String*20 姓名姓名 Sex As String*1 性别性别 Mark(1 To 4)As Single 4门课程成绩门课程成绩 Total As Single 总分总分 End Type定义记录的语句如果放在标准模块中,可省略定义记录的语句如果放在标准模块中,可省略public。如。如果放在窗体中,则必须用果放在窗体中,则必须用private。如。如在窗体的通用声明处在窗体的
31、通用声明处Private Type StuType End Type在模块的通用声明处在模块的通用声明处Public Type StuType End Type(2)记录变量或数组的定义记录变量或数组的定义可以用已定义的记录类型定义变量或数组。可以用已定义的记录类型定义变量或数组。Dim a As StuType,b(20)As StuType 3.记录的引用记录的引用(1)引用记录的一般形式是引用记录的一般形式是 .a.IntNo=123 a.StrName=“李明李明”(2)用用With语句引用语句引用形式:形式:With 语句块语句块 End With 其中,对象名可以是记录变量、控件名
32、或其他的对象名其中,对象名可以是记录变量、控件名或其他的对象名作用:对一个对象执行多条语句时,可省略对象名。作用:对一个对象执行多条语句时,可省略对象名。例如:要给记录变量例如:要给记录变量a赋值,可以用赋值,可以用with语句设置。语句设置。With a .IntNo=123 .StrName=“李明李明”.strSex=“M”.sngMark(1)=87 .sngMark(2)=91 .sngMark(3)=79 .sngMark(4)=95 .blnTag=True End With例例5.5 利用记录类型编程模拟数据库记录的输入、利用记录类型编程模拟数据库记录的输入、显示和查询。显示和
33、查询。标签:标签:Label1Label5 文本框:文本框:Text1Text3命令按钮:命令按钮:Command1(3)在窗体通用声明段定义记录类型:在窗体通用声明段定义记录类型:Private Type StudType用用Command1_Click(Index As Integer)事件编程事件编程新增新增:添加记录:添加记录前一个前一个:显示前一条记录:显示前一条记录后一个后一个:显示下一条记录:显示下一条记录最高分最高分:显示最高分:显示最高分位置位置:显示总记录数和当:显示总记录数和当前记录号前记录号5.6 5.6 常用算法常用算法(二二)1.分类统计分类统计例例5.6 输入一串
34、字符,统计各字符出现的次数,不区分字输入一串字符,统计各字符出现的次数,不区分字母的大小写。母的大小写。设计:用一个文本框输入字符串,图形框输出个字符的个设计:用一个文本框输入字符串,图形框输出个字符的个数,命令按钮进行统计。数,命令按钮进行统计。算法:为了计算各字母的个数,定义一个含算法:为了计算各字母的个数,定义一个含26个元素的一个元素的一维整型数组维整型数组a,a(1)存放字母存放字母a或或A的个数,的个数,a(2)存放字母存放字母b或或B的个数,的个数,。为了对各个字母计数,用为了对各个字母计数,用Mid$()函数依次取出字符串中的函数依次取出字符串中的各个字母并进行判断和计数。各个
35、字母并进行判断和计数。为了不区分大小写,可用为了不区分大小写,可用Ucase$()函数将所取出的字母一函数将所取出的字母一律转换成大写,也可用律转换成大写,也可用Lcase$()将所取出的字母一律转将所取出的字母一律转换成小写换成小写2.大量数据的输入和编辑大量数据的输入和编辑例例5.7 利用文本框可实现大量数字串输入和编辑的功能。利用文本框可实现大量数字串输入和编辑的功能。用用Text1输入一批数字串,输入一批数字串,Picture1显示数字串中的各个显示数字串中的各个数字,数字,Text2输出数组各元素输出数组各元素用用a=split(text1,”,”)将将text1中的文字按逗号分割成
36、各个中的文字按逗号分割成各个数组元素,并显示在图形框数组元素,并显示在图形框picture1中中用用text2=join(a,”“)将数组将数组a合并成用空格分隔的字符串合并成用空格分隔的字符串设计:两个命令按钮,一个用于通知用户输入数字串;另设计:两个命令按钮,一个用于通知用户输入数字串;另一个用于合并数组元素。两个文本框,一个用于输入和一个用于合并数组元素。两个文本框,一个用于输入和编辑数据,另一个用于输出结果;图形框用于输出数组编辑数据,另一个用于输出结果;图形框用于输出数组a各元素的值。各元素的值。算法:算法:通过通过Text1_keypress事件编程只允许输入事件编程只允许输入09
37、、“,”、“.”和和“-”;通过通过Command1_Click事件编程将连续两个逗号分隔事件编程将连续两个逗号分隔符替换成一个逗号,并用符替换成一个逗号,并用a=Split(Text1,”,”)将将Text1文本文本框中的字符串以逗号为分界符分离出各项数据,依次存框中的字符串以逗号为分界符分离出各项数据,依次存入数组入数组a中,并在图形框中显示;中,并在图形框中显示;通过通过Command2_click事件编程,用事件编程,用Text2=join(a,”“)将数组将数组a的各元素以空格为分隔符合并成字符串的各元素以空格为分隔符合并成字符串,并在并在Text2中显示。中显示。3.数组排序数组排
38、序(1)选择法排序选择法排序 例例5.8 对已存放在数组对已存放在数组iA中的中的n个数,用选择法按递增顺个数,用选择法按递增顺序排序。序排序。选择排序算法选择排序算法 n个数排序要经过个数排序要经过n-1轮比较和交换轮比较和交换(1)第一轮从第一轮从n个数中选出最小的数个数中选出最小的数(递增递增),与第,与第1个个数交换位置;数交换位置;(2)第二轮从除第第二轮从除第1个数外的其余个数外的其余n-1个数再按个数再按(1)的的方法选出次小的数,与第方法选出次小的数,与第2个数交换位置。个数交换位置。(3)以后各以后各i轮均从余下的数中找到最小数,并与第轮均从余下的数中找到最小数,并与第i个数
39、交换,直到个数交换,直到i=n-1为止。最后构成递增序列。为止。最后构成递增序列。For i=1 To n-1 iMax=i For j=i+1 To n If iA(iMax)iA(j)Then iMax=j end if Next j t=iA(i)iA(i)=iA(iMax)iA(iMax)=t Next I (2)冒泡法排序冒泡法排序 例例5.9 对例对例5.8用冒泡法按递增顺序排序。用冒泡法按递增顺序排序。冒泡排序算法:冒泡排序算法:n个数排序也要经过个数排序也要经过n-1轮比较和交换轮比较和交换第一轮从第一个数开始,与第二个数比较,若第一个第一轮从第一个数开始,与第二个数比较,若第
40、一个数大于第二个数,则将二者交换位置;否则,不交换。数大于第二个数,则将二者交换位置;否则,不交换。其后,再将第二个数与第三个数比较,顺序不对的,也其后,再将第二个数与第三个数比较,顺序不对的,也同样进行交换,直到倒数第二个数。结果:最大的数沉同样进行交换,直到倒数第二个数。结果:最大的数沉底,最小数上浮一个位置;底,最小数上浮一个位置;第二轮仍从第一个数开始,依次进行相邻两个数的比第二轮仍从第一个数开始,依次进行相邻两个数的比较,必要时进行交换,直到倒数第三个数,结果:次大较,必要时进行交换,直到倒数第三个数,结果:次大数将落在倒数第二个位置上,最小数继续上浮一个位置数将落在倒数第二个位置上
41、,最小数继续上浮一个位置;以后各以后各i轮均从第轮均从第1个数开始,直到倒数第个数开始,直到倒数第n-i+1个数,个数,进行相邻两数的比较,直到进行相邻两数的比较,直到i=n-1为止,此时最小数将为止,此时最小数将上浮到第一个位置上,从而最后构成递增序列。上浮到第一个位置上,从而最后构成递增序列。Option Base 1 Dim i%,j%,imax%,t%For i=1 To n-1 For j=1 To n+1-i If iA(j)iA(j+1)Then t=iA(j)iA(j)=iA(j+1)iA(j+1)=t End If Next j Next i For i=1 To n Pic
42、ture2.Print iA(i)Next i原始数据:原始数据:8 6 9 3 2 7第一轮第一轮 6 8 3 2 7 9第二轮第二轮 6 3 2 7 8 9第三轮第三轮 3 2 6 7 8 9第四轮第四轮 2 3 6 7 8 9第五轮第五轮 2 3 6 7 8 9 4.数组元素的插入和删除数组元素的插入和删除进行数组元素的插入或删除时,首先要定位,然后进行数进行数组元素的插入或删除时,首先要定位,然后进行数组元素的顺序移动。组元素的顺序移动。(1)插入插入 例例5.10 将一个数将一个数k插入到有序数组插入到有序数组a(n)中,使插入后的数中,使插入后的数组仍然有序。组仍然有序。插入算法:
43、插入算法:先确定先确定k在数组中的位置在数组中的位置j将将a(n)a(j)顺序向后顺序向后 移动一移动一个位置个位置将将k置入置入a(j)中中 Dim i%,j%ReDim Preserve iA(10)保留保留ia()中的原数据中的原数据 For j=1 To 9 If k iA(j)Then Exit For 插入位置定位插入位置定位 Next j For i=9 To j Step-1 iA(i+1)=iA(i)数据移动数据移动 Next i iA(j)=k For i=1 To 10 Picture2.Print iA(i);Next i(2)删除删除例例5.11 从例从例5.10运算
44、结果的运算结果的10个元素中删除元素个元素中删除元素13。删除算法:删除算法:先确定要删除的元素先确定要删除的元素k在在数组中的位置数组中的位置j将将a(j+1)a(n)顺序向前顺序向前移动一个位置移动一个位置用用ReDim将数组的体积将数组的体积减少减少1*(3)矩阵运算矩阵运算矩阵相乘:矩阵相乘:A m,nB n,l=C m,l n C i,j=A i,k B k,j k=1矩阵转置矩阵转置 1 2 3 4 1 5 9 13 5 6 7 8 2 6 10 14 9 10 11 12 3 7 11 15 13 14 15 16 4 8 12 16例例5.14 模拟计算器进行正整数的输入和四则
45、运算,并可进模拟计算器进行正整数的输入和四则运算,并可进行八、十六进制数的转换。行八、十六进制数的转换。设置设置3个控件数组:运算符控件数组、数制转换控件数组个控件数组:运算符控件数组、数制转换控件数组和数字控件数组。和数字控件数组。CE控件是清屏按钮。文本框用于显示控件是清屏按钮。文本框用于显示输入的数据和运算结果。输入的数据和运算结果。假设,运算符和数制转换控件数组在设计时建立。数字假设,运算符和数制转换控件数组在设计时建立。数字控件数组在设计时仅建立控件数组在设计时仅建立“0”元素,运行时添加元素,运行时添加“1”“9”共共9个控件数组元素。个控件数组元素。本章重点本章重点静态数组和动态数组的定义、赋值和输入静态数组和动态数组的定义、赋值和输入/输出输出(静态静态数组和动态数组的区别,确定类型数组和变体型数组数组和动态数组的区别,确定类型数组和变体型数组的区别的区别)动态数组的重定义及其限制动态数组的重定义及其限制控件数组的使用(设计阶段建立和程序运行阶段建立控件数组的使用(设计阶段建立和程序运行阶段建立两种方法)及两种方法)及indexindex属性的作用属性的作用数组的简单应用:统计、排序、插入和删除数组的简单应用:统计、排序、插入和删除记录类型的定义方法和初步使用记录类型的定义方法和初步使用
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。