第5章 数组.ppt_第1页
第5章 数组.ppt_第2页
第5章 数组.ppt_第3页
第5章 数组.ppt_第4页
第5章 数组.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 数组,第5章 数组,【本章导读】 在现实生活中,存在着各种各样的数据。有些数据之间没有太多的内在联系,用简单变量就可以进行存取和处理。第四章中我们用到的变量都属于这种情况。但是,在实际工作中,常常会遇到大批的有着内在联系的数据需要处理,例如,学生成绩的统计、人口普查的数据处理、农业实验观测值等等。如果仍然用简单变量来存取和处理,不仅很不方便,几乎没有办法处理,有时甚至是不可能处理的。针对这个问题,我们需要引入一个重要的概念数组来解决。,第5章 数组,【本章要点】 数据数组 控件数组 常用算法,5.1 数组的概念,5.1.1 数组和数组元素 数组由下标变量名和圆括号组成。 括号中有一个下

2、标时,叫做一维下标变量, 例如:S(1), S(10) 括号中有两个下标时,叫做二维下标变量, 例如:A(1,2)。 括号中有三个下标时,叫做三维下标变量, 例如:C(1,2,2)等。,5.1 数组的概念,5.1.2 数组说明语句 1. 数组说明语句的格式 Dim (a1 To a2 , b1 To b2 ,) As 或者 Dim (a1 To a2 , b1 To b2 ,) Visual Basic还允许用Option Base 来指明下界是 0 还是 1。 具体的格式为: Option Base 0 数组的下界是 0 Option Base 1 数组的下界是 1,5.1 数组的概念,5.

3、1.2 数组说明语句 2. 功能 该语句能为数组定义维数、每维的上界值、下界值和数组的类型。,5.1 数组的概念,5.1.3 数组赋值函数 函数Array()被叫做数组赋值函数。 1.格式为: 数组变量名Array(常量列表) 2. 功能 该函数的功能就是将常量列表中的常量依次赋给一个一维数组的对应元素。 3. 说明: 格式中的数组变量应该被定义为变体变量; 数组的上下界值可以通过LBound和UBound函数得到。,5.1 数组的概念,5.1.4 动态数组 创建动态数组,可以按照以下步骤执行: (1)和普通数组的声明一样使用Dim语句给数组赋予一个空维数表。 (2)使用时用ReDim语句重新

4、分配数组的实际元素个数。 ReDim语句的具体语法格式如下: ReDim Preserve () As 类型,5.1 数组的概念,5.1.4 动态数组 说明: 1)ReDim语句用来定义或重定义动态数组的大小。 2)在执行ReDim语句时,如果使用了Preserve关键字,则在重定义数组最末维的大小同时仍保留数组中的原有内容;如果未使用Preserve关键字,则数组中存放的所有当前值就会消失。,5.1 数组的概念,例5.2 编写程序,将输入的10个数据按照输入的顺序逆向输出。 分析:假定输入的是数值型数据。按照其输入的顺序,分别用D(1),D(2),D(3),D(10)表示。输出时,反过来D(

5、10),D(3),D(2),D(1)即可。,5.1 数组的概念,例5.2 编写程序,将输入的10个数据按照输入的顺序逆向输出。,5.1 数组的概念,例5.2 编写程序,将输入的10个数据按照输入的顺序逆向输出。 程序源代码如下: Option Explicit Option Base 1 Dim D(1 To 10) As Single Private Sub cmdInput_Click() Dim I% For I = 1 To 10 D(I) = Val(InputBox(, 输入数据) txtInput.Text = txtInput.Text & D(I) & Next I End

6、Sub,5.1 数组的概念,例5.2 编写程序,将输入的10个数据按照输入的顺序逆向输出。 程序源代码如下: Private Sub cmdOutput_Click() Dim I% For I = 10 To 1 Step -1 txtOutput.Text = txtOutput.Text & D(I) & Next I End Sub,5.2 控件数组,5.2.1 控件数组的概念 特点: 1.具有相同的控件名(即控件数组名),并按照下标索引号(Index,相当于一般数组的下标)来识别各个控件。 2.控件数组中的控件具有相同的一般属性。 3.所有控件共用相同的事件过程。,5.2 控件数组,

7、5.2.2 控件数组的建立 建立控件数组有三种方法: 1. 给控件起相同的名称。 2. 将现有的控件复制并粘贴到窗体、框架或图片框上。 3. 将控件的Index属性值改为一个整数(032 767)。,5.2 控件数组,5.2.3 控件数组的使用 例5.1 按下图设计窗体,其中单选按钮(共5个)构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小。,5.2 控件数组,5.2.3 控件数组的使用 例5.1 (1)在窗体中设计控件数组Option1,其中包含5个单选按钮对象。,5.2 控件数组,5.2.3 控件数组的使用 例5.1 Private Sub Form_Load() 窗体加

8、载时,选定第一个单选按钮 optFont(0).Value = True 设定文本框中的字号 txtResult.FontSize = optFont(0).Caption End Sub Private Sub optFont_Click(Index As Integer) txtResult.FontSize = optFont(Index).Caption End Sub,5.3 程序举例,例5.3 产生10个互相不等的在0,50之间的随机整数。 分析:若只产生10个随机整数,只需用循环控制即可。而现在要求10个数据互不相等,因此对每产生的一个数据都要与前面已产生过的数据一一比较,只有当

9、该数据与前面所有数据全部不等时,该数据才能被保留下来。 我们可以利用随机函数产生0,50之间的随机整数。 产生A,B区间的随机整数的公式为: Int(A+(B-A+1)*Rnd),5.3 程序举例,例5.3 解法1: Private Sub cmdStart_Click() Dim A(1 To 10) As Integer Dim I%, J% For I = 1 To 10 Re: A(I) = Int(10 + (50 - 10 + 1) * Rnd) For J = 1 To I - 1 If A(I) = A(J) Then GoTo Re Next J Next I For I =

10、 1 To 10 lblResult.Caption = lblResult.Caption & A(I) & Next I End Sub,5.3 程序举例,例5.3 解法2: Private Sub cmdStart_Click() Dim A(1 To 10) As Integer Dim I%, J% For I = 1 To 10 A(I) = Int(10 + (50 - 10 + 1) * Rnd) For J = 1 To I - 1 If A(I) = A(J) Then I = I - 1 Exit For End If Next J Next I For I = 1 To

11、 10 lblResult.Caption = lblResult.Caption & A(I) & Next I End Sub,5.3 程序举例,例5.4 有数据:3,7,2,9,5,1,6。编写程序,将其按升序排列。 解法1:直接排序法 分析:直接排序法的具体方法是,先用第1个数据与剩下第2到第N这N-1个数据分别比较:用第1个数据与第2个数据比较,如果它们之间的关系不符合升序要求,就交换它们的值。接下来,第1个数据与第3个数据比较,直到第一个数据与第N数据比较完为止。这时,第一个数据就是该序列中最小的一个数据。然后再用第2个数据与剩下第3到第N这N-2个数据分别比较。一直下去,直到用第

12、N-1个数据与第N个数据比较完为止。,5.3 程序举例,例5.4 有数据:3,7,2,9,5,1,6。编写程序,将其按升序排列。 解法1:直接排序法 初始: 第一轮:用D(1)与D(2)D(7)分别比较:,5.3 程序举例,例5.4 有数据:3,7,2,9,5,1,6。编写程序,将其按升序排列。 解法1:直接排序法 第二轮:用D(2)与D(3)D(7)分别比较: 以此类推,一直到第六轮:用D(6)与D(7)比较完成,此时全部数据也就排序完成了。,5.3 程序举例,例5.4 解法1:直接排序法的程序源代码如下: Option Explicit Option Base 1 Dim D() As S

13、ingle Dim N As Integer Private Sub Form_Load() N = 0 End Sub Private Sub cmdInput_Click() N = N + 1 ReDim Preserve D(N) As Single D(N) = Val(InputBox(, 输入数值) lblInput.Caption = lblInput.Caption & & D(N) End Sub,5.3 程序举例,例5.4 解法1:直接排序法的程序源代码如下: Private Sub cmdOK_Click() Dim I%, J%, X! For I = 1 To N

14、- 1 For J = I + 1 To N If D(I) D(J) Then X = D(I): D(I) = D(J): D(J) =X End If Next J Next I For I = 1 To N lblOutput.Caption = lblOutput.Caption & & D(I) Next I End Sub,5.3 程序举例,例5.4 解法2:选择排序法 分析:选择排序法的具体方法是(假定N个数据已经存放到D数组中):在D(1)与D(N)中选择一个最小的元素,放在D(1)中;再在D(2)与D(N)中选择一个最小的元素,放在D(2)中;一直下去,直到将在D(N-1)

15、与D(N)中选择最小的元素,放在D(N-1)中为止。,5.3 程序举例,例5.4 解法2:选择排序法 初始: 第一轮:将1记入最小位置号W,用D(W)与D(2)D(7)分别比较 : 第一轮操作完成,数组中最小的数据在第W个位置上,令第W个与第一个数据交换,数组中的数据变为:,5.3 程序举例,例5.4 解法2:选择排序法 第二轮:将2记入最小位置号W,用D(W)与D(2)D(7)分别比较: 第二轮操作完成,数组中最小的数据在第W个位置上,令第W个与第二个数据交换,数组中的数据变为: 以此类推,一直到第六轮比较完成,此时全部数据也就排序完成了。,5.3 程序举例,例5.4 解法2:选择排序法 P

16、rivate Sub cmdOK_Click() Dim I%, J%, W%, X! For I = 1 To N - 1 W = I For J = I + 1 To N If D(W) D(J) Then W = J Next J X = D(W): D(W) = D(I): D(I) = X Next I For I = 1 To N lblOutput.Caption = lblOutput.Caption & & D(I) Next I End Sub,5.3 程序举例,例5.4 解法3:冒泡排序法 分析:冒泡排序法的具体方法是(假定N个数据已经存放到D数组中):比较D(1)与D(

17、2),若D(1)D(2),交换D(1)与D(2),否则继续比较D(2)与D(3),若D(2)D(3),交换D(2)与D(3),一直下去,比较D(n-1)与D(n),若D(n-1)D(n),交换D(n-1)与D(n)。到此为止第一轮比较结束,最大值(泡泡)就“浮出来了”。 重复执行前面的操作(每次都比前一次提前一个数结束),直到将只剩下的D(1)与D(2)比较完为止。,5.3 程序举例,例5.4 解法3:冒泡排序法 Private Sub cmdOK_Click() Dim I%, J%, X! For I = 1 To N - 1 For J = 1 To N - I If D(J) D(J

18、+ 1) Then X = D(J): D(J) = D(J + 1): D(J + 1) = X End If Next J Next I For I = 1 To N lblOutput.Caption = lblOutput.Caption & & D(I) Next I End Sub,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法1:顺序检索 分析:所谓“顺序检索”就是从第一个数据开始一个一个的比较,直到找到输入的数据或找完全部数据为止。由此可以看出“顺序检索”可以对无序序列进行处理。 检索结束后,如果被检索数据在该序列中,则显示输入数

19、据所在的位置;如果被检索数据不在该序列中,则显示输入的数据“不在序列中”。,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法1:顺序检索程序源代码如下: Option Explicit Option Base 1 Dim D(1 To 9) As Integer Private Sub Form_Load() Dim I% For I = 1 To 9 D(I) = Int(100 * Rnd) txtOriginal.Text = txtOriginal.Text & D(I) & Next I End Sub,5.3 程序举例,例5.6 对一个

20、有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法1:顺序检索程序源代码如下: Private Sub cmdCheck_Click() Dim X!, I%, J% Dim Sign As Boolean X = Val(InputBox(输入要检索的数据, 输入) Sign = False For I = 1 To 9 If X = D(I) Then Sign = True Exit For End If Next I,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法1:顺序检索程序源代码如下: If Sign Then lblRe

21、sult.Caption = 要检索的数据 & X & _ 在序列的第 & I & 个位置上。 Else lblResult.Caption = 要检索的数据 & X & _ 不在序列中。 End If End Sub,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法2:对分检索 分析:对分检索只能用于有序数列。 对分检索的算法思想是:每次都取数据区间的中间值,并且通过这个中间值与被检索数据比较,来判断是否找到。如果没有找到,再比较这个中间值与被检索数据的大小,从而决定被检索数据可能存在的新区间。由于这个新区间是由原区间“对分”得到的,因此这种方法

22、被叫做“对分检索”。,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法2:对分检索程序源代码如下: Option Explicit Option Base 1 Dim D(1 To 9) As Integer Private Sub Form_Load() Dim I% D(1) = Int(100 * Rnd(1) txtOriginal.Text = D(1) & For I = 2 To 9 D(I) = Int(D(I - 1) + 100 * Rnd) txtOriginal.Text = txtOriginal.Text & D(I)

23、& Next I End Sub,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法2:对分检索程序源代码如下: Private Sub cmdCheck_Click() Dim X!, I%, J%, LeftData%, RightData%, MidData% Dim Sign As Boolean X = Val(InputBox(输入要检索的数据, 输入) Sign = False LeftData = 1: RightData = 9,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法2:对分检

24、索程序源代码如下: Do While RightData = LeftData And Flag MidData = Int(LeftData + RightData) / 2) If D(MidData) = X Then Sign = True : Exit Do Else If D(MidData) X Then RightData = MidData - 1 Else LeftData = MidData + 1 End If End If Loop,5.3 程序举例,例5.6 对一个有9个数据的数据序列,判断由键盘输入的数据是否在其中。 解法2:对分检索程序源代码如下: If Sig

25、n Then lblResult.Caption = 要检索的数据 & X & _ 在序列的第 & MidData & 个位置上。 Else lblResult.Caption = 要检索的数据 & X & _ 不在序列中。 End If End Sub,5.3 程序举例,例5.7 编写程序,统计掷硬币时正面或反面向上的次数(掷硬币的次数由键盘输入)。 这是一个典型的“分类统计问题”。 解法1:使用选择结构 分析:由于需要统计的类别只有两项,因此可以在循环控制下使用选择语句实现。 假设用 0 代表正面向上、1 反面向上。用变量A计正面向上次数,用变量B计反面向上次数。 在循环控制下用随机函数生

26、成0或1:Int(2 * Rnd)。循还执行结束后输出A和B的统计结果。,5.3 程序举例,例5.7 解法1:使用选择结构 Private Sub cmdStart_Click() Dim A%, B% Dim I%, X%, N%, K% K = Val(InputBox(输入投掷硬币的次数) A = 0: B = 0 Randomize For I = 1 To K X = Int(2 * Rnd) If X = 0 Then A = A + 1 Else B = B + 1 Next I lblA.Caption = 正面向上的次数: & A lblB.Caption = 反面向上的次数

27、: & B End Sub,5.3 程序举例,例5.7 解法1:使用数组 分析:假设用 0 代表正面向上、1 反面向上。用A(0)计正面向上次数,用A(1)计反面向上次数。在循环控制下用随机函数生成0或1:Int(2 * Rnd)。循还执行结束后输出A(0)和A(1)的统计结果。,5.3 程序举例,例5.7 解法1:使用数组 Private Sub cmdStart_Click() Dim A(1) As Integer Dim I%, X%, K% K = Val(InputBox(输入投掷硬币的次数) For I = 0 To 1 A(I) = 0 Next I Randomize For I = 1 To K X = Int(2 * Rnd

温馨提示

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

评论

0/150

提交评论