Download presentation
Presentation is loading. Please wait.
1
Visual Basic程序设计
2
第7章 数 组 ● 7.1 数组和数组元素 ● 7.3 动态数组 ● 7.2 静态数组 ● 7.4 For Each…Next语句
第7章 数 组 ● 7.1 数组和数组元素 ● 数组 ● 数组元素 ● 数组的类型 ● 数组的形式 ● 静态数组 ● 声明静态数组 ● Option Base语句 ● 数组的基本操作 ● 数组元素的输入、输出和复制 ● 数组的初始化 ● 静态数组使用示例 ● 动态数组 ● 创建动态数组 ● 保留动态数组的原有数据 ● 7.4 For Each…Next语句 ● 7.5 控件数组 ● 控件数组的概念 ● 控件数组的建立 ● 控件数组使用示例 ● 习题 7
3
●7.1数组和数组元素 ● 7.1.1 数组 数组 例如,在成绩数组cj中: 第一个学生的成绩用cj(1)来表示,其值为80;
● 数组 数组 例如,在成绩数组cj中: 第一个学生的成绩用cj(1)来表示,其值为80; 第二个学生的成绩用cj(2)来表示,其值为68; 第三个学生的成绩用cj(3)来表示,其值为90; 第四个学生的成绩用cj(4)来表示,其值为85; 第五个学生的成绩用cj(5)来表示,其值为95。 2. 数组的命名 3. 数组的维数 例如: a(10) 为一维数组 x(2 , 3) 为二维数组 b(4 , 5 , 6) 为三维数组
4
● 数组元素 1. 数组元素 下标变量的标识为:〈数组名〉(〈下标表〉) 例如: a(5) 代表数组a中顺序号为5的那个元素 x(26) 代表数组x中顺序号为26的那个元素 c(2,3) 代表数组c中第2排第3列的那个元素 2. 下标的使用说明 下标的使用方法为: 1) 下标放在数组名后的括号内,例如x(10),a(4,5),b(2,3,4)等。 2) 下标可以是常量、变量或表达式,例如a(3),x(i),a(10-n,n+2)等。 3) 下标反映的是在数组中的位置。 4) 下标变量与简单变量一样,可以被赋值和引用
5
● 7.2 静态数组 ● 7.1.3 数组的类型 ● 7.1.4 数组的形式 ● 7.2.1 声明静态数组
● 数组的类型 ● 数组的形式 ● 静态数组 ● 声明静态数组 声明静态数组的语法格式为:Dim 〈数组名〉(〈维数定义〉) [ As 〈类型〉] 1)〈维数定义〉指定数组的维数以及各维的范围: [〈下标下界1〉 To ]〈下标上界1〉[,[〈下标下界2〉 To ]〈下标上界2〉] ... 例如: Dim a( 2 To 4 ) As Integer ' 3个元素,下标范围为2到4 Dim b( 5 To 12 ) As String ' 8个元素,下标范围为5到12 2) 下标的上、下界不得超过Long(长整型)数据类型的范围(– ~ )。 3) 二维数组的声明,例如:Dim a( 1 To 3 , 1 To 4 ) As Double 4) 可以将所有这些推广到二维以上的数组。例如:Dim b( 2 , 1 To 3 , 1 To 4 )
6
● Option Base语句 语法格式为:Option Base 〈n〉 ● 数组的基本操作 ● 数组元素的输入、输出和复制 1. 数组元素的输入 【例7-1】利用数组Name()存放姓名。考虑到要在不同的过程中使用数组,所以首先在模块的通用段声明数组: Dim Name(1 To 10) As String 数组的赋值由窗体的Load事件代码完成: Private Sub Form_Load() a(1) = "陈高阳": a(2) = "赵世杰": a(3) = "李民维": a(4) = "马英丽": a(5) = "杨广民" a(6) = "李灵君": a(7) = "陈吉至": a(8) = "王东明": a(9) = "姜大伟": a(10) = "吴晓林" End Sub
7
【例7-2】随机产生10个两位整数,放入数组。考虑到要在不同的过程中使用数组,所以首先在模块的通用段声明数组:
Dim a(1 To 10) As Integer 随机整数的生成由窗体的Load事件代码完成: Private Sub Form_Load() Randomize For i = 1 To 10 a(i) = Int(Rnd * 90) + 10 Next End Sub 【例7-4】将例7-2中的数组在窗体中按2行5列输出。 Private Sub Form_Activate() Cls Print
8
If i Mod 5 = 0 Then Print a(i) Else Print a(i); " "; End If Next End Sub 【例7-5】将例7-3中的数组在列表框中按5行5列输出。 Private Sub Command1_Click() List1.Clear Dim p As String For i = 1 To 5 p = "" For j = 1 To 5 p = p & Format(a(i, j), List1.AddItem p, i - 1 3. 数组元素的复制
9
Array函数的语法格式为:〈数组变量名〉= Array(〈数组元素值〉) ● 7.2.6 静态数组使用示例
● 数组的初始化 Array函数的语法格式为:〈数组变量名〉= Array(〈数组元素值〉) ● 静态数组使用示例 【例7-6】斐波那契(Fibonacci)数列问题。 Fibonacci数列问题起源于一个古典的有关兔子繁殖的问题:假设在第1个月时有一对小兔子,第2个月时成为大兔子,第3个月时 兔子,并生出一对小兔子(一对老,一对小)。 第4个月时老兔子又生出一对小兔子,上个月的小兔子变成大兔子(一对老,一对大,一对小)。第5个月时上个月的大兔子成为老兔子,上个月的小兔子变成大兔子,两对老兔子生出两对小兔子(两对老,一对中,两对小)… 这样,各月的兔子对数为:1,1,2,3,5,8,… 这就是Fibonacci数列(如图7-1所示)。其中第n项的计算公式为: Fib(n) = Fib(n-1) + Fib(n-2)
10
设计步骤如下: 1) 建立应用程序用户界面与设置对象属性,设置如图7-1所示。 2) 编写代码。只需编写“确定”命令按钮的Click事件代码: Private Sub Command1_Click() Dim f(15) As Integer List1.Clear f(1) = 1: f(2) = 1 p = Format("Fib(" & 1 & "):", & Format(f(1), "########") List1.AddItem p, 0 For i = 3 To 15 f(i) = f(i - 1) + f(i - 2) p = Format("Fib(" & i & "):", & Format(f(i), "########") List1.AddItem p, i - 1 Next End Sub
11
【例7-7】随机生成10个互不相同的数,然后将这些数按由小到大的顺序显示出来,如图7-3所示。
设计步骤如下: 1) 建立应用程序用户界面与设置对象属性,如图7-3所示。 2) 编写代码。 考虑到要在不同的过程中使用数组,所以首先在模块的通用段声明数组: Dim a(1 To 10) As Integer 随机整数的生成由窗体的Load事件代码完成: Private Sub Form_Load() Dim p As String Randomize p = "" For i = 1 To 10 Do x = Int(Rnd * 90) + 10 yes = 0 For j = 1 To i - 1 If x = a(j) Then yes = 1: Exit For Next Loop While yes = 1
12
a(i) = x p = p & Str(a(i)) & "," Next Label1.Caption = LTrim(Left(p, Len(p) - 1)) Label2.Caption = "" End Sub 编写“排序”按钮Command2的Click事件代码: Private Sub Command2_Click() 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 p = Str(a(1)) For i = 2 To 10 p = p & "," & Str(a(i)) Label2.Caption = LTrim(p)
13
End Sub 编写“重置”按钮Command1的Click事件代码: Private Sub Command1_Click() Form_Load 【例7-8】设有10位同学的数学、语文、外语三门成绩,见表7-1。
14
设计步骤如下: 1) 建立应用程序用户界面与设置对象属性。 2) 编写代码。 首先在模块的通用段声明数组: Dim a(1 To 10) As String, b(1 To 10, 1 To 4) As Integer 数组的赋值由窗体的Load事件代码完成: Private Sub Form_Load() a(1) = "陈高阳": b(1, 1) = 89: b(1, 2) = 85: b(1, 3) = 91 a(2) = "赵世杰": b(2, 1) = 75: b(2, 2) = 78: b(2, 3) = 84 a(3) = "李民维": b(3, 1) = 64: b(3, 2) = 82: b(3, 3) = 72 a(4) = "马英丽": b(4, 1) = 88: b(4, 2) = 68: b(4, 3) = 64 a(5) = "杨广民": b(5, 1) = 79: b(5, 2) = 79: b(5, 3) = 87 a(6) = "李灵君": b(6, 1) = 91: b(6, 2) = 88: b(6, 3) = 87 a(7) = "陈吉至": b(7, 1) = 68: b(7, 2) = 73: b(7, 3) = 64 a(8) = "王东明": b(8, 1) = 58: b(8, 2) = 68: b(8, 3) = 65 a(9) = "姜大伟": b(9, 1) = 76: b(9, 2) = 81: b(9, 3) = 88 a(10) = "吴晓林": b(10, 1) = 78: b(10, 2) = 89: b(10, 3) = 82 End Sub
15
在列表框中显示姓名由窗体的Activate事件代码完成:
Private Sub Form_Activate() For n = 1 To 10 List1.AddItem a(n), n - 1 b(n, 4) = b(n, 1) + b(n, 2) + b(n, 3) Next Text1.Text = "": Text2.Text = "": Text3.Text = "": Text4.Text = "" End Sub 查阅学生的各科成绩由列表框的Click事件代码完成: Private Sub List1_Click() n = List1.ListIndex + 1 Text1.Text = b(n, 1) Text2.Text = b(n, 2) Text3.Text = b(n, 3) Text4.Text = b(n, 4) 各科平均分数的计算以及显示各科平均分以下的同学姓名则由三个命令按钮的Click事件代码分别完成: Private Sub Command1_Click() s = 0
16
For n = 1 To 10 s = s + b(n, 1) Next s = s / 10 p = "" If b(n, 1) < s Then p = p & a(n) & " " MsgBox "低于平均分数的同学有:" & Chr(13) & Chr(13) & p, 0, "数学的平均分为:" & s End Sub Private Sub Command2_Click() s = 0 s = s + b(n, 2)
17
For n = 1 To 10 If b(n, 2) < s Then p = p & a(n) & " " Next MsgBox "低于平均分数的同学有:" & Chr(13) & Chr(13) & p, 0, "语文的平均分为:" & s End Sub Private Sub Command3_Click() s = 0 s = s + b(n, 3) s = s / 10 p = "" If b(n, 3) < s Then p = p & a(n) & " " MsgBox "低于平均分数的同学有:" & Chr(13) & Chr(13) & p, 0, "外语的平均分为:" & s
18
【例7-9】将下列字符存放到数组中,并以倒序打印出来。字符是:
a b q r s t w x y e m n 设计步骤如下: 1) 建立用户界面和设置对象属性,如图7-6所示。 2) 编写事件代码。 编写“显示倒序”命令按钮Command1的Click(单击)事件代码为: Private Sub Command1_Click() Dim x As Integer , a(1 To 12) As String a(1) = "a" : a(2) = "b" : a(3) = "q" : a(4) = "r" : a(5) = "s" : a(6) = "t" a(7) = "w" : a(8) = "x" : a(9) = "y" : a(10) = "e" : a(11) = "m" : a(12) = "n" For x = 1 To 12 Label1.Caption = Label1.Caption & a(x) ' 按原字符顺序输出 Next x For x = 12 To 1 Step -1 Label2.Caption = Label2.Caption & a(x) ' 按倒序输出 End Sub
19
【例7-10】建立并输出一个10×10的矩阵,使该矩阵两条对角线元素为1,其余元素均为0。
编写窗体Form1的Activate(控件激活)事件代码: Private Sub Form_Activate() Dim s(10, 10) As Integer For n = 1 To ' 控制行数 For m = 1 To ' 控制列数 If n = m Or n = 11 – m Then ' 对角线元素 s(n, m) = 1 Else ' 非对角线元素 s(n, m) = 0 End If Next
20
● 7.3 动态数组 Next Picture1.Print For n = 1 To 10 ' 控制行数
For m = 1 To ' 控制列数 Picture1.Print Tab(m * 3); s(n, m); ' 输出各元素的值 Print ' 换行 End Sub ● 动态数组 ● 创建动态数组 语法格式为:Public | Private | Dim | Static 〈数组名〉() As 〈类型〉 2) 用ReDim语句分配实际的元素个数。语法格式为: ReDim [ Preserve ] 〈数组名〉(〈维数定义〉) [ As 〈类型〉]
21
例如,第一次声明在模块级所建立的动态数组a:
Dim a() As Integer 然后,在过程中给数组分配空间: Private Sub Form_Activate() . . . ReDim a(9, 19) End Sub ● 保留动态数组的原有数据 1. 具有Preserve关键字的ReDim语句 例如,使用具有Preserve关键字的ReDim语句的方法来增加数组大小,又不丢失原数据: ReDim a(2,4) ... ReDim Preserve a(2,6)
22
2. 动态数组使用示例 【例7-11】编写程序,输出杨辉三角形。杨辉三角形每行的第一列和最后 列均为1,其余各项的值都是其上一行中前一列元素与后一列元素之和 图7-8所示。 设计步骤如下: 1) 建立用户界面与设置对象属性,参见图7-9所示。 2) 编写事件代码。 在模块的通用段声明数组一个动态数组: Dim a( )
23
编写文本框Text1的KeyPress(按键)事件代码:
Private Sub Text1_KeyPress(KeyAscii As Integer) Dim n As Integer If KeyAscii = 13 Then ' 按Enter车键时执行 n = Val(Text1.Text) ' 在文本框中输入的行数 If n > 10 Then ' 设定不超过10行 MsgBox "请不要超过10!" ' 消息框 Exit Sub ' 退出过程 End If ReDim a(n, n) ' 分配动态数组实际的元素个数 For i = 1 To n a(i, 1) = 1: a(i, i) = ' 使得每行两边的元素值为1 Next
24
Print Tab(20); Format(1, "!@@@") & Chr(13)
Print Tab(18); Format(1, & Space(2) & Format(1, & Chr(13) For i = 3 To n Print Tab(20 – i * 2); Format(a(i, 1), & Space(2); For j = 2 To i – 1 a(i, j) = a(i – 1, j – 1) + a(i – 1, j) Print Format(a(i, j), Next Print Space(2) & Format(a(i, i), & Chr(13) End If End Sub
25
● 7.4 For Each…Next语句 1. For Each...Next语句的语法格式
For Each 〈成员〉 In 〈数组〉 [〈语句组〉] [ Exit For ] Next [〈成员〉] 2. For Each...Next语句的执行过程 例如: Dim a(1 To 8) For Each x In a Print x; Next x 3. For Each...Next语句使用示例
26
【例7-12】用For Each...Next语句,求1+2+3+…+100的值。
设计步骤如下: 1) 建立用户界面和设置对象属性,如图7-10所示。 2) 编写事件代码。 编写“计算”命令按钮Command1的Click(单击)事件代码: Private Sub Command1_Click() Dim x(100), a ' 声明数组和变量 For i = 1 To ' 为数组元素赋值 x(i) = i Next i For Each a In x() ' 求和 s = s + a Next Label1.Caption = s ' 输出结果 End Sub
27
【例7-13】求例7-2、例7-4随机整数中的最大值、最小值和平均值。
编写命令按钮Command1的Click事件代码: Private Sub Command1_Click() Dim n As Integer, m As Integer, s As Single m = 100: n = 0: s = 0 For Each x In a If x > n Then n = x If x < m Then m = x s = s + x Next MsgBox "最大值为" & n & Chr(13) & "最小值为" & m & Chr(13) & "平均值为" & s / 10 End Sub
28
● 7.5 控件数组 ● 7.5.1 控件数组的概念 ● 7.5.2 控件数组的建立 1. 为控件起相同的名字
● 7.5 控件数组 ● 控件数组的概念 ● 控件数组的建立 1. 为控件起相同的名字 可以改变已有控件的名字,将一组控件建立为控件数组,具体步骤如下: 1) 画出控件数组中要添加的控件(必须为同一类型的控件),并且决定哪一个控件作为数组中的第一个元素。 2) 选定控件,将其Name属性设置成数组名称。 3) 在为数组中的其他控件输入相同名称时,VB将显示一个对话框,要求确认是否要创建控件数组。此时选择“是”,确认操作。
29
2. 复制现有控件 3. 指定控件的索引值 可以直接指定控件数组的索引值,来建立控件数组。其具体步骤如下: 1) 绘制控件数组中的第一个控件。 2) 将其Index属性索引值改为0。 3) 复制控件数组中的其他控件。
30
● 控件数组使用示例 1. 命令按钮组 【例7-14】在例7-8中使用命令按钮控件数组。 具体步骤如下: 1) 修改命令按钮的属性设置。 2) 修改Command1的Click事件代码。 首先在原有Command1的Click事件过程中增加参数声明:Index As Integer,然后修改代码为: Private Sub Command1_Click(Index As Integer) k = Index Select Case k Case 0 t = "数学的平均分为:"
31
Case 1 t = "语文的平均分为:" Case 2 t = “外语的平均分为:” End Select s = 0 For n = 1 To 10 s = s + b(n, k + 1) Next s = s / 10 p = "" If b(n, k + 1) < s Then p = p & a(n) & " "
32
MsgBox "低于平均分数的同学有:" & Chr(13) & Chr(13) & p, 0, t & s
End Sub 2. 单选按钮组 【例7-15】在如图7-13所示,选择字体的例子中使用控件数组。 2) 编写单选按钮数组Option1() 的Click事件代码: Private Sub Option1_Click(Index As Integer) Select Case Index Case 0 Text1.FontName = "宋体" Case 1 Text1.FontName = "隶书" Case 2
33
Text1.FontName = "黑体" Case 3 Text1.FontName = "楷体_GB2312" End Select End Sub 3. 复选框组 【例7-16】在如图7-14所示,控制文本字体风格的例子中使用复选框组。 修改步骤如下: (1) 将4个复选框改为复选框组Check1(0)~Check1(3)。 (2) 编写复选框组的Click事件代码: Private Sub Check1_Click(Index As Integer) Select Case Index Case 0
34
Text1.FontBold = Check1(0).Value
Case 1 Text1.FontItalic = Check1(1).Value Case 2 Text1.FontUnderline = Check1(2).Value Case 3 Text1.FontStrikethru = Check1(3).Value End Select Text1.SetFocus End Sub 4. 文本框组 【例7-17】演示“比较法”排序过程的程序,使用控件数组可以使例7-7的“排序”更加生动,如图7-15所示。
35
设计步骤如下: 1) 建立应用程序用户界面。 3) 设计代码。 在窗体的通用过程中声明数组变量: Dim a(10) As TextBox ' 显示数据的对象数组 编写窗体的Activate事件代码: Private Sub Form_Activate() Randomize
36
For i = 1 To 10 Set a(i) = Text1(i) a(i).Text = Int(Rnd * 199) - 99 a(i).BackColor = RGB(255, 255, 255) Next Frame1.Height = 2256 End Sub 编写命令按钮控件数组Command1()的Click事件代码: Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 Command1(0).Enabled = False For i = 1 To 9
37
a(i).BackColor = RGB(255, 0, 255) Label2.Caption = " 以A(" & Trim(i) & ")为擂主与后边的元素依次比较,如有比A(" & _ Trim(i) + ")小者,则与A(" & Trim(i) & ")交换。" For j = i + 1 To 10 a(j).BackColor = RGB(255, 0, 255) MsgBox "比较A(" & Trim(i) & ")和A(" & Trim(j) & ")", , "比较法排序" If Val(a(i).Text) > Val(a(j).Text) Then p1 = "交换A(" & Trim(i) & ")和A(" & Trim(j) & ")" p2 = "A(" & Trim(i) & ") > A(" & Trim(j) & ")" MsgBox p1, , p2 t = a(i).Text: a(i).Text = a(j).Text: a(j).Text = t End If
38
a(j).BackColor = RGB(255, 255, 255) Next j a(i).BackColor = RGB(0, 255, 0) Next i a(10).BackColor = RGB(0, 255, 0) Label2.Caption = "" Frame1.Height = 1000 Case 1 Form_Activate Command1(0).Enabled = True End Select End Sub
39
7.1 输入一串字符,统计各字母出现的次数,不区分大小写。
● 习题 7 7.1 输入一串字符,统计各字母出现的次数,不区分大小写。 7.2 从键盘输入10个数,要求按从小到大的顺序打印出来。 7.3 随机产生10个两位整数,找出其最大值、最小值和平均值。 7.4 利用随机函数,模拟投币结果。设共投币100次,求“两个正面”、“两个反面”、“一正一反”三种情况各出现多少次。 7.5 某数组有20个元素,元素的值由键盘输入,要求将前10个元素与后10个元素对换。即第1个元素与第20个元素互换,第2个元素与第19个元素互换,…,第10个元素与第11个元素互换。输出数组原来各元素的值和对换后各元素的值。 7.6 有一个6×6的矩阵,各元素的值由键盘输入,求全部元素的平均值,并输出高于平均值的元素以及它们的行、列号。 7.7 编制应用程序,输入两个数,根据不同运算符计算结果。 7.8 某数组有20个元素,元素的值由键盘输入,要求将前10个元素与后10个元素对换。即第1个元素与第20个元素互换,第2个元素与第19个元素互换,…,第10个元素与第11个元素互换。输出数组原来各元素的值和对换后各元素的值。
40
7.9 矩阵转置。即将矩阵行、列互换: 7.10 矩阵的加法运算。两个相同阶数的矩阵A和B相加,是将相应位置上的元素相加后放到同阶矩阵C的相应位置。 7.11 矩阵的乘法运算。设A = (aij)为n×k矩阵,B = (bij)为k×m矩阵,则C = AB为n×m矩阵,C中元素:
41
7.12 输出幻方阵。幻方阵也称魔方阵,是指由自然数1~n2(n为奇数)构成的方阵,其各行、各列以及对角线元素之和均相等。如图7-17所示
1) 每一个数存放的行比前一个数的行数减1,列数加1。 2) 若上一个数在第1行,则下一个数在第n行(最下一行)。 3) 若上一个数在第n列,则下一个数在第1列,而行数减1。 4) 若某数按以上规律应放的位置已被其他数占据,则该数放在上一数的下面。)
42
7.13 利用一维数组统计一个班学生0~9、10~19、20~29、…、90~99及100各分数段的人数。如图7-18所示。
7.14 设计一个“通讯录”程序。当用户在下拉列表框中选择某一人名后,在“电话号码”文本框中显示出对应的电话号码。当用户选择或取消“单位”和“住址”复选框后,将打开或关闭“工作单位”或“家庭住址”文本框,如图7-19所示。 7.15 某校召开运动会。有10人参加男子100米短跑决赛,运动员号码和成绩见表7-3,试设计一程序,按成绩排名次。
43
7.16 设计简易计算器,如图7-20所示。 7.17 编程序,输出杨辉三角形(国外称Pascal三角形),如图7-21所示。 7.18 使用选项按钮组计算银行本息和。设银行定期存款年利率为:1年期2.25%,2年期2.43%,3年期2.70%,5年期2.88%(不计复利)。
44
7.19 设有一个5×5的方阵,其中元素是由计算机随机生成的小于100的整数。求出:
1) 对角线上元素之和; 2) 对角线上元素之积; 3) 方阵中最大的元素。 分析:方阵中的元素可以用一个二维的数组表示。利用单层的循环就可以计算对角线上元素的和、积,求方阵中的最大元素则需要利用双层的循环。
45
7.20 用“选择排序”法,对随机产生的5个数从小到大排序。
分析:排序是将一组数按递增或递减的次序排列。排序的算法有许多,最简单的是选择排序法。选择排序法的思路是: 1) 对有n个数的序列,从中选出最小的数(递增),与第1个数交换位置; 2) 除第1个数外,其余n–1个数再按(1)的方法选出次小的数,与第2个数交换位置。 3) 重复(1) n–1遍,最后构成递增序列。 为了便于理解,我们假定a数组有5个元素,下标从1 To 5,且数组中已赋值,排序过程,如图7-22所示。
Similar presentations