数组 第 6 章
例如计算这100个学生成绩的平均分,可用: S=0 For k=0 To 99 S = S + t(k) ‘累加分数 Next k Aver=S/100 ‘求平均分
数组是一组按一定顺序排列的数据的集合 例如,学生成绩T=[t(0), t(1), … t(99)] 是一个数组 三元一次方程组的系数矩阵 a11 a12 a13 A= a21 a22 a23 a31 a31 a33 也是一个数组 数组名(不能与简单变量同名);数组类型
数组下标测试函数 Ubound(数组名[,维]) Lbound(数组名[,维]) Dim y(1 to 12,5 to 20,-3 to 6) Print Lbound(y,1), Ubound(y,1) Print Lbound(y,2), Ubound(y,2) Print Lbound(y,3), Ubound(y,3)
设定下界的方法 Option Base 1 ‘设定下界为1 Dim Data(10) As Single ‘下标号从1~10 6.2.2 Array函数 使用Array函数可以为数组元素赋值 示例 Dim D As Variant ‘定义数组名(变体类型) D = Array(1, 2, 3, 4) 执行结果:1→D(0),2→D(1), 3→D(2), 4→D(3)
Erase 数组名[,数组名],…… 重新对静太数组进行初始化,数值置0,字符为空字符串,而原数组存在。 释放动态数组存储空间,原有数组不再存在。 变体数组,每个元素重新置为空。
数组的引用和赋值: Option Base 1 Dim B1 As Variant B1 = Array(89, 96, 81, 67, 79, 90, 63, 85, 95, 83) y=B1(3) C=B1(5)+B1(7) 数组的引用下标不能越界 数组的赋值: 使用循环语句:
For k=0 To 10 t(k) = 2*k+1 Next k dim k(10) For k=0 To 10 t(k) = 2*k+1 Next k Dim d(5) As Integer For i = 1 To 5 '输入成绩 d(i) = Val(InputBox("请输入第" & Str(i) & _ "个学生的成绩", "输入成绩")) Next i
数组输出 For i = 1 To 5 Print d(i); Next i
声明F为动态数组的示例: Private Sub Command1_Click() Dim F() As Integer ‘声明一个整型动态数组 …… Size=20 ReDim F(Size) End Sub 每次执行ReDim时,系统会清除指定数组的内容 若采用:ReDim Preserve F(Size) 则能保留数组中原有的数据
例6.7 按图6.4设计窗体,其中一组(共5个)单选按钮构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小 例6.7 按图6.4设计窗体,其中一组(共5个)单选按钮构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小 控件数组
(1)设计控件数组Option1,其中包含5个单选按钮对象 设计步骤: (1)设计控件数组Option1,其中包含5个单选按钮对象 具体操作方法: ① 画出第一个单选按钮控件,名称采用默认的Option1。此时该控件处于选定状态。 ② 单击工具栏上的“复制”按钮(或按Ctrl+C)。 ③ 单击工具栏上的“粘贴”按钮(或按Ctrl+V),此时系统弹出一个如图6.5所示的对话框 单击“是”,就建立一个控件数组元素,其Index属性为1,而已画出的第一个控件的Index属性值为0。 通过鼠标拖放可以调整新控件的位置
④ 继续单击“粘贴”按钮(或按Ctrl+V)和调整控件位置,可得到控件数组中的其他三个控件,其Index属性值分别为2,3和4(即从上而下为0,1,2,3,4) ⑤ 设置控件数组各元素(从上而下)的Caption属性分别为10,14,18,24和28 (2)建立一个文本框Text1,其Text属性设置为“控件数组的使用”。再建立一个标签,其Caption属性为“字号控制” (3)编写程序代码
Private Sub Form_Load() Option1(0).Value = True '选定第一个单选按钮 Text1.FontSize = 10 '设定文本框中的字号 End Sub Private Sub Option1_Click(Index As Integer) Select Case Index '系统自动返回Index值 Case 0 Text1.FontSize = 10 Case 1 Text1.FontSize = 14 Case 2 Text1.FontSize = 18 Case 3 Text1.FontSize = 24 Case 4 Text1.FontSize = 28 End Select
Private Sub Form_Load() Dim d(5) As Integer Dim i As Integer, total As Single, average As Single Show For i = 1 To 5 '输入成绩 d(i) = Val(InputBox("请输入第" & Str(i) & _ "个学生的成绩", "输入成绩")) Next i total = 0 For i = 1 To 5 '计算总分和平均分 total = total + d(i) average = total / 5 Print "总分:" & total Print "平均分:" & Format(average, "##.0") End Sub
程序中,先通过Dim语句为数组d定义维数及下标范围,也即为数组安排一块连续的内存存储区,但这并不意味着内存里该数组已建立了应有的内容 本例中输入数组中的数据是由InputBox函数来实现的,共循环了五次,输入的五个数依次赋值给下标变量d(1)~d(5) 建立了数组中的数据后,就可以按要求进行处理
Private Sub Command1_Click() Dim max As Integer, min As Integer max = score(1) '设定初值 min = score(1) For i = 2 To 10 If max < score(i) Then '找最高分 max = score(i) End If If min > score(i) Then '找最低分 min = score(i) Next i 'Chr(13)起换行作用 Label1.Caption = "最高分:" + Str(max) + _ Chr(13) + "最低分:" + Str(min) End Sub
Print k(c), Format(s / 5, "##.0") Next c End Sub Show Print "学生", "平均分“ '输出20个减号“-” Print String(20, "-") For r = 1 To 5 s = 0 '累加前清0 For c = 1 To 3 '累加同一行数据 s = s + a(r, c) Next c Print r, Format(s / 3, "##.0") Next r Print Print "课程", "平均分" Print String(20, "-") For c = 1 To 3 s = 0 For r = 1 To 5 '累加同一列数据 s = s + a(r, c) Next r Print k(c), Format(s / 5, "##.0") Next c End Sub
程序运行结果
1. a(1)与a(2) ~a(4)比较,选出最小值,结果 59 90 65 64 排列要求 小 大 示例: a(1) a(2) a(3) a(4) 90 64 65 59 1. a(1)与a(2) ~a(4)比较,选出最小值,结果 59 90 65 64 2. a(2)与a(3) ~a(4)比较,选出次小值,结果 59 64 90 65 3. a(3)与a(4)比较,选出较小值,结果 59 64 65 90 i=1 j=2, 3, 4 i=2 j=3, 4 i=3 j=4 For i=1 to 3 For j=i+1 to 4 …… Next j Next i 程 序 结 构
t = a(i): a(i) = a(j): a(j) = t '交换位置 End If Next j Next i Print: Print For i = 1 To 9 For j = i + 1 To 10 If a(i) > a(j) Then t = a(i): a(i) = a(j): a(j) = t '交换位置 End If Next j Next i Print "排序结果:" For i = 1 To 10 Print a(i); End Sub
改写中间程序段“For i=1 To 9”~“Next i”(共7个程序行) For i = 1 To 9 k = i ‘k用来记录每次选择的最小值的下标 For j = i + 1 To 10 If a(k) > a(j) Then k = j End If Next j t = a(k): a(k) = a(i): a(i) = t '交换位置 Next i 变量k记录每一次选出的最小值的下标,在本次比较结束后,使a(i)与a(k)一次换位即可
(3)编写程序代码 功能要求:用户在文本框Text1中输入准考证号码,单击“查找”按钮(Command1)后,则查找出对应的教室,并将教室号码输出在文本框Text2中 Dim rm(6, 3) As Integer Private Sub Form_Load() ‘输入数组数据 rm(1, 1) = 2101: rm(1, 2) = 2147: rm(1, 3) = 102 rm(2, 1) = 1741: rm(2, 2) = 1802: rm(2, 3) = 103 rm(3, 1) = 1201: rm(3, 2) = 1287: rm(3, 3) = 114 rm(4, 1) = 3333: rm(4, 2) = 3387: rm(4, 3) = 209 rm(5, 1) = 1803: rm(5, 2) = 1829: rm(5, 3) = 305 rm(6, 1) = 2511: rm(6, 2) = 2576: rm(6, 3) = 306 End Sub
Private Sub Command1_Click() Dim no As Integer, flag As Integer flag = 0 '查找标记,0表示未找到 no = Val(Text1.Text) For i = 1 To 6 If no >= rm(i, 1) And no <= rm(i, 2) Then Text2.Text = rm(i, 3) '显示教室号码 flag = 1 '1表示找到 Exit For End If Next i If flag = 0 Then Text2.Text = "无此准考证号码" Text1.SetFocus ‘设置焦点 End Sub
(2) 创建应用程序的用户界面和设置对象属性 (3)编写程序代码
Dim h(10) As Integer, d(10, 2) As Integer Private Sub Form_Load() h(1) = 1201: h(2) = 1202: h(3) = 1203 h(4) = 1205: h(5) = 1206: h(6) = 1207 h(7) = 1209: h(8) = 1210: h(9) = 1211: h(10) = 1215 '成绩存放在数组d(,)中 d(1, 1) = 92: d(1, 2) = 86 d(2, 1) = 78: d(2, 2) = 71 d(3, 1) = 83: d(3, 2) = 74 d(4, 1) = 67: d(4, 2) = 75 d(5, 1) = 71: d(5, 2) = 55 d(6, 1) = 62: d(6, 2) = 80 d(7, 1) = 98: d(7, 2) = 83 d(8, 1) = 99: d(8, 2) = 80 d(9, 1) = 57: d(9, 2) = 67 d(10, 1) = 80: d(10, 2) = 78 End Sub
Private Sub Command1_Click() Dim no As Integer, flag As Integer Dim m As Integer, top As Integer, bott As Integer flag = -1 '置未找到标志 top = 1: bott = 10 '设定范围 no = Val(Text1.Text) '取学号 If no < h(top) Or no > h(bott) Then flag = -2 '若超出学号范围, 置特殊标志-2 End If
Text5.Text = (d(m, 1) + d(m, 2)) / 2 Case no < h(m) '小于中间数据 Do While flag = -1 And top <= bott m = (top + bott) / 2 '取中点 Select Case True Case no = h(m) '找到 flag = m '置找到标志 Text2.Text = h(m) Text3.Text = d(m, 1) Text4.Text = d(m, 2) Text5.Text = (d(m, 1) + d(m, 2)) / 2 Case no < h(m) '小于中间数据 bott = m - 1 '上半部 Case no > h(m) '大于中间数据 top = m + 1 '下半部 End Select Loop
If flag < 0 Then '判是否找不到 Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = "" MsgBox "无此学生!" End If Text1.SetFocus End Sub
(1) 创建应用程序的用户界面和设置对象属性
(2)创建应用程序的用户界面和设置对象属性 窗体上含有一个文本框控件数组和一个命令按钮 文本框控件数组(Text1(1)~Text1(8))用来显示演示的8个数 (3)编写程序代码 功能要求: 程序运行后自动产生8个两位随机整数 单击“排序”按钮(Command1)时,即启动排序过程 通过MsgBox函数来暂停程序运行
Private Sub Form_Load() Randomize For i = 1 To n '产生n 个随机数 Const n = 8 '声明符号常量 Option Base 1 Private Sub Form_Load() Randomize For i = 1 To n '产生n 个随机数 Text1(i).ForeColor = RGB(0, 0, 0) '用黑色显示 Text1(i).Text = Int(90 * Rnd + 10) Next i End Sub
Private Sub Command1_Click() For j = 1 To n - 1 '外循环 MsgBox "准备进行第" + Str(j) + "次比较,按回车键继续" For i = 1 To n - j '内循环 If Val(Text1(i).Text) > Val(Text1(i + 1).Text) Then t = Text1(i).Text Text1(i) . Text = Text1(i + 1).Text Text1(i + 1).Text = t End If Next i '沉底数用红色表示 Text1(n - j + 1).ForeColor = RGB(255, 0, 0) Next j MsgBox "排序完毕“ End Sub