65
江江江江江江江江江江 Visual Basic 程程程程 江江江 江江

第五章 数组

  • Upload
    nusa

  • View
    28

  • Download
    2

Embed Size (px)

DESCRIPTION

第五章 数组. 教学要求. 掌握数组的定义和使用 掌握动态数组的定义和使用 掌握控件数组的建立和使用 掌握常用算法. 教学内容. 5.1 数组的概念 5.2 数组的基本操作 5.3 动态数组 5.4 控件数组 5.5 程序示例. 5.1 数组的概念. 5.1.1 数组命名与数组元素 5.1.2 数组定义 5.1.3 数组的结构 5.1.4 数组函数及数组语句. 基本概念 前面所说的变量都是指简单变量,即一个变量名对应一个存储单元,只能存储一个值,各个变量之间无关联。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第五章   数组

江苏省计算机等级考试

Visual Basic 程序设计

第五章 数组第五章 数组

Page 2: 第五章   数组

2 江苏计算机等级考试

Visual Basic 程序设计

掌握数组的定义和使用 掌握动态数组的定义和使用 掌握控件数组的建立和使用 掌握常用算法

教学要求

Page 3: 第五章   数组

江苏计算机等级考试

Visual Basic 程序设计

3

教学内容教学内容

5.1 数组的概念

5.2 数组的基本操作

5.3 动态数组

5.4 控件数组

5.5 程序示例

Page 4: 第五章   数组

4 江苏计算机等级考试

Visual Basic 程序设计5.1 数组的概念5.1 数组的概念

5.1.1 数组命名与数组元素

5.1.2 数组定义

5.1.3 数组的结构

5.1.4 数组函数及数组语句

Page 5: 第五章   数组

5 江苏计算机等级考试

Visual Basic 程序设计基本概念

前面所说的变量都是指简单变量,即一个变量名对应一个存储单元,只能存储一个值,各个变量之间无关联。

本章我们要介绍的是一种下标变量——数组,是通过一个数组名和下标的组合来表示多个值。用一个相同的名字引用一组变量的数据。

数组,是 VB支持的一种复合结构的数据类型。 数组,是用于保存一组具有相同数据类型的有序的变量的集合。

Page 6: 第五章   数组

6 江苏计算机等级考试

Visual Basic 程序设计5.1.1 数组命名与数组元素5.1.1 数组命名与数组元素

命名规则与简单变量相同。 (参阅 P45) 数组名不是代表某一变量,而是一组变量。 数组元素:

由数组名和该元素在数组中的编号(索引、下标)唯一确定,下标是连续的整数。

数组元素的一般形式: 数组名(下标 1[,下标 2,… ]) 数组的维数:

一维数组——只需一个下标即可唯一确定一个数组元素 多维数组——有两个或两个以上下标的数组,每个下标对应一个“维”。

Page 7: 第五章   数组

7 江苏计算机等级考试

Visual Basic 程序设计5.1.2 数组定义5.1.2 数组定义

数组必须先定义后使用。

定义数组时,确定其名称、数据类型、维数、每一维的上、下界。

数组定义时,系统分配连续的内存空间,用于依次保存所有数组元素。

固定大小数组与动态数组。

Page 8: 第五章   数组

8 江苏计算机等级考试

Visual Basic 程序设计1 、数组说明语句1、数组说明语句

[ 格式 ] : Public|Private|Static|Dim 数组名 ([< 下界 1> To]< 上界 1> [ , [< 下界 2> To]< 上界 2>,…]) As 类型[ 说明 ] :

声明关键字决定作用域,见下页 < 下界 > TO < 上界 > 决定了每一维的大小,下界指下标的

最小值,上界指下标的最大值,其中 [< 下界 > TO] 可省略,此时,默认下界是 0 。

我们习惯于下标是从 1 开始,可在模块的“通用”声明段中使用如下语句

Option Base 1 则在缺省下界的情况下,默认下界是 1 。

Page 9: 第五章   数组

9 江苏计算机等级考试

Visual Basic 程序设计

关键字 使用位置 作用域

Public 在标准模块的声明段中 全局

Private 和Dim

在模块的声明段中 模块

Dim 在过程中 局部

Static 在过程中 局部、静态

注意:全局数组、 全局符号常量和全局定长字符串只能在标准模块中定义

Page 10: 第五章   数组

10 江苏计算机等级考试

Visual Basic 程序设计举例举例

- Dim a(6) as integer

Private Name(1999 to 2002) as string *8

Dim b(2,1 to 2) as integer

注意:在声明语句中的 A( 6)是数组说明符,而在程序其他语句出现的 A( 6)是一个数组元素。

数组元素分别为: a(0) 、 a(1) 、 a(2) 、 a(3) 、 a(4) 、 a(5) 、 a(6) ,共 7 个

数组元素分别为: name(1999) name(2000) name(2001) name(2002) , 用于保存长度为 8 的字符串数据。

数组元素分别为: b(0,1) , b(0,2) , b(1,1) , b(1,2) , b(2,1) , b(2,2)

Page 11: 第五章   数组

11 江苏计算机等级考试

Visual Basic 程序设计2 数组的上、下界2 数组的上、下界

上、下界表示下标的最大、最小值; 下界≤上界; 在固定大小数组定义时,上、下界是常量或常量表达式,不

得是变量; 上、下界应是整数,若不是,则自动四舍五入。

举例: Dim m as integer Const n=5 as integer Dim a(n) as integer Dim b(1 to 6.6) as integer Dim c(1 to 2*3) as integer Dim d(0 to m) as integer×

Page 12: 第五章   数组

12 江苏计算机等级考试

Visual Basic 程序设计3 数组的类型3 数组的类型

可为任一简单数据类型

4 数组的大小 指数组中包含元素的个数。

一维数组元素个数:上界 -下界 +1

二维数组元素个数:

(上界 1- 下界 1+1 ) *(上界 2- 下界 2+1 )

Page 13: 第五章   数组

13 江苏计算机等级考试

Visual Basic 程序设计5.1.3 数组的结构5.1.3 数组的结构

数组的所有元素是按一定顺序存储在连续的存储单元的。

1.一维数组的结构

例: Dim stra(3)

逻辑结构: (stra(0),stra(1),stra(2) stra(3))

存储结构:按照下标从小到大依次存储

Str(0) Str(1) Str(2) Str(3)

Page 14: 第五章   数组

14 江苏计算机等级考试

Visual Basic 程序设计2 二维数组的结构2 二维数组的结构

例: Option base 1

Dim y(3,4) as integer

逻辑结构: y(1,1),y(1,2),y(1,3),y(1,4)

y(2,1),y(2,2),y(2,3),y(2,4) y(3,1),y(3,2),y(3,3),y(3,4)

存储结构:

“ 按列存放”

Page 15: 第五章   数组

15 江苏计算机等级考试

Visual Basic 程序设计3 三维数组的结构3 三维数组的结构

行、列和页组成的三维表。 逻辑结构:见书 P88

存储结构:“逐页逐列”

Page 16: 第五章   数组

16 江苏计算机等级考试

Visual Basic 程序设计5.1.4 数组函数及数组语句

1 、返回上、下界函数:上界: UBound( 数组名 [,d] )下界: LBound( 数组名 [,d] )说明: d代表维数。省略时表示返回第一维的值。

Dim A(5) As Integer, B(2, 3 to 5) As Integer a1=LBound(A) a1=UBound(A) b1=LBound(B,1) b2=LBound(B,2) b3=UBound(b,1) b4=UBound(b,2) Print a1;a2;b1;b2;b3; b4

结果: 0 5 0 3 2 5

举例 :

Page 17: 第五章   数组

17 江苏计算机等级考试

Visual Basic 程序设计

格式: Erase a1[,a2,...]功能:对普通数组初始化(按数组类型给元素赋初值), 对动态数组进行存储空间释放。例: p.89

Option Base 1Private Sub Form_Click() Dim a(3) As Integer a(1) = 1: a(2) = 2: a(3) = 3 Print a(1), a(2), a(3) Erase a Print a(1), a(2), a(3)End Sub

( 3) Erase 初始化数组语句

Page 18: 第五章   数组

18 江苏计算机等级考试

Visual Basic 程序设计

格式: For Each Element In <数组名 >语句块[Exit For]语句块

Next [Element]

功能:依次(存储次序)处理每一个数组元数,直到数组结束。

说明: Element 是 Variant 变量,它逐个地代表数组中的每一个变量。

( 4) For Each-Next 数组循环结构

Page 19: 第五章   数组

19 江苏计算机等级考试

Visual Basic 程序设计

Private Sub Form_Click() Dim E(2, 3) As Integer, V As Variant Dim i As Integer, j As Integer For i = 1 To 2 For j = 1 To 3 E(i, j) = i * 10 + j Next j Next i For Each V In E Print V; Next VEnd Sub

请注意:只能一行或一列输出,不能以矩阵形式输出。参见 p90

例:

处理顺序为该数组的存储顺序——按列 !

Page 20: 第五章   数组

20 江苏计算机等级考试

Visual Basic 程序设计5.2 数组的基本操作5.2 数组的基本操作

5.2.1 数组元素的赋值

5.2.2 数组元素的输出

5.2.3 数组元素的引用

Page 21: 第五章   数组

21 江苏计算机等级考试

Visual Basic 程序设计5.2.1 数组元素的赋值5.2.1 数组元素的赋值

1 用赋值语句给单个数组元素赋值。 Dim score(3) as integer score(1)=90 : score(2)=80 : score(3)=68 2 在循环结构中,用赋值语句逐一给数组元素赋值。 Dim a(1 to 6) as integer For i=1 to 6 a(i)=int(99*rnd)+1 Next i 3 在循环结构中,利用 Inputbox 函数给数组元素赋值。

Dim a(1 to 6) as integer For i=1 to 6 a(i)=inputbox(“ 请输入 a(” & I & ”)”,” 数组赋值” ) Next i

一维数组用一层循环结构

Page 22: 第五章   数组

22 江苏计算机等级考试

Visual Basic 程序设计

格式:变体变量名 =Array([n1,n2,...])功能:将一个变体型变量创建成为一个一维数组,并包含指定的元素。元素的引用方式与一般数组一样。注意: Array 赋值函数只能给变体型变量赋值。不能给其他类型的变量及任何类型的数组赋值。

Option Base 1Private Sub Form_Click() Dim a As Variant, b As Integer a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Print a(1), a(5), a(10) a = "Array" Print a b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)End Sub

4 、 Array 赋值函数

Page 23: 第五章   数组

23 江苏计算机等级考试

Visual Basic 程序设计5.2.2 数组元素的输出5.2.2 数组元素的输出

用 Print 方法显示在窗体或图片框上 赋值给文本框的 Text 属性,在文本框中显示 调试时,调用 Debug 的 Print 方法在“立即”窗口中显

5.2.3 数组元素的引用 注意:在引用数组元素时,元素的下标一定要在定义的上

下界范围之内,否则“数组越界”出错。

Page 24: 第五章   数组

24 江苏计算机等级考试

Visual Basic 程序设计Option Base 1

Private Sub Form_click() Dim compare(12) As Integer, i As Integer Dim max As Integer, min As Integer Randomize For i = 1 To 12 compare(i) = Int(90 * Rnd) + 10 Print compare(i); Next i Print

Print " 最大数是 ;"; max Print " 最小数是 ;"; minEnd Sub

max = compare(1): min = compare(1)For i = 2 To 12

If compare(i) > max Then max = compare(i) ElseIf compare(i) < min Then min = compare(i) End If

Next i

例5-1

产生12

个两位数,从中找

出最大值

、最小值

Page 25: 第五章   数组

25 江苏计算机等级考试

Visual Basic 程序设计

例: 有一个一维数组 a(20) ,要求按照每行 6 个元素的格式输出。数组元素为 100-200 之间的随机数。

Option Base 1Private Sub Form_Click() Dim a(20) As Integer Dim i As Integer, j As Integer For i = 1 To 20 a(i) = Int(101 * Rnd) + 100 Next i

End Sub

For i = 1 To 20 Print a(i) ; j = j + 1

Next i

If j Mod 6=0 Then Print

Page 26: 第五章   数组

26 江苏计算机等级考试

Visual Basic 程序设计

二维数组引用必须用二重循环实现

Option ExplicitOption Base 1Private Sub Form_Click() Dim i As Integer, j As Integer Dim a(3, 4) As Integer Randomize For i = 1 To 3 For j = 1 To 4 a(i, j) = Int(Rnd * 31 + 20) Next j Next i For i = 1 To 3 For j = 1 To 4 Print a(i, j) ; Next j Print Next i

End Sub

程序分析:

程序执行时,计数变量 i 和 j 的变化为:

i=1 时, j 从 1 变化到 4 ,结束内层循环, i变成 2

i=2 时, j 从 1 变化到 4 ,结束内层循环, i变成 3

i=3 时, j 从 1 变化到 4 ,结束内层循环, i变成 4

结束外层循环。循环变量 (i , j) 的变化过程为

( 1 , 1 )( 1 , 2 )( 1 , 3 )( 1 ,4 )

( 2 , 1 )( 2 , 2 )( 2 , 3 )( 2 ,4 )

( 3 , 1 )( 3 , 2 )( 3 , 3 )( 3 ,4 )

正好和二维数组引用的下标一致。

例:二维数组的赋值与输出

For i = 1 To 3 For j = 1 To 4 Picture1.Print a(i, j) ; Next j Picture1.Print Next i

For i = 1 To 3 For j = 1 To 4 s=s & a(i, j) Next j s=s & Chr(13) & Chr(10)Next IText1.Text=s

Page 27: 第五章   数组

27 江苏计算机等级考试

Visual Basic 程序设计

例 : 下列程序完成在窗体上输出二维数组每行元素之和。回答问题:1 、程序有没有错? 2 、错在哪里? 3 、输出语句应出现在什么地方?

Option Base 1Private Sub Form_Click() Dim a(4, 5) As Integer Dim i As Integer, j As Integer Dim sum As Integer For i = 1 To 4 For j = 1 To 5 a(i, j) = Int(101 * Rnd) + 100 Print a(i, j); Next j Print Next i Print For i = 1 To 4 For j = 1 To 5 sum = sum + a(i, j) Next j Next I Print "第 "; i; " 行元素之和为: "; sumEnd Sub

Sum=0

Print "第 "; i; " 行元素之和为: "; sum

程序执行结果界面

Page 28: 第五章   数组

28 江苏计算机等级考试

Visual Basic 程序设计有关二维数组的常见问题:有关二维数组的常见问题:

转置求对角线元素之和求周边元素之和求上、下三角形元素之和求鞍点、最大、最小元素二维数组相乘

Page 29: 第五章   数组

29 江苏计算机等级考试

Visual Basic 程序设计

Option Base 1Private Sub Form_Click() Dim i As Integer, j As Integer, a(3, 4) As Integer Randomize For i = 1 To 3 For j = 1 To 4 a(i, j) = Int(Rnd * 31 + 20) Print a(i,j); Next j Print Next I

End Sub

例:产生一个 3行 4列的矩阵,数据为 [20 , 50] 之间的随机数,然后将矩阵转置输出。

For i = 1 To 4 For j = 1 To 3 Print a(j ,i); Next j Print Next i

For j= 1 To 4 For i= 1 To 3 Print a( i , j); Next j PrintNext i

思考题:

求 n阶方阵的转置矩阵,并输出?

Page 30: 第五章   数组

30 江苏计算机等级考试

Visual Basic 程序设计

1 、分别求一个 3*3 二维数组的主、付对角线元素之和。

2、求二维数组周边元素之和。

练 习

Page 31: 第五章   数组

31 江苏计算机等级考试

Visual Basic 程序设计5.3 动态数组5.3 动态数组

定义:在程序运行过程中,可重新定义大小的数组。说明语句:① Dim 数组名() as 类型 —在变量说明部分② ReDim [Preserve] <数组名 >(维界定义 )—在可执行语句中 Private Sub Form_Click()

Dim Pin( ) As Integer ' 说明整型的动态数组 PinDim x as IntegerX=Val(Text1.text) ReDim Pin(x) '重新说明数组 Pin

...End Sub

注意: - Redim 是可执行语句,只能出现在过程中 - 重新定义动态数组时,不能改变数据类型 - 重定义时,维界定义中可以有变量

Page 32: 第五章   数组

32 江苏计算机等级考试

Visual Basic 程序设计

- 如果 Redim重定义的数组不存在,则相当于一个说明语句

- 当缺省 Preserve 参数时,定义后,原来存储在数组中的数据全部丢失 ,此时可重新定义数组的维数和各维的上下界。

- 当有 Preserve 参数时,可保留原数组中的数据,但不能改变数组的维数,且只能改变最后一维的维上界。

- 用 Dim 语句声明过的数组,只是一个空数组,系统并没有给它分配内存空间,此时,不能对数组元素进行存取操作,否则出错。必须用 ReDim 语句重新定义其大小,系统才给它分配内存,用户才能对此数组元素进行操作。

说 明

Page 33: 第五章   数组

33 江苏计算机等级考试

Visual Basic 程序设计举例:举例:

Option base 1Dim dynarry() as integerDim x as integer,y as integerDynarry(1)=1 Redim dynarry(9)Dynarry(1)=1x=2:y=4Redim dynarry(x,y)Dynarry(1 , 1)=1Erase dynarryDynarry(1 , 1)=1

非法语句,出错

给一维数组元素赋值

给二维数组元素赋值

非法语句,出错

Page 34: 第五章   数组

34 江苏计算机等级考试

Visual Basic 程序设计

Option ExplicitOption Base 1Private Sub Form_Click() Dim i As Integer, a() As Integer ReDim a(4) For i = 1 To 4 a(i) = i Print a(i); Next i Print ReDim Preserve a(6) a(5) = 5 a(6) = 6 For i = 1 To 6 Print a(i); Next iEnd Sub

如果省去 Preserve ,会怎样?

举 例

Page 35: 第五章   数组

35 江苏计算机等级考试

Visual Basic 程序设计

例:找出 1000 以内的所有完数并以指定的格式在列表框中输出。所谓完数,是指它的所有的质因子之和等于它本身的数,如 6=1+2+3 。

例:找出 1000 以内的所有完数并以指定的格式在列表框中输出。所谓完数,是指它的所有的质因子之和等于它本身的数,如 6=1+2+3 。

解题思路:第一步:找出确定一个数是完数

的方法;第二步:从 1到 1000 依次判断。

算法实现 : 两层循环:

内层循环用于找出某数 m 的所有因子并相加求和,并在循环结束后依据因子和是否与该数相等来判断该数是否是完数;

外层循环则用于穷举所有 1000 以内的整数。

Page 36: 第五章   数组

Private Sub Command1_Click() Dim i As Integer, j As Integer, s As Integer, k As Integer Dim str1 As String, a() As Integer For i = 1 To 1000 For j = 1 To i – 1 If i Mod j = 0 Then ’ 是因子,保存进数组并累加求和

s = s + j End If Next j If s = i Then ‘ 是完数,按指定格式输出

End If Next iEnd Sub

注意 s 、 k 赋初值的位置s = 0: k = 0

k = k + 1ReDim Preserve a(k)a(k) = j

str1 = CStr(i) & "="For j = 1 To k str1 = str1 & CStr(a(j)) & "+"Next jList1.AddItem left(str1,len(str1)-1)

Page 37: 第五章   数组

37 江苏计算机等级考试

Visual Basic 程序设计5.4 控件数组5.4 控件数组

5.4.1 基本概念5.4.2 建立控件数组5.4.3 使用控件数组

Load语句Unload语句

Page 38: 第五章   数组

38 江苏计算机等级考试

Visual Basic 程序设计5.4.1 基本概念5.4.1 基本概念

—— 由一组具有相同名称的同类型控件组成。—— 控件数组中的每个控件都由其下标属性 -Index 标识。 即:控件数组名(下标) 如, Option1(0) 、 Option1(1) 、 Option1(2)—— 控件数组中的每一个控件元素可有自己独立的属性设置 ,但共享同一个事件过程,即无论是控件数组中的哪一个控件响应用户的事件,都触发同一事件过程,但相对于简单控件 ,事件过程增加了 Index参数,由其指明具体响应的控件。

例如: Private Sub Option1_Click(Index As Integer) … End Sub——注意:控件数组的第一个下标为 0——优点:使用控件数组编写代码简单、易于维护

Page 39: 第五章   数组

39 江苏计算机等级考试

Visual Basic 程序设计

1. 创建同名控件在窗体中放置一组控件(同类型),确定某个控件为第一个元素(可将其 Index属性设为 0 )。 按顺序将其它控件的 Name (名称)属性改成第一个控件名称(同名)。系统提示“已有一个控件为 *** ,创建一个控件数组吗?”,若第一个控件的 Index属性已设为 0 ,则不出现提示。

5.4.2 建立控件数组

Page 40: 第五章   数组

40 江苏计算机等级考试

Visual Basic 程序设计

2. 复制现存控件 在窗体中放置一个控件,设置好相应的属性 选定该控件,单击“复制”按钮 单击“粘贴”按钮 系统提示”已有一个控件为 *** ,创建一个控件数组吗 ?”

单击“是”按钮

观察控件 Index

属性 ,

系统给每个数组控件标明唯一的索引号,即为该对象的 Index 属性 ( 下标)。

Page 41: 第五章   数组

41 江苏计算机等级考试

Visual Basic 程序设计

例如:在窗体上有一个包含四个命令按纽的控件数组。这 4 个命令按纽的名称相同,均为 Command1 ,系统通过下标 ---Index 属性,区别 4 个不同的控件: Command1(0) , Command1(1) , Command1(2) , Command1(3) 。 这个由 4 个按纽组成的命令按纽控件数组,具有相同的事件过程,由参数 Index 决定,到底是哪个按纽被触发。在事件过程中,应根据 Index参数,分别进行不同的操作。

Private Sub Command1_Click(Index as integer)… …Select case index

Case 0 …Case 1

………

End select……

End Sub

Page 42: 第五章   数组

42 江苏计算机等级考试

Visual Basic 程序设计3.运行时,用语句添加、删除控件数组中的控件

LOAD 语句 [ 格式 ] load object(index) [ 功能 ] 在程序运行时,向控件数组中添加控件。UNLOAD 语句 [ 格式 ] unload object(index) [ 功能 ] 在程序运行时,删除控件数组中的控件。

- index可以跳序;- UNLOAD 语句只能删除由 LOAD 语句添加的控件;- 由 LOAD 语句添加的控件,其 Visible 属性为 false,所以要在程序中设置 True ,才能在窗体上可见;- 由 LOAD 语句添加的控件,其大小、位置与原控件一样,隐藏在其背后,所以要重新设置它的 Top 等属性;

注 意 明白了吗?还是上机验证一下吧!

Page 43: 第五章   数组

43 江苏计算机等级考试

Visual Basic 程序设计演示裁判

Page 44: 第五章   数组

44 江苏计算机等级考试

Visual Basic 程序设计

Private Sub Command1_Click() Dim i As Integer, score As Single For i = 0 To 5

score = score + Val(Text1(i)) Next i score = score / 6 Text2.Text = Format(score, "##.##")End Sub

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If KeyAscii = 13 Then

If Index = 5 Then Command1.SetFocus

Else Text1(Index + 1).SetFocus End If End If

End Sub

Private Sub Form_Load() Dim i As Intege For i = 0 To 5 Text1(i).Text = “” Label1(i).Caption = "裁判 " & i + 1

Next iEnd Sub

Page 45: 第五章   数组

45 江苏计算机等级考试

Visual Basic 程序设计5.5 程序示例5.5 程序示例

选择法排序

冒泡法排序

顺序查找

二分查找

Page 46: 第五章   数组

46 江苏计算机等级考试

Visual Basic 程序设计

[ 分析 ] :先将 N 个数存入数组 A(N) , 第一轮比较,将 A(1) 与 A(2)比较,若 A(1)<A(2) ,则交换 A(1) 和 A(2) 的值;再将 A(1) 与 A(3) 、 A(4) … A(N) 依次按以上规则比较和交换,第一轮比较完毕, N 个数中最大数存放到 A(1) 中 第二轮比较,将 A(2) 与 A(3) 、 A(4)…A(N) 依次比较,结束后, N 个数中第二大数存放到 A(2) 中; 第三轮比较,将 A ( 3 )与 A ( 4 )、 A ( 5 )… A( N )依次比较,完毕后, N 个数中第三大数存放到 A ( 3 )中; …

第 N-1轮比较, A(N-1) 与 A(N) 进行比较;完毕后,A(N-1) 中存放第二小的数,显然 A(N) 中是最小的数。 这样 , 数组 A 中的 N 个元素经过 N-1轮扫视,按从大到小的顺序排列。

例 5-2 :选择法排序。(设从大到小排序)

Page 47: 第五章   数组

47 江苏计算机等级考试

Visual Basic 程序设计

第二轮比较:

6 、 2 、 1 、 3 、 4 、5

6 、 3 、 1 、 2 、 4 、5

6 、 4 、 1 、 2 、 3 、5

6 、 5 、 1 、 2 、 3 、4

第三轮比较:

6、 5、 2、 1、3、 4

6 、 5、 3、 1、2、 4

6 、 5、 4、 1、2、 3

第四轮比较:

6、 5、 4、 2、 1、

3

6 、 5、 4、 3、 1、

2

第五轮比较:

6、 5、 4、 3、 2、1

[实例说明 ]:设无序数据为 1、 2、 3、 4、 5、 6,共有 6个元素,进行 6-1=5轮比较。 5次比较情况如下:

第一轮比较:A(1) a(2) a(3) a(4) a(5) a(6)

2 1 3 4 5 6

3 1 2 4 5 6

4 1 2 3 5 6

5 1 2 3 4 6

6 1 2 3 4 5

Page 48: 第五章   数组

48 江苏计算机等级考试

Visual Basic 程序设计

For i=1 to N-1

For j= i+1 to N

If A(i) < A(j) Then

TEMP=A(i)

A(i)=A(j)

A(j)=TEMP

End If

Next j

Next i

[选择排序程序 ]

i 既控制外层循环执行的次数 ,又可作为被比较数的下标

j 既控制内层循环执行的次数 ,又可作为比较数的下标

Page 49: 第五章   数组

49 江苏计算机等级考试

Visual Basic 程序设计直接排序法直接排序法

选择排序法的改进,每轮扫视,只交换一次数据—— A(I)仅与其后序元素中最大的元素交换。

实现:增设一个 point 变量,记录本轮最大元素的下标。在每轮扫视开始时,先设初值为 I ,然后让 A ( POINT)依次与其后元素比较,当比某元素小时,将该大元素的下标赋给 POINT,即让 A ( POINT)指向本轮大的元素。

当每轮扫视结束后,比较 I 与 POINT 的值,若不同,说明

A ( I )中不是本轮的最大元素,则交换 A ( I )与 A( POINT)中的元素,否则不交换。

Page 50: 第五章   数组

50 江苏计算机等级考试

Visual Basic 程序设计

For i=1 to N-1

point=i

For j= i+1 to N

If A(point) < A(j) Then point=j

Next j

If i < > point then

TEMP=A(i):A(i)=A(point):A(point)=TEMP

End if

Next i

[直接排序程序 ]

Page 51: 第五章   数组

51 江苏计算机等级考试

Visual Basic 程序设计

[ 分析 ] : 第一轮比较:将 A ( 1 )和 A ( 2 )比较,若 A( 1 ) <A ( 2 )则交换这两个数组元素的值,否则不交换;然后再用 A ( 2 )和 A ( 3 )比较,处理方法相同;以此类推,直到 A ( N-1 )和 A ( N )比较后,这时 A ( N )中就存放了 N 个数中最小的数。 第二轮比较:将 A(1) 和 A ( 2 )、 A ( 2 )和 A( 3 ),, A ( N-2 )和 A ( N-1 )依次比较,处理方法和第一轮相同,这一轮比较结束后, A ( N-1 )中就存放了 N个数中第二小的数。 ……

第 N-1轮比较:将 A ( 1 )和 A ( 2 )进行比较,处理同上,则 A ( 2 )中存放了第二大的数, A ( 1 )中显然是最大的数。 这样 ,经过 N-1轮扫视,数组 A 中的 N 个元素按从大到小的顺序排列。

例:冒泡法排序。(设从大到小排序)

Page 52: 第五章   数组

52 江苏计算机等级考试

Visual Basic 程序设计

第一论扫视:2 、 1 、 3 、 4 、 5 、6

2 、 3 、 1 、 4 、 5 、6

2 、 3 、 4 、 1 、 5 、6

2 、 3 、 4 、 5 、 1 、6

2 、 3 、 4 、 5 、 6 、1

第二轮扫视:

3 、 2 、 4 、 5 、 6 、1

3 、 4 、 2 、 5 、 6 、1

3 、 4 、 5 、 2 、 6 、1

3 、 4 、 5 、 6 、 2 、1

第三轮扫视:

4 、 3 、 5 、 6 、2 、 1

4 、 5 、 3 、 6 、2 、 1

4 、 5 、 6 、 3 、2 、 1

第五轮扫视:

6 、 5 、 4 、 3 、 2 、1

第四轮扫视:

5 、 4 、 6 、 3 、 2 、

1

5 、 6 、 4 、 3 、 2 、

1

[实例说明 ]:设无序数据为 1、 2、 3、 4、 5、 6,共有 6个元素,进行 6-1=5轮扫视。 5次扫视情况如下:

Page 53: 第五章   数组

53 江苏计算机等级考试

Visual Basic 程序设计

For i=1 to n-1

For j=1 to n-i

If a(j) < a(j+1) Then

TEMP=A(j) : A(j)=A(j+1):A(j+1)=TEMP

End If

Next j

Next I

冒泡排序程序

i 只控制外层循环执行的次数

j 既控制内层循环执行的次数 ,又可作为比较数的下标

Page 54: 第五章   数组

选择法:逐个比较,逆序交换

冒泡法:两两 比较,逆序交换

XZ

Page 55: 第五章   数组

Private Sub Form_Click() Dim search(10) As Integer, i As Integer Dim S As Integer Randomize For i = 1 To 10 search(i) = Int(Rnd * 100) + 100 Print search(i); Next i Print S = InputBox(" 输入要查找的数 ") For i = 1 To 10 If search(i) = S Then Exit For Next i If i <= 10 Then Print " 要找的数是 Search("; i; ")" Else Print " 没找到! " End IfEnd Sub

例5-4

:顺序查找。

[

分析]:所谓顺序查找,就是将要查找内容与

一组数据中的每个元素,依次进行比较,最终得

到所要查找内容“

存在”

或“

不存在”

的结论。

Page 56: 第五章   数组

57 江苏计算机等级考试

Visual Basic 程序设计

[ 分析 ] :二分查找 是一种快捷有效的查找方 法,使用二分查找的前提是数据序列已排好序。 假设有 n 个数已经按照从小到大的顺序排列,并存放在数组 A 中,设 Top 为查找区 间的下界——下标,初值为 1 ;Bot 为查找区 间的上界,初值为 n ;设需要查找 的数为 x ;二分查找 的算法如下:( 1 )求出查找区 间的中间位置Mid=Int((Top+Bot)/2)

( 2 )若 A ( Mid ) =x ,则找到,结束比较( 3 )若 A ( Mid ) <x ,则表明 x 在 A ( Mid+1 )到 A( Bot )区间内,查找区 间缩小一半,设置 Top=Mid+1

( 4 )若 A ( Mid ) >x ,则表明 x 在 A ( Top )到 A ( Mid-1 )区间内,查找区 间缩小一半,设置 Bot=Mid-1

( 5 )重复执行以上操作( 6 )结束循环的条件有两个:已经找到;找不到 --TOP>BOT

[ 例 5-5] :二分查找。

Page 57: 第五章   数组

3 41 11105 96 7 8

x=8

Left RightMid Left RightMidRightLeft

Mid

2 31 11104 96 7 8

x=5

Left RightMidMid RightLeft

Mid Left Left

Mid

Left

Mid

Page 58: 第五章   数组

59 江苏计算机等级考试

Visual Basic 程序设计

Left = LBound(a) Right = UBound(a) x = InputBox(" 请输入要查找的数据 ") Do While Left <= Right Mid = Int((Left + Right) / 2) If a(Mid) = x Then Exit Do ElseIf a(Mid) < x Then Left = Mid + 1 Else

Right = Mid - 1 End If Loop If Left <= Right Then

Print " 要查找的 "; x; " 是 A( "; Mid; ")" Else

Print " 没找到! "; x End If

二分查找

Page 59: 第五章   数组

60 江苏计算机等级考试

Visual Basic 程序设计例 5-8 统计字母 ( 不分大小写 ) 在文本中出现的次

P109

算法分析:建立一个有 26个元素的数组,分别保存每个字母出现的次数。下标即是该字母是第几个字母 .

Page 60: 第五章   数组

Private Sub Command1_Click() Dim St As String, Idx As Integer, I As Integer, Js As Integer Dim A(0 To 25) As Integer Dim Ch As String * 1, L As Integer St = Text1.Text: L = Len(St)

End Sub

For I = 1 To L Ch = UCase(Mid(St, I, 1)) If Ch >= "A" And Ch <= "Z" Then Idx = Asc(Ch) - Asc("A") A(Idx) = A(Idx) + 1 End IfNext I For I = 0 To 25 If A(I) <> 0 Then Js = Js + 1 Text2 = Text2 & Chr(I + Asc("A")) & ":" & Str(A(I)) & " " If Js Mod 5 = 0 Then Text2 = Text2 & Chr(13) & Chr(10) End If

Next I

控制打印每行统计字符的个数

转换为大写字符

求该字符与“ A” 的间隔位置,以此作为下标

Page 61: 第五章   数组

例 5-10 找出 5000以内的亲密对数。所谓亲密对数,是指甲数的所有因子之和等于乙数,而乙数的所有因子之和等于甲数。如: 220 的因子和: 1+2+4+5+10+11+20+44+55+110=284 284 的因子和: 1+2+4+71+142=220

例 5-10 找出 5000以内的亲密对数。所谓亲密对数,是指甲数的所有因子之和等于乙数,而乙数的所有因子之和等于甲数。如: 220 的因子和: 1+2+4+5+10+11+20+44+55+110=284 284 的因子和: 1+2+4+71+142=220

算法分析:采用二层循环结构 .

外层循环:遍历 1——5000 以内的所有整数,采用 FOR 循环,计数控制变量 i既控制循环执行的次数,又可作为甲数。

内层循环:求出某数的所有因子,并求和 ,因为每个数的因子数不确定,所以用动态数组保存因子。

外层循环中:先求出 i的因子之和 sum1,然后再求出 sum1 的因子之和 sum2 ,判断 sum2 是否等于 i, 若相等,则输出 i和 sum1 及其因子,不等则继续判断 i+1 。

Page 62: 第五章   数组

63 江苏计算机等级考试

Visual Basic 程序设计例 5-11 将一个数列中的重复数删除。例 5-11 将一个数列中的重复数删除。

算法分析: 第一轮,将 A(1) 与 A(2) 、 A(3) … A(N) 依次比较,若 A( i)与 A(1) 相同,则删除,删除的方法是将位于 A( i)元素之后的元素依次前移一位,即将 A ( i)覆盖; 第二轮,将 A(2) 与其后元素依次比较,删除所有与 A(2)相同的元素; … 循环的次数事先不确定,随重复数的多少而不同,所以采用 DO-LOOP循环,循环结束条件是被比较的数组元素 a(n)是倒数第二个元素。 与比较数进行比较的数 a(i) 是从 a(n+1)开始到最后一个元素。而一旦发现与 a(n)重复的 a(i) ,就利用 FOR 循环将a(i+1) 到最后一个元素依次赋给前一个元素,即将 a(i)覆盖删除,同时重新定义数组的大小,减 1 。

Page 63: 第五章   数组

64 江苏计算机等级考试

Visual Basic 程序设计

ub = UBound(a)n = 1 ‘ 是被比较数的下标Do While n < ub ‘ 循环结束条件为被比较数是倒数第二个元素 i = n + 1 ‘比较数的下标 , 从 N+1 开始 Do While i <= ub If a(n) = a(i) Then For j = i To ub – 1 ‘ 从 a(i+1)到最后一个元素依次前移 a(j) = a(j + 1) Next j ub = ub – 1 ‘ 数组大小减 1 ReDim Preserve a(ub) Else i = i + 1 ‘若不相同 ,再与下一个元素比较 End If Loop n = n + 1 ‘被比较数下标加 1Loop

Page 64: 第五章   数组

65 江苏计算机等级考试

Visual Basic 程序设计

例 5-12 15 名学生按照已有的编号顺序围成一圈 ,1~3报数 ,逢3 出局 , 要求记录学生出局的先后顺序 (即编号 ).例 5-12 15 名学生按照已有的编号顺序围成一圈 ,1~3报数 ,逢3 出局 , 要求记录学生出局的先后顺序 (即编号 ).算法分析 :

需解决如下一个几个问题 :

1.如何记录 15 个学生的编号 ,又如何围成一圈

2.如何实现报数

3.如何实现逢 3 出局 ,并记录下编号

4.已出局的如何不参加报数

定义一个有 15 个元素的数组 , 元素下标即编号 ,当下标依次递增时 ,若大于 15,就回到 1.

数组元素的初值为 1, 顺序对数组元素的值实现累加

当累加和为 3 时 ,当前累加的元素出局 ,记录下其下标

将出局数组元素的值置为 0, 则累加时不起作用 , 即不参与报数

Page 65: 第五章   数组

66 江苏计算机等级考试

Visual Basic 程序设计

For i = 1 To 15 old_no(i) = 1 Next iidx = 0For i = 1 To 15 count = 0 ‘累加和 ,起报数作用 Do While count < 3 idx = idx + 1 If idx > 15 Then idx = 1 ‘ 围成一圈 , 循环 count = old_no(idx) + count ‘累加求和报数 Loop old_no(idx) = 0 ‘当前元素出局 new_no(i) = idx ‘记录其编号Next iFor i = 1 To 15 Text1.Text = Text1.Text & Right(" " & CStr(i), 3) Text2.Text = Text2.Text & Right(" " & CStr(new_no(i)), 3)Next i