Visual Basic 程序设计甘肃农业大学信息科学技术学院
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
在程序设计中,除了要遵循语法外,更重要的是算法( algorithm)设计。所谓“算法”,是指程序的计算方法。对于许多问题,计算机中已有成熟的算法,本章介绍几种常用的算法。
介绍数组的概念,在一般的高级语言中都引入数组的概念,用来处理成批的数据。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
5.1 数组的概念
5.2 静态数组与动态数组
5.3 数组的初始化与基本操作
5.4 控件数组
5.5 常用算法与数组应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1 数组的概念
数组是有序的数据的集合,一般一个数组中的元素属于同一种数据类型( Visual Basic允许数组中的元素是不同类型的),用来处理成批的该类型数据。可以用一个统一的数组名和下标来唯一确定数组中的元素。
在 Visual Basic中,
– 根据数组下标个数(即维数)的不同,可以分为一维数组、二维数组和多维数组;
– 根据数组的大小确定与否,可以分为静态 (定长 )数组和动态 (可变长 )数组。
– 数组中的元素不仅可以是各种数据类型的数据,还可以是各种对象控件。数组元素由控件组成的数组,称为控件数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1 数组的概念
5.1.1 一维数组
5.1.2 二维数组和多维数组
5.1.3 UBound和 LBound函数
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
一维数组的定义
– 只有一个下标的数组称为一维数组。
– 一维数组定义的格式为:
在过程中定义局部数组
Dim | Static 数组名( [下标下界 To ]下标上界 ) [As 数据类型 ]
– 在模块(窗体模块和标准模块)的声明部分定义模块级数组
Dim | Private 数组名( [下标下界 To ]下标上界 ) [As 数据类型 ]
– 在标准模块的声明部分定义全局数组
Public数组名 ( [下标下界 To ]下标上界 ) [As 数据类型 ]
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
说明:
– ( 1)数组的作用域和变量的作用域相同。 Static作为关键字定义数组和使用 Static定义变量含义相同,虽然定义的是过程级数组,但数组中的各元素在第一次过程执行时分配存储空间,过程执行完后并不释放其存储空间,数组各元素的值依然被保留。
– ( 2)数组名遵循变量的命名规则。
– ( 3)数组下标下界可以省略,如果省略,则下标下界的默认值为 0。可以通过 Option Base语句来设定省略数组下标下界时下界的值,其格式为:
Option Base n
Option Base语句后 n的值只能为 0或 1,而且该语句只能放在模块的声明部分。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
说明:
– ( 4)如果下标下界不省略,则语句中就定义出了数组的下界和上界,下界的值不能超过上界的值。
– ( 5)数组中元素的个数可以通过如下公式来计算:
数组元素个数=上界 – 下界 + 1
– ( 6) As子句定义数组的数据类型,如果省略则定义为变体类型,数组可以存储任意类型的数据。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
说明:
– ( 7)和变量一样,数组在定义后,数组中的各元素都将被赋一个初值。
数值型数组中各元素的初值为 0;
字符串数组中各元素的初值为空串;
布尔型数组中各元素的初值为 False;
日期型数组中各元素的初值为 00:00:00;
变体型数组中各元素的初值为空值( Empty)。
– ( 8)一条语句可以定义多个数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
一维数组元素的引用
– 一维数组中元素可以用如下的格式引用:
数组名 (下标 )
– 下标的取值范围为下界~上界,如果超出了这个范围会出现错误。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
【 例 5-1】 输入 10个整数用数组保存起来,
并求其中大于 10的个数及平均值 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.1 一维数组
【 例 5-2】 按钮的 Click事件过程中代码如下:
Private Sub Command1_Click()
Static a(1 To 5) As Integer
Dim i As Integer
For i = 1 To 5
a(i) = a(i) + 1
Print a(i);
Next
Print
End Sub
– 第三次点击按钮的输出结果为,3 3 3 3 3”。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1 数组的概念
5.1.1 一维数组
5.1.2 二维数组和多维数组
5.1.3 UBound和 LBound函数
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.2 二维数组和多维数组
二维数组的定义
– 二维数组的定义和一维数组基本一样,只不过多了一个下标,其格式如下:
– 在过程中定义局部数组
Dim | Static 数组名( [下标下界 To ]下标上界,[下标下界 To ]下标上界) [As 数据类型 ]
– 在模块(窗体模块和标准模块)的声明部分定义模块级数组
Dim | Private 数组名( [下标下界 To ]下标上界,[下标下界 To ]
下标上界) [ As 数据类型 ]
– 在标准模块的声明部分定义全局数组
Public数组名( [下标下界 To ]下标上界,[下标下界 To ]下标上界) [As 数据类型 ]
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.2 二维数组和多维数组
二维数组定义语句的使用和一维数组基本一样,
其元素个数为:
第一维元素个数 × 第二维元素个数。
– 习惯上,经常把数组的第一维称为行,第二维称为列,
把一个二维数组和一个矩阵对应起来。
二维数组元素的引用
– 二维数组中的元素可以用以下格式引用:
数组名(下标,下标)
对于多维数组的定义和引用可以仿照二维数组,
只不过是多增加了下标
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.2 二维数组和多维数组
【 例 5-3】 假设已经定义了一个模块级的数组 a(1
To 5,1 To 5)用来存储整数,并且数组中的元素已经赋值 。 求与数组相对应的矩阵的主对角线元素值的和 。
【 例 5-4】 假设一个 4× 4的矩阵已经存储在模块级的数组 a(3,3)中,求矩阵的转置。
–矩阵的转置就是矩阵中各元素的行列值交换,也就是元素 a(i,j)的值转置后变为元素 a(j,i)的值。所以,我们在程序中只要使主对角线之下元素 a(i,j)的值和其对应元素
a(j,i)的值交换即可。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1 数组的概念
5.1.1 一维数组
5.1.2 二维数组和多维数组
5.1.3 UBound和 LBound函数
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.1.3 UBound和 LBound函数
UBound和 LBound函数可以求出数组下标的上界和下界。其语法格式为:
UBound(数组名 [,维数 ])
LBound(数组名 [,维数 ])
– UBound和 LBound函数可以求出数组下标某个维数的上界和下界。如果省略了维数,则默认为求第一维的上界和下界。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
5.1 数组的概念
5.2 静态数组与动态数组
5.3 数组的初始化与基本操作
5.4 控件数组
5.5 常用算法与数组应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2.1 动态数组及其声明
数组定义后,为了使用数组,必须为数组开辟所需要的存储区。根据内存区开辟的时机不同,可以把数组分为静态( Static)
数组和动态( Dynamic)数组。
– 通常把需要在编译时开辟内存区的数组称为静态数组,而把在程序运行时开辟内存区的数组称为动态数组。当程序没有运行时,动态数组不占内存。
静态( Static)数组和动态( Dynamic)数组由其定义的方式确定。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
5.2.1 动态数组及其声明
5.2.2 数组的清除和重定义
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
动态数组以变量为下标值,在程序运行过程中定义。
建立动态数组的方法是:
– 首先在窗体层、标准模块或在过程中使用 Dim、
Private或 Public语句声明一个没有下标的数组,即括号内为空的数组,
– 然后在过程中用 ReDim语句重新定义数组的大小。
ReDim语句的语法格式如下:
ReDim [Preserve] 变量(下标 1,下标 2,…… ) [ As 数据类型 ]
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
说明:
– ( 1) ReDim语句只能出现在过程中,否则会出现错误。
– ( 2) 静态数组中对应数组下标上界和下界的声明必须使用常量,而用 ReDim语句定义动态数组时可以使用变量定义下标上界和下界。
– ( 3)在过程中可以多次使用 ReDim语句改变数组的大小,也可以改变数组的维数,但不能改变数组的数据类型。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
说明:
– ( 4)使用 ReDim语句重新定义数组的大小时,数组中的数据都会丢失,新定义的数组中的各元素将被赋给一定的初值。如果要在使用 ReDim语句重新定义数组的大小时保留数组中的数据,则必须在 ReDim语句后加 Preserve关键字。使用了 Preserve关键字后将不能再改变数组的维数,同时也只能改变最后一维的大小,
对于其他的维数不能做任何修改。
– ( 5)使用了 Preserve关键字后,只能改变数组最后一维的上界。如果要改变下界,也将产生错误。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
【 例 5-5】 执行下列语句:
Private Sub Command1_Click()
Dim a() As Integer,b() As Integer
ReDim a(1 To 2)
a(1) = 1
a(2) = 2
ReDim b(1 To 2)
b(1) = 1
b(2) = 2
ReDim a(1 To 3)
Print a(1); a(2); a(3)
ReDim Preserve b(1 To 3)
Print b(1); b(2); b(3)
End Sub
程序的执行结果为:
0 0 0
1 2 0
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
【 例 5-6】 输入正整数 n,产生 n个 1~ 100
之间的随机数,并保存在数组中 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2 静态数组与动态数组
5.2.1 动态数组及其声明
5.2.2 数组的清除和重定义
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2.2 数组的清除和重定义
数组一经定义,便在内存中分配了相应的存储空间。如果要想清除静态数组中的内容或释放动态数组所占用的存储空间,可以使用 Erase语句。
Erase语句的语法格式为:
Erase 数组名,数组名,……
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2.2 数组的清除和重定义
说明:
– ( 1) Erase语句用于静态数组时,将清除数组中各元素的值,并根据数组变量类型的不同赋给相应的初值。初值的约定和变量相同
– ( 2) Erase语句用于动态数组时,将释放动态数组所使用的内存。在下次使用该动态数组前,
必须用 ReDim语句重新定义该动态数组的维数。
– ( 3) Erase语句可以清除多个数组的内容,数组之间用逗号隔开。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.2.2 数组的清除和重定义
【 例 5-7】 清除数组 a的内容。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
5.1 数组的概念
5.2 静态数组与动态数组
5.3 数组的初始化与基本操作
5.4 控件数组
5.5 常用算法与数组应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3 数组的初始化与基本操作
5.3.1 数组的初始化
5.3.2 数组元素的输入、输出和复制
5.3.3 集合
5.3.4 For Each-Next 语句
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.1 数组的初始化
所谓数组的初始化,就是给数组的各元素赋初值。在前面介绍过,数组定义以后将自动根据数组的数据类型,为数组中的每个元素赋初值(例如,整型数组中各元素初值为 0)。但这种赋值是由系统进行的,
用户不能决定初值的大小。在 Visual Basic
中,用户可以利用 Array函数来给数组元素赋初值。
Array函数的语法格式如下:
数组变量名 = Array(数组元素值)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.1 数组的初始化
说明:
– ( 1)使用 Array函数给数组赋初值时,数组变量必须是一个变体变量。
– ( 2)数组变量可以通过三种方式定义:显式定义为变体变量;在定义变量时不指定数据类型,则默认为变体变量;不定义变量而直接使用,则缺省定义为变体变量。
– ( 3)数组中每个元素的数据类型可以不同。
– ( 4) Array函数只适用于一维数组,不能对二维或多维数组初始化。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3 数组的初始化与基本操作
5.3.1 数组的初始化
5.3.2 数组元素的输入、输出和复制
5.3.3 集合
5.3.4 For Each-Next 语句5.3.3 集合
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.2 数组元素的输入、输出和复制
数组建立后,可以对数组或数组元素进行操作。数组的基本操作包括输入、输出和复制,这些操作都是对数组元素进行的。
– 数组元素的使用
数组的引用通常是指对数组元素的引用,方法是在数组后面的括号中指定下标。一般来说,在程序中,
凡是简单变量出现的地方,都可以用数组元素代替。
数组元素可以参加表达式的运算,也可以被赋值。
引用数组时,其下标值应在建立数组时所指定的范围内。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.2 数组元素的输入、输出和复制
– 数组元素的输入、输出和复制
数组元素一般通过 For循环语句等来处理。
当数组较小,或者只需要对数组中的指定元素赋值时,可以用赋值语句来实现数组元素的输入。
为了复制整个数组,仍要使用 For 循环语句。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3 数组的初始化与基本操作
5.3.1 数组的初始化
5.3.2 数组元素的输入、输出和复制
5.3.3 集合
5.3.4 For Each-Next 语句
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.3 集合
在 Visual Basic中,用数组可以表示多个元素。除此之外,还可以用集合( Collection)
来表示多个元素的集合。与数组不同的是,
集合中的元素是可以增减的。
用 New来创建一个集合:
Dim myCollection As Collection
Set myCollection = New Collection
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.3 集合
注意:
– 由于集合是对象,在给对象变量赋值时,都要使用 Set
这个关键字。
– 上面两条语句(定义变量及赋值)也可以用一条语句来实现:
Dim myCollection As New Collection
– 使用 Add方法,可以向集合中加入元素,要移去其中的元素,可以用 Remove方法,其中的参数是索引(索引从 1开始),要得到其中的元素,可以用 Item方法,其中的参数是索引或关键字另外,可以用 Count方法得到元素的个数。
– 对于集合也可以用 For Each 语句。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3 数组的初始化与基本操作
5.3.1 数组的初始化
5.3.2 数组元素的输入、输出和复制
5.3.3 集合
5.3.4 For Each-Next 语句
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.4 For Each-Next 语句
For Each … Next 语句是专门用于操作数组和集合的语句。
其语法格式为:
For Each 成员 In 数组名循环体
Next
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.4 For Each-Next 语句
说明:
– ( 1)成员必须是一个变体变量。
– ( 2)循环执行的次数取决于数组元素的个数,
数组元素的个数就是循环执行的次数。
– ( 3)每次执行循环之前,都把数组中的一个元素赋给成员,第一次是数组中的第一个元素,
第二次是第二个,依此类推。
– ( 4)可以使用 Exit For语句退出循环。
– ( 5) For Each … Next语句不能用于用户定义数据类型的数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.3.4 For Each-Next 语句
可以看出,在数组操作中有时使用 For
Each … Next语句比用 For循环遍历数组元素更加方便,因为它不需要指定循环条件。
【 例 5-8】 假设已经给出了一个一维数组 a,
里面存放的都是整数。求数组 a里所有奇数的和。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
5.1 数组的概念
5.2 静态数组与动态数组
5.3 数组的初始化与基本操作
5.4 控件数组
5.5 常用算法与数组应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4 控件数组
5.4.1 基本概念
5.4.2 控件数组的建立
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.1 基本概念
Visual Basic提供了一种简单的方法来处理成组的类似控件,即控件数组。
控件数组由一组相同类型的控件组成,这些控件共用一个相同的控件名(即控件数组中所有控件的 Name属性相同)
控件数组中的每个控件元素都有一个唯一的索引号( Index属性)加以区分。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.1 基本概念
控件数组中任意一个控件的事件都将触发整个控件数组的事件,不再作为单独控件的事件处理。即,如果建立了一组单选按钮的控件数组,那么无论单击哪个单选按钮,都将触发整个控件数组的 Click事件。
为了区分是控件数组中哪个控件产生的事件,Visual Basic将产生事件控件的索引号传递给控件数组的事件过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4 控件数组
5.4.1 基本概念
5.4.2 控件数组的建立
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.2 控件数组的建立
建立一个控件数组有两种方法。
– 第一种方法步骤如下:
( 1)在窗体上画出作为数组元素的各个控件。
( 2)把每一个数组元素的 Name属性设为同一个名称。当对第二个控件输入名称后,将弹出如图的对话框,询问是否建立控件数组。单击“是”建立控件数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.2 控件数组的建立
建立一个控件数组有两种方法。
– 第二种方法步骤如下:
( 1)在窗体上画出控件数组中第一个控件。
( 2)选中该控件,单击“编辑”菜单下的“复制”菜单项
(或使用热键 Ctrl+C)。
( 3)单击“编辑”菜单下的“粘贴”菜单项(或使用热键
Ctrl+V),将显示如图 5.3所示的对话框,询问是否建立控件数组。单击“是”建立控件数组,在窗体的左上角将出现一个控件,这就是控件数组的第二个元素。
( 4)重复执行“粘贴”动作,建立控件数组中的所有元素并放置到适当位置。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.2 控件数组的建立
控件数组建立后,只要改变某个控件的
,Name”属性值,并把,Index”属性设为空,
就可以把该控件从控件数组中删除
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.2 控件数组的建立
【 例 5-9】 建立含有 4个单选按钮的控件数组,当单击某个单选按钮时,改变文本框中字体的大小。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.4.2 控件数组的建立
【 例 5-10】 建立含有 4个单选按钮的控件数组,当单击某个单选按钮时,改变文本框的文本为单选按钮的标题。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 5章 数组和算法
5.1 数组的概念
5.2 静态数组与动态数组
5.3 数组的初始化与基本操作
5.4 控件数组
5.5 常用算法与数组应用
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5 常用算法与数组应用
5.5.1 算法的概念
5.5.2 常用简单算法
5.5.3 排序算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.1 算法的概念
算法的概念和特性
– 所谓算法,是对特定问题求解步骤的一种描述,
它是指令的有限序列,其中每个指令表示一个或多个操作。数据结构和算法构成计算机程序。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.1 算法的概念
算法有以下特性:
( 1)有穷性。算法必须在执行有穷步骤后结束,而且每一步都可以在有穷时间内完成。
( 2)确定性。算法中的每一步都必须有明确的含义,
不会引起二义性;并且算法只有唯一的执行路径,
即相同的输入只会得到相同的输出。
( 3)可行性。算法必须是可行的,即算法中的操作都可以通过已有的基本运算完成。
( 4)输入。算法可以有零个或多个输入。
( 5)输出。算法有一个或多个输出,这些输出同输入有特定的关系。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.1 算法的概念
算法设计的要求
– 要设计一个“好”的算法,应该考虑达到以下目标:
– ( 1)正确性。算法应该满足具体问题的要求,对于输入数据能够得到符合要求的结果。
– ( 2)可读性。算法的可读性,即有助于人的理解,便于修改和调试。
– ( 3)健壮性。当输入数据非法时,算法能够正确处理,
而不会出错。
– ( 4)效率与存储量要求。效率指的是算法执行的时间。
一个算法执行的时间越少,算法的效率越高。存储量要求指的是算法执行过程中所需要的最大存储空间。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.1 算法的概念
一个好的算法要有高的执行效率和低的存储量需求,但是在实际实现中,二者往往不可兼得。
– 通常用大的空间开销来提高算法执行效率,或者以降低执行速度作为减少空间开销的代价。
– 决定一个算法的效率和存储量需求的因素包括书写程序的语言、生成的机器语言的质量、机器执行指令的速度等,但最重要的是算法要解决的问题的规模。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5 常用算法与数组应用
5.5.1 算法的概念
5.5.2 常用简单算法
5.5.3 排序算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
累加、连乘
– 在循环结构中,最常用的算法是累加和连乘。累加是在原有和的基础上一次一次地每次加 1个数;连乘则是在原有积的基础上一次一次地每次乘以一个数。通常用循环结构可以完成。
【 例 5-11】 下面程序段求 1~ 100的 5的倍数或 7的倍数的和。其中 Sum为累加和变量,i为控制变量。
【 例 5-12】 求前 N个自然数的每个数阶乘之和。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
求素数
– 素数或称质数,就是一个大于 2的整数,并且只能被 1
和本身整除,而不能被其他整数整除的数。判别某数 m
是否为素数的方法很多,最简单的是从素数的定义来求解,其算法思想是:对于 m从 i=2,3,…,m-1判别
m能否被 i整除,只要有一个能整除,m不是素数;否则
m是素数。
【 例 5-13】 输入一个正整数,判断其是否为素数。
【 例 5-14】 打印出 100到 200之间所有的素数。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
求最大值和最小值
– 在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,
则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。
– 求最小值,算法与求最大值类似,一般先假设第一个数为最小值的初值;然后将每一个数与最小值比较,若该数小于最小值,将该数替换为最小值;依次逐一比较,即得。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
【 例 5-15】 随机产生一组数,求其平均值及最大值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
分类统计
– 分类统计是经常遇到的运算,是将一批数据中按分类的条件统计每一类中包含的个数。例如,将学生成绩按优、良、中、及格、不及格五类,统计各类的人数;
职工按各职称分类统计等。这类问题一般要掌握分类的条件表达式的书写和各类中有计数器变量,进行相应的计数。
【 例 5-16】 输入一串字符,统计各字母出现的次数 (大小写字母不区分 ),并对出现的字母显示其出现的个数,效果见图
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
【 例 5-16】 输入一串字符,统计各字母出现的次数 (大小写字母不区分 ),并对出现的字母显示其出现的个数,效果见图
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
遍试算法
–,遍试算法”也称为“枚举法”或“穷举法”,
即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
【 例 5-17】 求解我国古代数学中的“韩信点兵”问题。原问题是,三三数之,余二;
五五数之,余三;七七数之,余五。问有兵多少?
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.2 常用简单算法
迭代算法
–,迭代算法”又称为“递推法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。
【 例 5-18】 猴子吃桃子。小猴在一天摘了若干个桃子,当天吃掉一半多一个;第二天接着吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半零一个,到第 7天早上要吃时只剩下一个了,
问小猴那天共摘下了多少个桃子?
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5 常用算法与数组应用
5.5.1 算法的概念
5.5.2 常用简单算法
5.5.3 排序算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.3 排序算法
排序是将一组数按递增或递减的次序排列。
常用的排序算法有选择法、冒泡法、插入法和合并法等。
– 选择法
选择法排序是最为简单且易于理解的算法。假定有 n
个数的序列,要求按递增的次序排序,算法步骤是:
( 1)从 n数中选出最小数的下标,出了循环最小数与第 1个数交换位置。
( 2)除第 1个数外,其余 n-1个数再按步骤 (1)的方法选出次小的数,与第 2个数交换位置。
( 3)重复步骤( 1) n-1遍,最后构成递增序列。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.3 排序算法
排序是将一组数按递增或递减的次序排列。
常用的排序算法有选择法、冒泡法、插入法和合并法等。
– 选择法
选择法排序是最为简单且易于理解的算法。假定有 n
个数的序列,要求按递增的次序排序,算法步骤是:
( 1)从 n数中选出最小数的下标,出了循环最小数与第 1个数交换位置。
( 2)除第 1个数外,其余 n-1个数再按步骤 (1)的方法选出次小的数,与第 2个数交换位置。
( 3)重复步骤( 1) n-1遍,最后构成递增序列。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.3 排序算法
【 例 5-19】 对已知存放在数组中的 6个数 8、
6,9,3,2,7,用选择法按递增顺序排序。排序进行的过程如下:
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.3 排序算法
冒泡法
– 冒泡法排序的思想是:
首先进行第一趟冒泡,从数组的第一个元素开始,每一个元素都和它的下一个元素进行比较,如果小于等于下一个元素则元素位置不动,如果大于下一个元素则交换两个元素的位置。一直比较到数组的结束,这样最大的元素肯定位于数组的最后一个元素中。
然后进行第二趟冒泡,从数组的第一个元素开始,到倒数第二个元素结束,继续上述的过程,使数组中次大的数位于数组的倒数第二个元素中。
依此类推,当执行到第 n趟冒泡时,如果数组的结束位置是第二个元素,则该趟冒泡之后数据就成为一个有序数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
5.5.3 排序算法
【 例 5-20】 输入 10个整数,并用冒泡法从小到大排序 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社学完本章你应能够:
掌握数组的定义及使用;
了解数组的应用;
理解算法的概念及几种常用算法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社思 考 题
1,数组有什么特点?什么是数组的上、下界?什么是数组的维数?
2,静态数组和动态数组有什么区别?
3,如何使用控件数组?使用控件数组有什么优点?
4,用关键字 Dim,ReDim,Static定义的数组分别是什么数组?
5,什么是算法?有哪些特性?
6,常用的排序算法都有哪些?选择法和冒泡法排序的算法是如何实现的?