Download presentation
Presentation is loading. Please wait.
1
Visual Basic 程 序 设 计 山东外贸职业学院 信息管理系 柳淑花
2
第7章 数组 本章主要内容 1、数组的概念 2、一维数组 3、二维数组 4、动态数组 5、控件数组 作业 本章小结 退出
第7章 数组 本章主要内容 1、数组的概念 2、一维数组 3、二维数组 4、动态数组 5、控件数组 作业 本章小结 退出 2017年3月12日
3
7.1 数组的概念 数组:数组是有序数据的集合。一般数组中的所有元素具有相同的数据类型(在VB 中,一个数组的元素类型可以不同)。
7.1 数组的概念 数组:数组是有序数据的集合。一般数组中的所有元素具有相同的数据类型(在VB 中,一个数组的元素类型可以不同)。 数组中的每一元素具有唯一索引号(即下标),可以用数组名及下标唯一地识别一个数组的元素,如:A(2)。 说明:数组必须先声明后使用;声明一个数组就是声明 其数组名、类型、维数和数组的大小。 数组的维数(下标的个数)各维下标之间用逗号分开。 在VB中有一维数组、二维数组…最多可以达到60维 数组的声明语法是: [Dim/Private/Public] 数组名([下界To]上界,…) [As 数据类型] 上一页 下一页 返回本章首页 2017年3月12日
4
其中:s1,s2表示该元素在数组中的排列位置,称为“下标”。 数组的分类: 全局的(应用程序级)
数组元素的表示方法如下: 数组名( s1 , s2··· ) 其中:s1,s2表示该元素在数组中的排列位置,称为“下标”。 数组的分类: 全局的(应用程序级) 模块级的--- Private | Dim 数组名(n) [As 类型名] 局部的(过程级)--Static | Dim 数组名(n) [As 类型名] 注意:全局数组必须在标准模块的声明段中,用 Public声 明,即:Public 数组名(n) [As 类型名] 不能在窗体模块和类模块中声明全局数组 例如:Dim Counter(1TO 14) As Integer ‘14个元素的局部数组 Private Sume (1 TO 20) As Double ‘20个元素的模块级数组 上一页 下一页 返回本章首页 2017年3月12日
5
注意:数组的上界必须大于等于下界而且不得 超过Long数据的范围。 option base 语句的格式、功能:
如果用户不显式地使用To关键字声明下界,则VB 默认下界为0。 注意:数组的上界必须大于等于下界而且不得 超过Long数据的范围。 option base 语句的格式、功能: 格式:option base [0 | 1] 功能:用来声明数组下标的缺省下界 (在模块的声明段中使用) 如:在窗体或标准模块中将数组下标的 缺省下界设置为1。 option base 1 上一页 下一页 返回本章首页 2017年3月12日
6
关于数组声明的几点说明: 例题7.1:变体数组举例 li7_1.vbp ① 数组名的命名规则和变量名的相同,其下标一
定要用()括起来,且下界必须小于其上界。 ② 在同一个过程中,数组名不能与变量名重名, 否则会出错。 ③ 在定义数组时,每一维的元素个数必须是常数, 不能是变量或表达式。 (已赋值的变量,也是错误的)。 ④ 若声明数组时未指明其类型,则该数组为变体 数组,变体数组的元素类型可以不同。 例题7.1:变体数组举例 li7_1.vbp 上一页 下一页 返回本章首页 2017年3月12日
7
数组声明时,数组的大小固定的数组称为静态数组。 它指明了数组的维数和每一维的下标范围,在使用过程中,它的维数和下标范围将不得改变。
7.2 一维数组的声明与应用 数组声明时,数组的大小固定的数组称为静态数组。 它指明了数组的维数和每一维的下标范围,在使用过程中,它的维数和下标范围将不得改变。 数组声明的形式为: [Public| Static| Dim] 数组名(维数定义) [As 数据类型] 如:Static A(10) AS Integer ‘一维整形数组 Dim stu(50,4) As String ‘二维字符串数组 Dim defarra(1 to 5) ‘一维变体数组 例题7.2 :变体数组举例 li7_2.vbp 上一页 下一页 返回本章首页 2017年3月12日
8
给数组元素赋初值 (1)使用循环结构 如给数组strMark(100)的元素赋初值: For i = 1 To 100
可以使用循环结构和Array函数给数组赋初值。 (1)使用循环结构 如给数组strMark(100)的元素赋初值: For i = 1 To 100 strMark(i) = 0 Next (2)使用Array 函数 Array 函数用来为数组元素赋值,即把一个数据集读入某个数组,其语法格式为: <变量名> = Array(<数据列表>) 上一页 下一页 返回本章首页 2017年3月12日
9
如: 注意:变量不能是具体的数据类型,只能是变体 类型。 Option Base 1
Private Sub Command1_Click() Static Test_str ‘ 声明一个静态的变体变量 Test_str=Array(“One”,”Two”,”Three”,”Four”,5,6,7,8) ‘ 输出数组的第4个元素,以及数组的下界和上界 Print Test_str(4),Lbound(Test_str), Ubound(Test_str) End Sub 注意:变量不能是具体的数据类型,只能是变体 类型。 上一页 下一页 返回本章首页 2017年3月12日
10
如:Dim A(4) As String , B() As string
数组元素的输入 数组元素一般可以通过文本框输入和InputBox函数输入。数组元素的输入见例7.3: li7_3.vbp 数组赋值 如:Dim A(4) As String , B() As string A(0)=“王华” : A(1)=“黎明” : A(2)=“万雪” A(3)=“刘芳” : A(4)=“夏天" B =A ‘ 将A数组整体赋值给B数组且大小确定为5 注意:两数组的类型必须相同 数组的输出 输出数组中的全部或部分元素,一般 使用循环结构 上一页 下一页 返回本章首页 2017年3月12日
11
数组应用举例 例7.4:求35名学生的平均成绩以及最高成绩。 方法1:
Dim aver As Integer, mark As Integer Dim maxmark As Integer For i = 1 To 35 mark = InputBox(“输入第” & i & “位学生的成绩”, “数据输入”,0) If mark > maxmark Then maxmark = mark aver = aver+mark Next Print “aver =“; aver/35; “max=“;maxmark 上一页 下一页 返回本章首页 2017年3月12日
12
方法2(用数组): li7_4.vbp Dim aver As Integer, mark(1 To 35) As Integer
Dim maxmark As Integer For i = 1 To 35 mark(i) = InputBox(“输入第” & i & “位学生的成绩”, “数据输入”,0) If mark(i) > maxmark Then maxmark = mark(i) aver = aver+mark(i) Next Print “aver =“; aver/35; “max=“;maxmark 从表面上看,两段程序差别不大,但是后者引入了数组mark(1 to 35),这样,每一个学生的成绩都保留在数组中,可以随时加以调用。若要求输出高于平均分的学生成绩,则只能用方法2。 返回本章首页 上一页 下一页 2017年3月12日
13
例7.5:键盘任输10个数,按由小到大的顺序输出。
(1)冒泡法排序: li7_5.vbp 冒泡排序是常用的一种排序方法。假设n个元素按递增的顺序排序 第一轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较。如果下一项的值较小,就将这两项的位置交换,直到最后第n-1与第n项进行比较,将最大的数排列在最后。 第二轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较。如果下一项的值较小,就将这两项的位置交换,直到最后第n-2与第n-1项进行比较,将第二大的数排列在倒数第二位。 依此类推,直到只有第一项与第二项进行比较交换,完成递增法排序。(第n-1轮) For I=1 To N-1 For J=1 To N-I True A(J)>A(J+1) False A(J)与A(J+1)交换 冒泡排序的流程图 2017年3月12日
14
选择法排序的基本思想是:每次将最小(或最大)的数找出来放在序列的最前面。假设按递增法将有n个数的数组A(1To n)进行排列,步骤为:
(2)选择法排序 选择法排序的基本思想是:每次将最小(或最大)的数找出来放在序列的最前面。假设按递增法将有n个数的数组A(1To n)进行排列,步骤为: 第一轮:假定最小值Temp(初值为A(1)),将Temp与A(2)进行比较,若A(2)<A(1),则令Temp= A(2),直到比较到A(n),这样Temp中就存放了A(1)~A(n)中的最小数,将Temp所指向的元素与A(1)进行交换,从而将A(1) ~A(n)中的最小数存放在数组的第1个位置。 第二轮:对除第1个数外的其余n-1个数再按上述方法选出次小的数 ,与第2个数交换位置。 依次类推,经过n-1遍后构成递增序列。 For I=1 To N-1 For J=I+1 To N True A(I)>A(J) False A(I)与A(J)交换 选择法流程图 2017年3月12日
15
例7.6:输出Fibonacci数列的前n项 1,1,2,3,5,8,…… 界面如图: li7_6.vbp 上一页 下一页 返回本章首页
2017年3月12日
16
7.3 二维数组的声明与应用 二维数组声明的形式为: 如:Static A(4,3) AS Integer ‘二维整形数组
7.3 二维数组的声明与应用 二维数组声明的形式为: [Public| Static| Dim] 数组名(维数1,维数2 ) [As 数据类型] 如:Static A(4,3) AS Integer ‘二维整形数组 数组在内存中存放时,首先变化的是最后一维的下标,然后变化倒数第二维的下标…(按行存放)。 例如,数组A(4,3)在内存中的分配如下: A(0,0) A(0,1) A(0,2) A(0,3) A(1,0) A(1,1) A(1,2) A(1,3) A(2,0) A(2,1) A(2,2) A(2,3) A(3,0) A(3,1) A(3,2) A(3,3) A(4,0) A(4,1) A(4,2) A(4,3) 返回本章首页 上一页 下一页 2017年3月12日
17
利用随机函数生成两位正整数的 5 阶方阵,然后,将所有元素以行的顺序按递增顺序排列。结果如图:
例7.7:二维数组举例,要求如下: 利用随机函数生成两位正整数的 5 阶方阵,然后,将所有元素以行的顺序按递增顺序排列。结果如图: li7_7.vbp 上一页 下一页 返回本章首页 2017年3月12日
18
例7.8:自动生成并显示如图所时的方阵。 li7_8.vbp 上一页 下一页 返回本章首页 2017年3月12日
19
作 业 1 1、任意输入10个整数存放在一维数组中,编程更求出最大数及其位置。 2、编写程序,实现两个矩阵相加。
3、编写程序,建立并输出一个10×10的矩阵,使得该矩阵两条对角线元素都为1,其余元素均为0。 上一页 下一页 返回本章首页 2017年3月12日
20
(1)用Public(公用数组)、Private (模块级数组)
7.4 动态数组(可调数组) 数组声明时,不指明数组的维数和每一维的下标范围,仅用一对圆括号表示, 这样的数组称为动态数组。 如:Dim IntMark( ) 以后在使用数组前,需要利用ReDim语句对数组的维数和下标范围重新定义。 如: ReDim IntMark(50,4) 创建动态数组的步骤: (1)用Public(公用数组)、Private (模块级数组) 或Dim(局部数组)在过程中声明数组。给数组 赋以一个空维数表,这样就将数组声明为动态 数组。 上一页 下一页 返回本章首页 2017年3月12日
21
(2)在过程中用ReDim语句为声明的动态数组分配
实际的元素个数。 ReDim 语句的格式如下: ReDim [Preserve] 动态数组名(n1,n2…) 说明:若选择Preserve,则在对数组重新说明时,将会保留原数组中的元素的内容,并且只允许ReDim 语句改变动态数组的最后一维的上限。 如:Option Base 1 Dim Namearray() AS string Redim Namearray(40,2) Redim Preserve Namearray(40,UBound(Stuarray,2)+4) 上一页 下一页 返回本章首页 2017年3月12日
22
动态数组应用举例 例7.9:统计学生成绩 li7_9.vbp
设计如图所示应用程序,当单击“输入成绩”按钮时,在InputBox对话框中输入学生人数,然后在对话框中依次输入不多于人数的数个成绩。再次单击“输入成绩”按钮将追加学生人数和成绩。单击“显示成绩”按钮显示成绩、平均分和未输入成绩的人数。 学生成绩统计程序运行实例 上一页 下一页 返回本章首页 2017年3月12日
23
Do While k < n 程序代码如下: Dim mark%(), aver%, k%, n%
Private Sub inputmark(k, n, aver) ‘ 输入成绩的子过程 Do While k < n markx = InputBox(“输入第” & k + 1 & “位学生 的成绩”, “数据输入”) If markx = "" Then Exit Do k = k + 1: mark(k) = markx aver = aver + markx Loop End Sub 上一页 下一页 返回本章首页 2017年3月12日
24
Private Sub 显示成绩_Click() Print “已经输入的学生成绩为:” For i = 1 To n
Print mark(i); If i Mod 10 = 0 Then Print Next Print Print “有” ; n - k; _ “个学生的成绩没有输入” Print "平均成绩为"; aver / n End Sub Private Sub 输入成绩_Click() Dim m$ m = InputBox(“请输入学生人数”) If m <> “” Then ‘ 学生人数不为 0 时执行 n = k + CInt(m) ‘ 在使用动态数组前先确定大小 ReDim Preserve - mark(1 To n) Call inputmark(k, n, aver) End If End Sub 上一页 下一页 返回本章首页 2017年3月12日
25
7.5 控件数组 1、控件数组的概念 一个窗体上可以包含多个同种类型的控件,可以通过创建控件数组的方法使同一类型的控件共享同一个事件过程。使用控件数组的最大好处是编写的代码比较简单且易于维护。 控件数组: 是具有相同名称、类型以及事件过程的一组控件。 每一个控件具有一个唯一的索引(index)。当数组中的一个控件识别某一事件时,它将调用此控件数组的相应事件过程,并把相应索引作为参数传递给事件过程。一个控件数组至少应有一个元素,在控件数组中可用到的最大索引值为 32767。同一控件数组中的元素有自己的属性设置值。 上一页 下一页 返回本章首页 2017年3月12日
26
2、控件数组的建立 设计时创建控件数组 步骤为: ① 在窗体上添加一个新的控件,以决定控件的类 型和控件数组中的第1个控件。 ② 设置控件的Name属性值,为控件命名。 ③ 选择以下方法之一创建控件数组: 方法1:选定控件,单击“复制”按钮,再单击“粘贴”按钮,则显示如图所示对话框,单击“是”,则创建一个控件数组。以后可以根据需要向控件数组中添加新的控件元素。 创建控件数组对话框 2017年3月12日
27
方法2: 同步骤①再创建一个同类型的新控件,在设置新控件的Name属性值(注意,不是Caption属性值)时,键入与上面创建的控件相同的名字,则同样会显示上图所示的对话框,单击“是”创建控件数组。 例7.10:一个简易计算器, 界面如图: li7_10.vbp 上一页 下一页 返回本章首页 2017年3月12日
28
运行时添加控件数组 控件数组必须是设计时创建的,在程序运行时,可以通过Load方法向控件数组中添加新的控件成员,并给其属性赋值。 例7.11:建立有1个成员的命令按钮数组Command1。程序运行时,如果单击设计时绘制的命令按钮,将动态地为Command1数组添加一个元素,并设置新元素的Caption值为“我是克隆品”,如果单击动态产生的命令按钮,则不会创建新的命令按钮,并在对话框中显示“请不要用克隆品克隆”。 界面如图所示:在属性窗口将Command1命令按钮的 index值设置为0, Caption属性值设置为“正品控件”。 li7_11.vbp 2017年3月12日
29
程序代码为: Private Sub Command1_Click(Index As Integer)
Static k As Integer If Index < 1 Then k = k + 1: Load Command1(k) Command1(k).Visible = True Command1(k).Left = Command1(k - 1).Left _ + Command1(k - 1).Width Command1(k) .Top = Command1(k - 1).Top Command1(k) .Caption = "我是克隆品" Else MsgBox ("请不要用克隆品克隆") End If End Sub 上一页 下一页 返回本章首页 2017年3月12日
30
例7.12:自动产生国际象棋棋盘 li7_12.vbp 在窗体上创建一个Picture1控件,然后在Picture1控件中建立一个标签控件数组的第1个控件Label1(0)。在运行时采用给标签控件数组添加数组成员的方法,在Picture1控件中形成国际象棋的棋盘。要求:Picture1控件的高度略小于窗体的高度,棋盘由红黄相间,在调整窗体的大小时,棋盘的大小相应按比例调整。 程序运行界面如图: 上一页 下一页 返回本章首页 2017年3月12日
31
Private Sub Form_Load()
(1)界面设计 创建一个Picture1控件 在Picture1控件内创建一个Label1控件,将Index属性值设置为0,建立Label1控件数组。国际象棋共有64格,一个Label1控件数组的成员相当于一格。其他Label1控件数组的成员在程序运行时由Load事件产生。设计时控件的位置任意,运行时再由程序调整。 (2)编写事件代码产生Label1控件数组的其他63个成员的代码放在Form_Load()事件中: Private Sub Form_Load() For m = 1 To 63 Load Label1(m) ‘ 产生Label1控件数组的其他63个成员 Label1(m).Visible = True Next End Sub 上一页 下一页 返回本章首页 2017年3月12日
32
设置各控件属性值的代码放在Form_Resize()事件中:
Private Sub Form_Resize() If Form1.ScaleHeight > Form1.ScaleWidth Then Picture1.Height = Form1.ScaleWidth - 200 ' Picture1的高度略小于窗体宽度 Picture1.Width = Picture1.Height ' 产生方形棋盘 Else Picture1.Height = Form1.ScaleHeight - 200 ' Picture1的高度略小于窗体高度 End If Picture1.Left = (ScaleWidth - Picture1.ScaleWidth) / 2 ' 棋盘水平居中 Picture1.Top = (ScaleHeight - Picture1.ScaleHeight) / 2 ' 棋盘垂直居中 上一页 下一页 返回本章首页 2017年3月12日
33
Label1(8 * m + n).BackColor = vbyellow ' 黄色 Else
‘设置各标签的颜色 For m = 0 To 7 For n = 0 To 7 If m Mod 2 = 0 Then ' 为方格设置不同的颜色 If n Mod 2 = 0 Then Label1(8 * m + n).BackColor = vbyellow ' 黄色 Else Label1(8 * m + n).BackColor = vbred ' 红色 End If Label1(8 * m + n).BackColor = vbred Label1(8 * m + n).BackColor = vbyellow 上一页 下一页 返回本章首页 2017年3月12日
34
Label1(8 * m + n).Width = Picture1.ScaleWidth / 8 ‘ 设置方格的高度
' 设置方格的宽度 Label1(8 * m + n).Width = Picture1.ScaleWidth / 8 ‘ 设置方格的高度 Label1(8 * m + n).Height = Picture1.ScaleHeight / 8 ‘ 设置方格的左边位置 Label1(8 * m + n).Left = Picture1.ScaleWidth / 8 * n ' 设置方格的顶端位置 Label1(8 * m + n).Top = Picture1.ScaleHeight / 8 * m Next End Sub 上一页 下一页 返回本章首页 2017年3月12日
35
作 业 2 17人围成一圈,编号为1,2,3,…17,从第1号开始报数,报到3的倍数的人离开,一直数下去,直到最后剩下一人,求此人的编号。 上机作业: 实训九 数组的应用 上一页 下一页 返回本章首页 2017年3月12日
36
第7章 小 结 1、数组的概念 数组的维数、数组的声明、数组的分类 Option Base 语句的应用 2、数组的基本操作
第7章 小 结 1、数组的概念 数组的维数、数组的声明、数组的分类 Option Base 语句的应用 2、数组的基本操作 数组赋初值的方法、数组的输出 3、动态数组的声明及应用 4、控件数组 控件数组的概念、控件数组的建立及应用 上一页 退出 返回本章首页 2017年3月12日
Similar presentations