Visual Basic 程序设计 第四章 数组
第三章控制结构 学习目标 了解数组的基本概念,理解静态数组和动态数组的概念,掌握静态、动态数组的定义及使用方法,掌握控件数组的建立及使用方法,掌握数组的基本算法。 计算机公共基础课程作为大学通识课程的一个重要环节
第四章 数组 学习要点 计算机公共基础课程作为大学通识课程的一个重要环节 数组基本概念 静态数组的定义及使用 动态数组的定义及使用 控件数组的建立和使用 数组算法 计算机公共基础课程作为大学通识课程的一个重要环节
第四章 数组 知识重点 静态数组的定义及使用 动态数组的定义及使用 控件数组的建立及使用 数组算法(求最值、排序、查找) 计算机公共基础课程作为大学通识课程的一个重要环节
第四章 数组 知识难点 动态数组的使用 数组算法 计算机公共基础课程作为大学通识课程的一个重要环节
第四章 数组 学习提示 在程序中,当处理单个或多个数据时,通常使用一般变量即可,但当需要处理的数据量较大,且数据间存在关联时,再用普通变量进行数据存储和处理不仅繁琐,而且容易出错,此时采用数组进行数据存储和处理会给程序实现带来极大的便利。 计算机公共基础课程作为大学通识课程的一个重要环节
第四章 数组 数组的概念 数组的分类和操作 数组算法 控件数组 综合案例 本章控件
引例:求某班100名同学VB期末成绩平均分,并统计高于平均分的人数。 引例1 引例:求某班100名同学VB期末成绩平均分,并统计高于平均分的人数。 方法一:使用一个简单变量依次存储每位同学成绩。 问题: 1. 100名学生成绩需要重复输入; 2. 数据在重复输入过程中容易出错。
引例:求某班100名同学VB期末成绩平均分,并统计高于平均分的人数。 引例1 引例:求某班100名同学VB期末成绩平均分,并统计高于平均分的人数。 方法一:定义100个变量,存储所有同学成绩。 问题: 1. 程序代码书写繁琐; 2. 容易出错。
Dim score(1 To 100) As Integer 4.1 数组概念 定义100个变量 Dim score(1 To 100) As Integer 数组名 下标的范围 数据类型 数组是一组相同类型的变量的集合 数组名代表一批数据,用下标表示该数组中的各个元素 1、解释数组的含义 score(100) …… score(i) score(2) score(1) 数组元素
4.2 数组的分类和操作 静态数组 动态数组
4.2.1 静态数组 1、数组定义 格式:Dim 数组名(下标1[,下标2,……])[As类型] Dim a(10) As Integer, b(3, 2 To 6) As Single a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9) a(10) b(0,2) b(0,3) b(0,4) b(0,5) b(0,6) b(1,2) b(1,3) b(1,4) b(1,5) b(1,6) b(2,2) b(2,3) b(2,4) b(2,5) b(2,6) b(3,2) b(3,4) b(3,5) b(3,6)
4.2.1 静态数组 2、数组元素的引用 格式:数组名(下标) 例如:Dim a(10) As Integer, b(3, 2 To 6) As Single a(1) = 100 b(2, 5) = 200
静态数组举例 例4.1 用静态数组解决引例1(班级人数100) Private Sub Command1_Click() Dim score%(1 To 100), total%, aver!, i%, n% aver = 0: n = 0 For i = 1 To 100 ' 输入并累加100名同学成绩 score(i) = Val(InputBox("请输入第" & i & "个同学成绩")) total = total + score(i) Next i aver = total / 100 ' 计算成绩平均分 For i = 1 To 100 ' 统计高于平均分人数 If score(i) > aver Then n = n + 1 Print "班级平均分:"; aver, "高于平均分人数:"; n End Sub 数组定义 数组赋值 数组输出
可以省略类型,如果给定类型,必须与前面类型保存一致 4.2.2 动态数组 1. 动态数组的定义 2. ReDim语句的格式 Step1: Step2: 定义一个空的数组 在过程中用ReDim语句定义带下标的数组 例如: Dim a() As Integer …… ReDim a(10) As Integer ReDim [Preserve] 数组名 (下标) [As 数据类型] 可以省略类型,如果给定类型,必须与前面类型保存一致
动态数组举例 例4.2 用动态数组解决引例1(班级人数可变) Private Sub Command1_Click() Dim score%(), total%, aver!, i%, n%, number% number = Val(InputBox("请输入班级人数")) ReDim score%(1 To number) aver = 0: n = 0 ' 输入并累加number名同学成绩 For i = 1 To number score(i) = Val(InputBox("请输入第" & i & "个同学成绩")) total = total + score(i) Next i aver = total / number ' 统计高于平均分人数 If score(i) > aver Then n = n + 1 Print "总人数:"; number; "平均分:"; aver; "高于平均分人数:"; n End Sub
思考 判断下列数组声明是否合法? 1. n=12 Dim a(1 To n) As Integer 2. Dim a%[3,3] 合法的数组声明可以存放多少个数组元素? 1. n=12 Dim a(1 To n) As Integer 2. Dim a%[3,3] 3. Dim a(1,1,2) As Integer 4. Dim a%(10) ReDim a(1 To 12) 5. Dim a!() ReDim a(3,2) As Integer
4.2.3二维数组的操作 二维数组一般用于解决多行多列数据处理的问题,如矩阵或行列式等 【例4.3】在窗体上输出如下所示3*4矩阵。 1 2 3 4 5 6 7 8 9 10 11 12
4.2.4 数组其它相关操作 数组的初始化(Array函数) For Each...Next语句 Lbound/Ubound函数 Option Base语句 Lbound/Ubound函数 数组的初始化(Array函数) For Each...Next语句
Option Base语句 Option Base n 功能: 指定数组下标下界的缺省值 说明: n为数组下标指定的下界,取值为0或1。
Lbound,Ubound Lbound,Ubound Lbound(数组名[, 维]): 返回数组中指定维的下界 Dim y(1 To 12, 5 To 20, -3 To 6) Print Lbound(y, 1), Ubound(y, 1) 1 12 Print Lbound(y, 2), Ubound(y, 2) 5 20 Print Lbound(y, 3), Ubound(y, 3) -3 6
Array函数 Array函数初始化数组条件: 一维数组 Variant(变体类型) 例如: 非静态数组(动态数组或数组变量) Dim a As Variant a = Array(1, 2, 3, 4, 5)
Array函数 格式 For Each 成员 In 数组 循环体 [Exit For] …… Next [成员] 变体变量,代表了数组中的每个元素 For Each 成员 In 数组 循环体 [Exit For] …… Next [成员] 没有括号和上下界的数组名
4.3 数组算法 求最值 排序 查找
求最值--最大 方法 假定数组第一个元素为最大,然后依次访问数组 中每个元素,若找到新的最大的元素,即修改最 0.5 3.6 1.3 0.7 -1.5 2.0 方法 假定数组第一个元素为最大,然后依次访问数组 中每个元素,若找到新的最大的元素,即修改最 大值变量,直到数组元素访问结束。
求数组中的最小值和最大值 Dim a As Variant a = Array(2.0, -1.5, 0.7, 1.3,3.6,0.5) max=a(0) : min = a(0) For i = 0 To 5 If a(i) > max Then max = a(i) If a(i) < min Then min =a(i) Next i Print "最大值为:"; max Print "最小值为:"; min
排序算法 冒泡 排序法 比较交换 排序法 选择 排序法
数组排序—比较交换法 原始数据: 75 87 52 94 60 要求:升序 75 87 52 94 60 75 87 52 94 60 原始数据: 75 87 52 94 60 要求:升序 75 87 52 94 60 75 87 52 94 60 52 87 75 94 60 52 87 75 94 60 52 87 75 94 60 第一轮结束,数据52已排好
数组排序—比较交换法 排序关键:某趟排序,固定与某一位置数据比较 第 二 轮 比 较 : 52 87 75 94 60 52 75 87 94 60 52 75 87 94 60 52 60 87 94 75 第一轮结束,数据52 60已排好
' n个数据需进行n-1趟排序 For i = LBound(a) To UBound(a) - 1 For j = i + 1 To UBound(a) If a(i) > a(j) Then t = a(i) a(i) = a(j) a(j) = t End If Next j Next i
数组排序--选择法 排序过程(重复N-1次) 第一步:查找最值位置 第二步:将最值与被排序位置数据交换 a(1) a(2) a(3) a(4) a(5) 原始数据 75 87 52 94 60 第一趟排序 75 87 52 94 60 第一趟排序 52 87 75 94 60 第二趟排序 52 60 75 94 87 第二趟排序 52 87 75 94 60 第三趟排序 52 60 75 94 87 第三趟排序 52 60 75 94 87 第四趟排序 52 60 75 87 94 第四趟排序 52 60 75 94 87 排序过程(重复N-1次) 第一步:查找最值位置 第二步:将最值与被排序位置数据交换
For i = LBound(a) To UBound(a) - 1 ' n个数据需进行n-1趟排序 p = i For j = i + 1 To UBound(a) If a(j) < a(p) Then p = j Next j t = a(i) a(i) = a(p) a(p) = t Next i
数组排序--冒泡法 排序关键:两两相邻数据比较 原始数据:75 87 52 94 60 第一趟排序 依此进行第2,3,4趟排序 原始数据 原始数据:75 87 52 94 60 第一趟排序 75 87 52 94 60 75 87 52 94 60 75 52 87 94 60 75 52 87 60 94 75 52 87 60 94 依此进行第2,3,4趟排序 原始数据 第一趟 排序后
For i = LBound(a) To UBound(a) - 1 ' n个数据需进行n-1趟排序 For j = LBound(a) To UBound(a) - i If a(j) > a(j + 1) Then ' 两相邻数据比较 t = a(j) a(j) = a(j + 1) a(j + 1) = t End If Next j Next i
查找—顺序查找 思路:从头至尾(或从尾至头)依次比较,若找到 则终止,否则继续。查找终止为或找到或数据找完。 适用于有序或无序数组
Dim a As Variant a = Array(-123, -10, 5, 8, 30, 56, 59, 66, 90, 518) n = UBound(a) k = Val(InputBox("输入要查询的关键值")) Print "要查询的数是:"; k For i = 1 To n If k = a(i) Then Exit For Next i If i <= n Then Print k; "has be found,on"; i; "th position" Else Print k; "has not be found,on a" End If
查找—折半查找 适合条件:数据有序 -123 -10 5 8 30 56 59 66 90 518 有序数组a,查找数据59 low mid=Int((low+high)/2) high
Dim a As Variant a = Array(-123, -10, 5, 8, 30, 56, 59, 66, 90, 518) n = UBound(a) k = Val(InputBox("输入要查询的关键值")) low = 1: high = n find = -1 'find=-1表示没有找到 While low <= high And find = -1 m = (low + high) \ 2 If k = a(m) Then find = 1 'find=1表示已经找到 Print k; "has be found,on"; m; "the position." Else If k < a(m) Then high = m - 1 low = m + 1 End If Wend If find = -1 Then Print k; "has not be found."
4.3 数组算法 插入 删除
有序数组插入 在有序数列中插入数据x 插入数据步骤: 1. 找到数据x应插入的位置i(1≤i≤n+1); a(1) a(2) …… a(i) a(i+1) a(n-1) a(n) 插入数据步骤: 1. 找到数据x应插入的位置i(1≤i≤n+1); a(1) a(2) …… a(i) a(i+1) a(n-1) a(n) 插入位置 2. 将数组第n~第 i位置数据依次往后移动一个位置; a(1) a(2) …… a(i) a(i+1) a(n-1) a(n) 移动顺序 3. 在数组第i个位置处插入数据x。 a(1) a(2) …… a(i) a(n-2) a(n-1) a(n) x
数组元素删除 1.查找欲删除数据x是否存在,若存在,记录其位置i(1≤i≤n) 2.查找成功情况下,将数组中第i+1至第n个元素依次向前 a(1) a(2) …… a(i) a(i+1) a(n-1) a(n) 数据x 2.查找成功情况下,将数组中第i+1至第n个元素依次向前 移动一个位置,并且数据元素个数-1。 a(1) a(2) …… a(i) a(i+1) a(n-1) a(n) 移动顺序 1 2 最后
引例2 仿Windows计算器设计 问题: 1、按钮数量众多 2、代码雷同
控件数组 相关概念 控件数组是由一组相同类型的控件组成 控件数组共用一个控件名,具有相同Name的属性 控件数组的每个元素有一个唯一的索引号(Index) 控件数组共享相同的事件过程 Private Sub Option1_Click(Index As Integer) … End Sub
控件数组的建立 设计阶段建立控件数组 运行阶段建立控件数组 方法1:Copy和Paste操作 方法2:直接修改控件为相同Name属性 用Load语句建立数组中其他控件 格式:Load 数组名(Index)
控件数组的删除 设计阶段删除控件数组 运行阶段删除控件数组 Step1:将控件Name属性改为不同 Step2:清空Index属性值 用Unload语句实现。 格式:Unload 数组名(Index)
控件数组的使用 用控件数组解决引例2 控件数组的引用 控件数组名(Index) Private Sub CommandInput_Click(Index As Integer) TextCal = TextCal & CommandInput(Index).Caption End Sub
综合案例 【综合1】设计如图所示4*4(4行4列,4种图案,每种图案各出现4次)的QQ表情连连看游戏。 思路: 1、用Load方法产生16个图像框控件 2、将4*4图像框数组转化成4*4的矩阵 3、根据连连看消除规则,判断最近被单击两幅图片所对应二维数组是否有可通行路径
综合案例 【综合1】与游戏所对应的二维数组值如下: 3 2 4 1 3 2 4 1
综合案例 【综合2】超级Mario 功能扩展:将第3章Mario(马里奥)吃蘑菇游戏中的砖块及“?”控件改为数组控件,同时将蘑菇数量增加至2个,以实现相同功能。
本章控件 ComboBox ListBox
列表框&组合框示例 ComboBox ListBox
列表框三要素 属性 List属性 Colunms ListCount:列表框的列表项数 ListIndex:当前选中的列表项的索引 Sorted Text:得到当前列表框的内容 MultiSelect
列表框三要素 事件和方法 含 义 Click/DbClick 列表框的单击/双击事件 AddItem 向列表框插入一行文本 含 义 Click/DbClick 列表框的单击/双击事件 AddItem 向列表框插入一行文本 RemoveItem 用于清除指定表项内容 Clear 清除列表框中所有项目 列表框名.AddItem 字符串[,下标] 列表框名.RemoveItem 下标 列表框名.Clear
列表框举例 【例】利用列表框方法,完成如图所示功能
组合框三要素 属性 事件 方法 Style:用于确定组合框的类型和显示方式 Text Change Click 同列表框 Style=0
组合框、列表框举例 【例】引用列表框、组合框属性,完成如图所示对文本框字体做相应设置。
谢 谢!