830 likes | 1.04k Views
第 6 章 数 组. 6.1 一维数组 6.2 控件数组 6.3 二维数组. 问题:统计班级学生的考试成绩、 平均分等 特点:对 批量数据 进行处理 各数据间存在内部联系. 使用数组. 数组的概念. 由一组(若干个) 类型相同 的相关 变量 结合在一起而构成的 集合 ; 构成数组的每一个变量称为 数组元素 ; 同一数组中的元素都使用 统一的变量名 ,只是通过 不同的下标 来加以区分; 只有一个下标的数组称为 一维 数组,有两个下标的数组称为 二维 数组。. 6.1 一维数组.
E N D
第6章 数 组 6.1 一维数组 6.2 控件数组 6.3 二维数组
问题:统计班级学生的考试成绩、 平均分等 特点:对批量数据进行处理 各数据间存在内部联系 使用数组
数组的概念 • 由一组(若干个)类型相同的相关变量结合在一起而构成的集合; • 构成数组的每一个变量称为数组元素; • 同一数组中的元素都使用统一的变量名,只是通过不同的下标来加以区分; • 只有一个下标的数组称为一维数组,有两个下标的数组称为二维数组。
6.1 一维数组 【例6.1】随机产生10个两位数,计 算总和。 方法一:使用简单变量 定义10个整型变量分别保存随 机产生的数据 数据量大,不方便
下标为i的元素 方法二:使用数组 定义一维数组a,包含10个元素 Dim a(1 To 10) As Integer For i=1 To 10 a(i)=Int(Rnd*90)+10 sum = sum + a(i) Next i 书写简洁、 操作方便
说明 • 使用同一数组名代表逻辑上相关的一批变量(10个),为了表示不同的数组元素,只需简单地指出该元素的下标;a(1)、a(2)、…、a(9)、a(10) • a数组中的每个元素中只能存放整型数据;
规定下标的取值范围 缺省则默认下界为0 定义一维数组的一般形式 Dim 数组名(下界 To 上界)As 数据类型 数组中元素个数:上界 -下界 + 1 每个元素的数据类型 例如:Dim b(-2 To 3) As Integer Dim x(5) As String 声明一维数组b,包含6个Integer型元素b(-2)、b(-1)、b(0)、b(1)、b(2)、b(3); 声明一维数组x,包含6个字符型元素x(0)、x(1)、...、x(5)
数组名的命名规则与变量名相同 • 数组元素代表内存中的一个存储单元 • 引用一维数组元素的一般形式 数组名(下标) 不得越界
a a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9) a(10) • 系统为数组中的元素分配连续的内存单元 Dim a(1 To 10) As Integer
【例6.2】随机产生 20 个两位整数显示在上部的标签中,单击“偶数”单选按钮时找出其中的所有偶数显示在下部的标签中,若单击“奇数”单选按钮,则显示所有奇数。
只能是0或1,0则下标从0开始 程序代码 Option Base 1 Dim a(20) As Integer Private Sub Form_Load() For i = 1 To 20 a(i) = Int(Rnd * 90) + 10 dstr = dstr & Str$(a(i)) Next i lblData.Caption = dstr End Sub 声明时缺省下界的所有数组,元素下标均从1开始 等价于 Dim a(1 To 20) As Integer
程序代码 Private Sub optEven_Click() lblStr2.Caption = "偶数有:" For i = 1 To 20 If a(i) Mod 2 = 0 Then dstr = dstr & Str$(a(i)) End If Next i lblOut.Caption = dstr End Sub
程序代码 Private Sub optOdd_Click() lblStr2.Caption = "奇数有:" For i = 1 To 20 If a(i) Mod 2 = 1 Then dstr = dstr & Str$(a(i)) End If Next i lblOut.Caption = datastr End Sub
Option Base 语句必须出现在数组声明之前,且位于所有事件过程的前面; • 作用范围仅限于出现在同一代码窗口且在声明时未指出下标下界的数组; • 在一个代码窗口中,Option Base语句只能出现一次。
数组操作总是借助于循环语句来实现; • 利用循环变量与数组元素下标的对应关系实现数组元素的逐一引用,并对数组元素进行相应处理。
【例6.3】掷50次骰子,统计各点数出 现的次数。 要求:在例4.2的基础上使用数组进 一步统计各点数出现的次数。
程序分析 • 声明一个包含6个元素的整型数组num num(1) 统计点数1出现的次数 num(2) 统计点数2出现的次数 num(6) 统计点数6出现的次数 • 掷骰子时,每出现点数i(介于1至6之间) num(i) = num(i) + 1
用于显示各点数出现的次数 隐藏各标签 修改后的程序代码 Private Sub Form_Load() lblText.Visible = False lblPoint.Visible = False lblDot1.Visible = False lblDot2.Visible = False lblDot3.Visible = False lblDot4.Visible = False lblDot5.Visible = False lblDot6.Visible = False End Sub
Private Sub cmdStart_Click() Dim dot As Integer Dim n As Integer Dim dotstr As String Dim dotnum(1 To 6) As Integer lblText.Visible = True lblPoint.Visible = True lblDot1.Visible = True lblDot2.Visible = True 显示各标签
lblDot5.Visible = True lblDot6.Visible = True imgText.Visible = False Randomize For i = 1 To 50 dot = Int(Rnd * 6) + 1 dotnum(dot)= dotnum(dot)+1 dotstr=dotstr & Str(dot)+" " Next i 隐藏图片
lblPoint.Caption = dotstr lblDot1.Caption = "…" & Str(dotnum(1)) lblDot2.Caption = "…" & Str(dotnum(2)) lblDot3.Caption = "…" & Str(dotnum(3)) lblDot4.Caption = "…" & Str(dotnum(4)) lblDot5.Caption = "…" & Str(dotnum(5)) lblDot6.Caption = "…" & Str(dotnum(6)) End Sub 显示各点数
【例6.4】计算1 ~n的阶乘,并以一行一个的形式输出到窗体中(n不超过20)。 弹出输入框接收n值
程序分析 • 使用数组存放各阶乘值 a(1) 存放1! a(2) 存放2! a(20) 存放20! • 将数组声明为Double型,防止计算结果越界 Dim a(1 To 20) As Double
阶乘的值由函数调用求得 • 定义函数fac(n):计算n的阶乘 • 反复调用fac(i)以计算出不同i值的阶乘,将函数值保存到数组元素a(i)中(i从1变到n) Private Function fac(n) As Double result = 1 For i = 1 To n result = result * i Next i fac = result End Function For i = 1 To n a(i) = fac(i) Next i
程序代码 数组下标下界为1 Option Base 1 Dim a(20) As Double Private Sub cmdInput_Click() Cls n = Val(InputBox("请输入n:", "输入框")) For i = 1 To n a(i) = fac(i) Print i; "!="; a(i) Next i End Sub
Private Function fac(a) As Double result = 1 For i = 1 To a result = result * i Next i fac = result End Function
运行初期不可见 列表框 【例6.5】运行程序时在左边列表框中显示随机产生的100个两位整数,用鼠标选中某数后立即以消息框形式显示该数所处位置;单击“删除”按钮将把当前选中的数据从数列中删除;单击“找素数”按钮,在右边的列表框中显示100个整数中存在的所有素数。
控件介绍 —— 列表框 • 为用户提供选项的列表 • 以列表的形式显示若干数据项; • 用户可从中选择一项或多项; • 当项数超过列表框可显示的数目时,可自动出现垂直或水平滚动条 • 每个数据项称为一个项目或一个列表项 • 系统建议的列表框前缀:lst
算法分析 Private Function isprime (x) isprime = 1 k = Int(Sqr(x)) For i = 2 To k If x Mod i = 0 Then isprime = 0 Exit Function End If Next i End Function • 定义函数isprime(x),判断x是否为素数。若x是素数则函数值为1,否则值为0。 • 先假设x是素数,令函数值为1; isprime = 1 • 用1 ~ Sqr(x)依次去除x,一旦x被某个整数整除则表明其不是素数,结束函数(Exit Function )并返回0; isprime = 0,
产生100个随机数并添加到列表框lstData中 把数据a作为一个项目添加到列表框lstData中 程序代码 Private Sub Form_Load () Dim a As Integer lblPrime.Visible = False lstPrime.Visible = False For i = 1 To 100 a = Int(Rnd * 90) + 10 lstData.AddItem a Next i End Sub 方法
Private Sub lstData_Click () cmdDel.Visible = True lblPrime.Visible = False lstPrime.Visible = False i = lstData.ListIndex + 1 ch$ = lstData.Text & "是第" & i & "个数据!" MsgBox (ch$) End Sub 属性: 返回当前所选 项目的索引号 位置 属性:被选中项 目的内容
属性:字符型数组,其元素 一一对应列表框中的 每个项目 属性: 列表框中当前已有列表项的总数目 方法:删除列表框中的所有项目 Private Sub cmdPrime_Click () cmdDel.Visible = False lblPrime.Visible = True lstPrime.Visible = True lstPrime.Clear For i = 0 To lstData.ListCount – 1 a = Val( lstData.List(i) ) If isprime(a) = 1 Then lstPrime.AddItem a End If Next i End Sub 最后一个项目的下标 依次处理每个列表项 将第i个列表项的值赋给a
用户选中项目的索引号 Private Sub cmdDel_Click () lstData.RemoveItem lstData.ListIndex End Sub 方法:删除列表框中指 定的一个项目 将用户当前选中的项目从lstData列表框中删除
列表框常用属性及方法 • 返回当前所选项目的索引号,没有选中任何项目时返回-1 • 只能在代码中引用,设计阶段不可用 • 位置 = 列表框.ListIndex + 1 ListIndex属性
ListCount属性 • 返回列表框中当前已有列表项的总数目 • 最后一个项目的下标为ListCount-1 Text属性 • 当前被选中项目的内容 • 只读属性
List属性 • 字符型数组,元素一一对应列表框中的每个项目 • List(0)对应索引号为0的项目,List(i)对应索引号为i的项目 • List(ListIndex)为当前选中的项目,等价于列表框的Text属性值 • 设计阶段可通过该属性直接为列表框添加项目
AddItem方法 • 将一个项目添加到列表中 • 调用格式 列表框.AddItem 项目字串 [,项目索引号] 例 lstData.AddItem ”VB程序设计” , 0 • 出现在第i个位置上的数据项索引号为i-1 • 若语句中省略索引号,则新项目被添加到表尾 从0开始
Clear方法 • 删除列表框中的所有项目 • lstPrime.Clear RemoveItem方法 • 从列表框中删除指定的一个项目 • 调用格式 列表框名称.RemoveItem 删除项索引号 例 lstData.RemoveItem lstData.ListIndex 将当前选中的项目从lstData列表框中删除
【例6.6】使用输入框输入若干整数并添加到列表框中(输入“End” 时结束输入),然后找出其中最大数显示在标签中。
将第2个数据与当前最大值(处于k位置上的数据)进行比较将第2个数据与当前最大值(处于k位置上的数据)进行比较 将第3个数据与当前最大值(处于k位置上的数据)进行比较 将第i个数据与当前最大值(处于k位置上的数据)进行比较 若a(2)>a(k),则更新k值 k=2 若a(3)>a(k),则更新k值 k=3 若a(i)>a(k),则更新k值 k=i i = 2 ~ n 算法设计 • 找a(1) ~ a(n) n个数据中的最大数 假设第1个数据a(1)就是最大值,记录其所在位置(或下标): k = 1 For i = 2 To n If a(i) > a(k) Then k = i Next i a(k)即为最大值
程序代码 输入数据 Private Sub cmdIn_Click() lblMax.Visible = False a = InputBox( "…","…", 0) Do While LCase(a) <> "end" lstData.AddItem a a = InputBox("…", "….", 0) Loop End Sub
索引号 找最大值 Private Sub cmdMax_Click() k = 0 For i = 1 To lstData.ListCount - 1 If Val(lstData.List(i)) > Val(lstData.List(k)) Then k = i Next i lblMax.Visible = True lblMax.Caption = "最大值" & Str(lstData.List(k)) End Sub 当前最大值
【例6.7】用选择法对数组中的数进行从大到小排序。两个框架中分别添加标签,上部框架内的标签中显示10个随机生成的两位整数,下部框架内的标签中显示排序后的10个数据。【例6.7】用选择法对数组中的数进行从大到小排序。两个框架中分别添加标签,上部框架内的标签中显示10个随机生成的两位整数,下部框架内的标签中显示排序后的10个数据。
算法分析 —— 选择法排序 对包含n个数据的数组按从大到小排列 第1步:找出n个数据( a(1)至a(n) )中的 最大数,并与第1个数据a(1)交 换位置; 第2步:在剩下的n-1个数据(a(2)至a(n)) 中找出最大数,并与第2个数据a(2)交换位置; 在剩下的n-i+1个数据(a(i)至a(n))中找出最大数,并与第 i 个数据a(i)交换位置; 第i步: i = 1 ~ ? n-1
For i = 1 To n-1 Next i temp = a(i) a(i) = a(k) a(k) = temp k = i For j = i + 1 To 10 If a(j) > a(k) Then k = j Next j 选择法排序的基本算法 找出a(i)至a(n)中的最大值 将最大值与第i个数据a(i)交换位置
程序代码 产 生 随 机 数 据 并 显 示 Private Sub Form_Load () Dim a(1 To 10) As Integer Randomize For i = 1 To 10 a(i) = Int(Rnd * 90) + 10 datastr1 = datastr1 & Str$(a(i)) Next i lblData1.Caption = datastr1
10个数据, i由1到9 对 10 个 数 据 进 行 选 择 法 排 序 For i = 1 To 9 k = i For j = i + 1 To 10 If a(j) > a(k) Then k = j Next j If k <> i Then temp = a(i) a(i) = a(k) a(k) = temp End If Next i 最大值不是a(i) 时才交换,提高效率
界面设计 运行初期隐藏 组合框 【例6.8】考场计时程序。用户在组合框输入或选择考试时间后,单击“开始计时”按钮开始计时,并在下部标签中动态显示考试已进行的时间;距考试结束5分钟时发出10秒警告音;到达考试时间后显示另一有关交卷信息的窗体。
控件介绍 —— 组合框 • 文本框和列表框组合而成,具有它们的双重功效; • 用户既可通过列表框选定项目,也可在文本框中直接输入; • 当组合框中项目数超过其能够显示的数目时,控件上自动出现滚动条; • 可折叠显示组合框,单击右部箭头时显示全部列表; • 系统建议的控件前缀是cbo。
程序代码 用户设置的考试时间 单位:秒 Dim hh As Integer Dim mm As Integer Dim ss As Integer Dim examtime As Integer Dim counttime As Integer 已进行的考试时间 单位:秒