• 沒有找到結果。

Visual Basic程序设计教程 - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "Visual Basic程序设计教程 - 万水书苑-出版资源网"

Copied!
40
0
0

加載中.... (立即查看全文)

全文

(1)第 4 章 数组和自定义数据类型 本章学习目标 掌握数组的概念、定义和使用方法。  了解和学会动态数组的定义和在程序中的应用。  了解控件数据的定义和初步使用方法。  初步掌握 VB 程序设计中的常用算法。 本章将为读者介绍静态和动态数组的概念、定义和初步使用,同时向读者介绍 VB 程序设 计中的几种常用算法,如计数、累加与极值、排序、查找、插入、删除、迭代、字符处理等。 . 在 VB 程序设计中,常有很多变量,如 x0=301,x1=302,x2=303,x3=304,…。为方便对各个 变量进行统一管理,可将各同类变量定义成一个集合,即数组,如图 4-1 所示。. (3)下标: 指成员个数。 (1)数组名:. x(3) y(3,4) z(2,3,4). x0=301 x1=302 x2=303 x3=304 …. (2)元素: 组成的成员。引用数组各元素的方 法:x(0)、x(1)、x(2)、x(3)…。这里 的0表示下界值,3表示上界值。. 变量集合名。. (4)维数. (5)下标的上界(Upper Boundary)和下界(Lower Boundary)。指定了上下标界,称为固定大小的数组 (常规数组),否则是动态数组。 图 4-1. 数组的概念. 一个数组的基本要素如下: (1)数组名(Array Name):变量集合名,如 x、y、z 等。 (2)下标(Index):指成员个数,如 x(4)中的数字 4。 (3)元素(Element):组成的成员,使用时用 x(0)、x(1)、x(2)、x(3)、…表示成员元素。 (4)维数(Dimension):数组下标的个数,表示数组的复杂度。如数组 y(3,4)有两个下 标,我们称二维数组。 (5)下标的上界(Upper Boundary)和下界(Lower Boundary)。指定了上下标界,称为 固定大小的数组(常规数组),否则是动态数组。 一个数组可以存储多个值,通过数组名和下标对这些值进行存取。与变量相比,数组有 以下优点: (1)数组能够保存多个值; (2)数组可与循环语句配合实现复杂算法;.

(2) ▌▎Visual Basic 程序设计教程 ▎▌. (3)数组可作通用过程的参数,传递大量的值; (4)数组作为函数过程的返回值,可返回大量的值; (5)数组常用来表示与一维、二维、三维空间分布相关的数据,非常直观; (6)动态数组可根据需要开辟内存空间,优化程序、提高效率。 在 VB 中,根据数组的大小确定与否,可以分为常规(静态或定长)数组和动态(可变长) 数组。数组中的元素不仅可以是各种数据类型的数据,还可以是各种对象控件。数组元素由控 件组成的数组,称为控件数组。 常规数组至少应该有一个元素,这时下标的上界与下界相等。. 4.1. 常规数组. 常规数组,即固定大小的数组(也称静态(Static)数组)。由括号中的数值决定数组的维 数和下标的上下界。定义格式如下: Public|Private|Dim|Static 数组名(维数与下标界限) [As 数据类型名]. 其中,“Public|Private|Dim|Static”决定数组的作用范围(全局级、模块级、过程级和静态 过程级),用法和定义变量相同。 “维数与下标界限”部分决定数组的维数和元素个数。 “数据类型名”指定数组的数据类型,即每个元素的类型,决定元素占用内存的大小和数 据的存储方式。 如: Dim x(5) as Integer,y(3,4) as Single,z(3,4,5) as String. 分别定义了一个一维数组 x,一个二维数组 y 和一个三维数组 z。数组 x、y 和 z 中的每个 元素分别接受整型、单精度浮点型和字符串的数值。 4.1.1 一维数组 1.一维数组的定义 只有一个下标的数组称为一维数组,一维数组定义的格式为: 在过程中定义局部数组 Public|Private|Dim|Static 数组名([下标下界 To ]下标上界) [As 数据类型]. 或 Public|Private|Dim|Static 数组名[<数据类型符>]([下标下界 To ]下标上界). 例:Dim a(10) As Integer,定义了一个一维数组 a,下标上界为 10。 又如:Dim b(2 to 10) As Integer,与之等价的形式为:Dim b%(2 to 10)。 如果已经定义了一个自定义数据类型 Student(参见 2.1.2 节),我们也可声明和 Student 有关的数组。 Dim stud(99) as Student. '定义一个自定义数据类型的数组 stud(). 说明: (1)数组变量的命名遵循变量的命名规则。数组的作用域和变量的作用域相同。 (2)数组下标下界可以省略,如果省略,则下标下界的默认值为 0。可以通过 Option Base 语句来设定省略数组下标下界时下界的值,其语法格式为: Option Base n. Option Base 语句后 n 的值只能为 0 或 1,而且该语句只能放在模块的声明部分。 - 126 -.

(3) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 例如: Dim a(5) As Integer. 上面的语句如果没有 Option Base 语句,则定义了一个下界为 0,上界为 5 的数组 a。如果 存在 Option Base 1,则定义了一个下界为 1,上界为 5 的数组 a。 使用“0”时,上界 n 必须是非负整数常量(不能使用变量);使用“1”时,上界 n 必须 是正整数常量。如果没使用 Option Base 语句,默认为 0。 例如,图 4-2 所示的语句不正确。. 图 4-2. 定义数组时,下标不能使用变量. (3)如果下标下界不省略,可以使用关键字 To 指定下标的下界和上界,且下界的值不 能超过上界的值。例如: Dim x(-2 To 3) as Integer. 定义了一个下界为-2,上界为 3 的数组 x,表示数组 x 有 6 个元素,分别是 x(-2)、x(-1)、 x(0)、x(1)、x(2)、x(3)。 (4)数组中元素的个数可以通过如下公式来计算: 数组元素个数=上界–下界+1 例如:Dim a(2 To 6) As Integer '数组元素的个数为 5 (5)As 子句定义数组的数据类型,如果省略则定义为变体类型,数组可以存储任意类型 的数据。 (6)一条语句可以定义多个数组。例如: Dim a(4) As Integer, b(5) As Integer '定义了两个数组 a 和 b 2.一维数组元素的访问 一维数组被定义之后,便具有了内存空间,可以通过以下方式访问数组指定下标的元素。 数组名(下标). 访问数组元素时的“下标”可以是整型(或长整型)常量、变量或表达式。下标值不能小 于数组下标的下界,不能大于下标的上界,否则会引发“下标越界”的运行时错误。 3.一维数组元素的赋值 和变量一样,数组在定义后,数组中的各元素都将被赋一个初值。数值型数组中各元素 的初值为 0;字符串数组中各元素的初值为空串;布尔型数组中各元素的初值为 False;日期 型数组中各元素的初值为 00:00:00;变体型数组中各元素的初值为空值(Empty)。 数组元素也可以像普通变量一样被赋值、参与表达式计算、作为实参调用通用过程,也 可以使用循环语句对多个元素进行“批量”操作。 例如: Dim a(0 To 5) As Integer. ' 定义数组 a. 可以通过以下两种方法为数组 a 中各元素赋值。 方法 1:为单个元素赋值 - 127 -.

(4) ▌▎Visual Basic 程序设计教程 ▎▌ a(0) = 1 : a(1) = 3 : a(2) = 5 : a(3) = 7 : a(4) = 9 : a(5) = 11. 方法 2:通过循环语句为各元素赋值 For i = 0 To 5 a(i) = 2 * i +1 Next. 【例 4-1】定义一个内含 10 个元素的数组,数组中各元素是随机产生的二位整数。求数 组中最大元素及其下标。 分析:数组中各元素是随机产生的二位整数可由公式 Int(Rnd*90+10)得到,然后用比较的 方法得到数组中的最大值及最大值所在元素的下标值。 在新建工程的窗体上设置单击事件,编写代码如下: Option Base 1 '数组下标值由 1 开始 Private Sub Form_Click() Dim a(10) As Integer Dim k%, max%, Indexk% 'max 和 Indexk 分别表示最大值和所在下标值 For k = 1 To 10 a(k) = Int(Rnd * 90 + 10) Print a(k); Next Print For k = 1 To 10 If max < a(k) Then max = a(k) Indexk = k End If Next Print "数组各元素的最大值是:"; max, "所在下标号是"; Indexk End Sub. 为了使程序在运行时,每一次产生的数组各元素值都不相同,可使用下面的事件代码。 Private Sub Form_Load() Randomize End Sub. 程序运行的界面,如图 4-3 所示。 【例 4-2】十进制数转换为二进制数,程序运行的界面,如图 4-4 所示。. 图 4-3. 例 4-1 程序运行界面. 图 4-4. 例 4-2 程序运行界面. 分析: ①对整数,将十进制转换成二进制的方法是“除 2 反序取余法” ,即:把要转换的十进制 数反复除以 2 取其余数(除尽为 1,除不尽为 0),直至商为 0;再将余数反序排列即为对应的 二进制数。程序中使用了数组 b 保存每次除以 2 所得的余数。 ②对十进制小数,将十进制转换成二进制的方法是“乘 2 正序取整法”,即:把要转换的 十进制小数反复乘以 2 取其整数,直至所需的小数位。 - 128 -.

(5) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 在新建工程的窗体上设置一个命令按钮 Command1(转换),两个文本框 Text1~2。命令 按钮 Command1 编写代码如下: Option Base 0 Private Sub Command1_Click() Dim i As Integer Dim d As Integer '表示十进制数 Dim b(15) As Byte '用于存储二进制数符 Dim s As String d = Text1.Text. ' 得到十进制数. Do Until d = 0 b(i) = d Mod 2. ' 除 2 取余. d=d\2 i=i+1 Loop Do While i > 0 i=i-1 s = s & b(i). ' 反序排列. Loop Text2.Text = s. ' 显示二进制数. End Sub. 程序运行后,输入一个整数,如 36,则转换输出的二进制数是:100100。 【例 4-3】Josephus(约瑟夫)问题。有 n 个小孩围成一圈,从 1 开始顺序编号到 n,现在 从 1 号开始顺时针数数,数到 m 者自动出列,然后从下一个小孩开始重新数数,仍然每次数 到 m 者自动出列。 现有小孩 7 人,小孩数到 3 时被剔除,程序运行的界面如图 4-5 所示。. 图 4-5. 例 4-3 程序运行界面. 分析:先定义一个表示小孩的数组,每个数组元素所存储的值为小孩所在位置的编号, 小孩的编号从 1 开始,一旦数组元素的值为 0 时,即表示被剔除。为表示小孩围成圈,可以用 求模运算来使数组的遍历从尾部回到头部,从而继续计数过程。 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Const Total% = 7 Dim ChosseNum%, boy(Total - 1) As Integer Dim I%, J%, k%, n% For I = 0 To Total - 1 - 129 -.

(6) ▌▎Visual Basic 程序设计教程 ▎▌ boy(I) = I + 1 '给小孩编号 Next Print "剔除前,小孩的编号是:" For I = 0 To Total - 1 Print boy(I); '打印小孩的编号 Next Print Print "输入要剔除的小孩编号:" ChosseNum = InputBox("输入要剔除的小孩编号", "剔除的小孩编号") k = 1 '第 k 个离开的小孩 n = -1 '数组下标,下一个为 0 表示从第一个孩子开始数 Do While True I=0 Do While I < ChosseNum '数小孩数 n = (n + 1) Mod Total If boy(n) <> 0 Then I = I + 1 Loop Print If k = Total Then Exit Do boy(n) = 0 'n=2 即第 3、6 的值为 0 Print "第" & k & "被剔除后,剩下的小孩编号是:" For I = 0 To Total - 1 'If boy(I) <> 0 Then Print boy(I); Next Print k=k+1 Loop End Sub. 程序运行后,输入要剔除的编号大小 3 时,经过几轮剔除后,剩下编号为 4 的小孩。 【例 4-4】用筛选法编程产生 1 到 1000 之间所有素数。 分析:筛选法求素数首先要建立筛子,这里利用数组作筛子。下标对应于数,相应下标 变量的值标志是否在筛子中:为 1 表示在筛子中,为 0 表示已被筛去,不在筛子中。然后找每 一轮筛选种子,本文筛选种子是完成一轮筛选后的下一个最小的素数,初值为 2。对每一轮筛 选种子,筛去其所有倍数,即相应下标变量的值赋值为 0。倍数初值为筛选种子的 2 倍。筛选 完成,筛子中剩下的即为素数,依次类推。 ①把数组 D 下标为 2 到 N 的分量全部赋值 0; ②下标从 2 到 N 进行循环,在循环体内检测每分量的值是否为 0,如果下标为 I 的分量的 值为 0,则 I 是素数,输出 I,并且把 D 中下标是 I 的倍数的分量的值改为 1。 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim D(20000) As Integer, k% For i = 2 To 1000 D(i) = 0 Next i For i = 2 To 1000 If D(i) = 0 Then - 130 -.

(7) ▌▎第 4 章 数组和自定义数据类型 ▎▌ Select Case i Case Is < 10 Print i & Space(5); Case Is < 100 Print i & Space(4); Case Is < 1000 Print i & Space(3); End Select k=k+1 If k Mod 10 = 0 Then Print '每 10 个素数换行 For J = i To 1000 Step i '判断素数 D(J) = 1 Next J End If Next i End Sub. 程序执行后,1~1000 之间的所有素数被打印出来,如图 4-6 所示。. 图 4-6. 例 4-4 程序运行界面. 4.1.2 二维数组和多维数组 1.二维数组的定义 二维数组的定义和一维数组基本一样,只不过多了一个下标,其格式如下: 在过程中定义局部数组: Public | Private | Dim | Static 数组名([下标下界 To ]下标上界, [下标下界 To ]下标上界)[As 数据类型]. 二维数组定义语句的使用和一维数组基本一样,其元素个数为:第一维元素个数×第二维 元素个数。例如: Dim a(2, 3) As Single '元素个数为 12(3×4) Dim b(1 To 3, 2 To 6) As Integer '元素个数为 15(3×5). 同一维数组一样,如果没有使用 Option Base 1 指定下标从 1 开始,默认时下界都是从 0 开始,所以上面数组 a 和 b 的元素个数分别为 12 和 15。 习惯上,经常把数组的第一维称为行,第二维称为列,把一个二维数组和一个矩阵对应 起来。 二维数组在内存的存放顺序是“先行后列”。例如数组 a 的各元素在内存中的存放顺序 如下: 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)。 - 131 -.

(8) ▌▎Visual Basic 程序设计教程 ▎▌. 2.二维数组元素的引用 与一维数组一样,二维数组也要先声明后才能使用。二维数组中的元素可以用以下格式 引用: 数组名(下标 1,下标 2). 例如: a(1,2)=20 a(i+2,j)=a(1,2)*3. 【例 4-5】以下程序利用二重循环产生对二维数组各元素的引用,程序的执行结果如图 4-7 所示。. 图 4-7. 例 4-5 程序运行界面. Private Sub Form_Click() Dim I As Integer, J As Integer Dim A(1 To 10, 1 To 10) As Integer For I = 1 To 10 For J = 1 To 10 A(I, J) = I * 10 + J '为 A(I, J)赋值 If A(I, J) < 100 Then Print " " & A(I, J) & Space(3); Else Print A(I, J) & Space(3); '引用 A(I, J) End If Next J Print "" Next I End Sub. 【例 4-6】矩阵的转置。矩阵是由 N 行 M 列数值组成的特殊数据形式,矩阵可以使用二 维数组表示,如图 4-8(a)所示(本例涉及的是方阵,即 N=M,N 称为阶数)。矩阵的转置是 指行列数据交换,即沿对角线反转,如图 4-8(b)所示。  a(1,1) a(1, 2) a(1,3) a(1, 4)    a(2,1) a(2, 2) a(2,3) a(2, 4)  A  a(3,1) a(3, 2) a(3,3) a(3, 4)     a(4,1) a(4, 2) a(4,3) a(4, 4) . 1 2 3 4 1    5 6 7 8 2 A →A   9 10 11 12  3    13 14 15 16  4. (a)用二维数组表示矩阵. 5. 9. 13   6 10 14  7 11 15   8 12 16 . (b)矩阵的一个具体例子 图 4-8. 矩阵的转置. 程序运行的界面,如图 4-9 所示。 分析:矩阵的转置就是矩阵中各元素的行列值交换,也就是元素 a(i,j)的值转置后变为元 - 132 -.

(9) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 素 a(j,i)的值。所以,我们在程序中只要使主对角线之下元素 a(i,j)的值和其对应元素 a(j,i)的值 交换即可。. 图 4-9. 例 4-6 程序运行界面. 在新建工程的窗体上添加一个标签 Label1、一个文本框 Text1 和一个命令按钮 Command1。 设置标签 Label1 和命令按钮 Command1 的 Caption 属性值分别为“矩阵的阶数”和“开始”。 命令按钮 Command1(开始)的 Click 事件代码如下。 Option Base 1 Private Sub Command1_Click() Dim n As Integer Dim a() As Integer Dim i As Integer, j As Integer Dim t As Integer n = Text1.Text ReDim a(n, n) Print "原矩阵" For i = 1 To n For j = 1 To n a(i, j) = (i - 1) * n + j Print a(i, j), Next Print Next For i = 1 To n For j = 1 To i - 1 t = a(i, j) a(i, j) = a(j, i) a(j, i) = t Next Next Print "转换后" For i = 1 To n For j = 1 To n Print a(i, j), Next Print Next End Sub. '动态数组. '矩阵阶数 '重定义动态数组. '生成矩阵元素 '显示矩阵元素 '换行. '注意循环的终止值 '交换元素的值. '显示矩阵元素 '换行. 【例 4-7】杨辉,字谦光,南宋时期杭州人。在他 1261 年所著的《详解九章算法》一书 中辑录了前人贾宪的研究成果,提出了后人所说的“杨辉三角”数表,称之为“开方作法本 - 133 -.

(10) ▌▎Visual Basic 程序设计教程 ▎▌. 源”图,如图 4-10 所示。杨辉三角形的两侧全部是 1,中间的每个数是其左上方和右上方两 个数之和。 杨辉三角形,又称贾宪三角形、帕斯卡三角形,编程实 现杨辉三角的生成。 分析:从杨辉三角形的特点出发,可以总结出以下特点: (1)第 N 行有 N+1 个值(设起始行为第 0 行); (2)对于第 N 行的第 J 个值(N>=2):当 J=1 或 J=N+1 图 4-10 例 4-7 程序运行界面 时:其值为 1;当 J≠1 且 J≠N+1 时,其值为第 N-1 行第 J-1 个值与第 N-1 行第 J 个值之和。 将这些特点提炼成数学公式可表示为: ①i=1 或 i=N+1,其值为 1,即 a(i,j)=1 ②其他,a(i,j)= a(i-1,j-1)+a(i-1,j) 'a()表示杨辉三角形中的一个数字 程序设计步骤如下: 在新建工程的窗体上添加一个标签 Label1、一个文本框 Text1 和一个命令按钮 Command1。 设置标签 Label1 和命令按钮 Command1 的 Caption 属性值分别为“行数”和“生成” 。 命令按钮 Command1(生成)的 Click 事件代码如下。 Private Sub Command1_Click() Dim N As Integer Dim I As Integer, J As Integer Dim a(10, 10) As Integer '定义一个数组 Form1.Cls N = Val(Text1.Text) '生成杨辉三角,保存于数组中 For I = 1 To N For J = 1 To I If J = 1 Or J = I Then a(I, J) = 1 Else a(I, J) = a(I - 1, J - 1) + a(I - 1, J) End If Next Next '显示杨辉三角 For I = 1 To N For J = 1 To N - I Print " "; Next For J = 1 To I Print a(I, J) & " "; Next Print Next End Sub. 3.多维数组 通常把数组的下标个数多于 3 个以上的数组,称为多维数组。多维数组是在一维和二维概 - 134 -.

(11) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 念上的扩展。多维数组的定义、元素的访问方式与一维和二维数组类似。例如,下面定义的是 2 个多维数组。 ' 3 维数组 ' 4 维数组. Dim a(3,3,4) As Integer Dim b(1 To 10,-4 To 5, 10,20) As Single. 如果将二维数组比作二维表格,那么,三维数组可看作是由多张二维表组成的三维表格。 例如处理一个年级的多个班级的学生成绩时,就要用到一个三维数组。三维数组和多张二维表 格的对应关系,如图 4-11 所示。 Cj(3,3,5). 图 4-11 多张二维表格. 由于数组在内存中占据一片连续的存储空间,多维数组如果每维下标声明太大,可能造成 大量存储空间的浪费,从而影响程序的执行速度。. 4.2. 动态数组. 在定义常规数组时,都给出了数组的下标上界和下界。这样数组定义后,数组的大小也就 确定了,不能再修改。但有时候可能无法事先知道数组到底应该有多大才合适,只有在程序运 行时才能根据运行状况决定数组的大小,这就需要在程序运行时动态改变数组的大小。如输入 某一数据,或某一些操作结束才能确定,这种情况下,使用动态(Dynamic)数组或称可变长 数组来处理就比较方便。 1.动态数组及其声明 动态数组以变量为下标值,在程序运行过程中定义。建立动态数组的方法是:首先使用 Public、Private、Dim 或 Static 语句声明一个没有下标的数组,即括号内为空的数组,然后在 过程中用 ReDim 语句重新定义数组的大小。 ReDim 语句的语法格式如下: ReDim [Preserve] 变量(下标 1,下标 2,……) [ As 数据类型]. 说明: (1)ReDim 语句只能出现在过程中,否则会出现错误。 (2)静态数组中对应数组下标上界和下界的声明必须使用常量,而用 ReDim 语句定义动 态数组时可以使用变量定义下标上界和下界。例如: Dim a() As Integer Dim n As Integer n=3 ReDim a(n) - 135 -.

(12) ▌▎Visual Basic 程序设计教程 ▎▌. (3)在过程中可以多次使用 ReDim 语句改变数组的大小,也可以改变数组的维数,但不 能改变数组的数据类型。例如: Dim a() As Integer ReDim a(3) '定义了一个动态的一维数组 ReDim a(3, 4) As Integer '定义了一个动态的二维数组. 如果要把第 2 条语句写为 ReDim a(3) As Single 就会产生错误,因为改变了数组的数据 类型。 (4)使用 ReDim 语句重新定义数组的大小时,数组中的数据都会丢失,新定义的数组中 的各元素将被赋予一定的初值,如字符串数组初值为空串。如果要在使用 ReDim 语句重新定 义数组的大小时保留数组中的数据,则必须在 ReDim 语句后加 Preserve 关键字。使用了 Preserve 关键字后将不能再改变数组的维数,同时也只能改变最后一维的大小,对于其他的维数不能做 任何修改。例如,如果执行了下列语句: Dim a() As Integer ReDim a(3, 4) 则再执行“ReDim Preserve a(3,6) As Integer”语句是正确的。如果要执行“ReDim Preserve a(3) As Integer”语句则是错误的,因为改变了数组的维数。如果要执行“ReDim Preserve a(2, 6) As Integer”也是错误的,因为只允许改变最后一维的大小,这里改变了第一维的大小。 【例 4-8】运行并分析下面的程序段。 Private Sub Form_Click() Dim a() As Integer, b() As Integer ReDim a(1 To 2) a(1) = 1 a(2) = 2 ReDim b(1 To 2) b(1) = 1 b(2) = 2 ReDim a(1 To 3) Print a(1); a(2); a(3) ReDim Preserve b(1 To 3) Print b(1); b(2); b(3) End Sub. 在程序中,因为经过“ReDim a(1 To 3)”语句重新定义数组 a 大小后,数组 a 中的各元素 都被赋予初值 0。而经过“ReDim Preserve b(1 To 3)”语句重新定义数组 b 大小后,数组 b 中 原来的元素值依然保留,新增加的元素被赋予初值 0。 最后,程序的执行结果为: 000 120. 【例 4-9】随机产生一批两位数的正整数(如 30 个),将其中的奇数和偶数分别存入数组 odd 和 even 中,然后分别以每行 10 个输出数组 odd 和 even。程 图 4-12 例 4-9 程序运行界面 序运行界面如图 4-12 所示。 分析:产生两位数的正整数的公式为 N=Int(Rnd*90+10);判断某数的奇偶性的方法为 N mod 2 的结果是否为 0,若为 0,则是偶数,反之,为奇数。 在新建工程的窗体上设置单击事件,编写代码如下: - 136 -.

(13) ▌▎第 4 章 数组和自定义数据类型 ▎▌ Option Base 1 Private Sub Form_Click() Dim I As Integer, od As Integer, ev As Integer, N As Integer Dim odd() As Integer, even() As Integer For I = 1 To 30 N = Int(Rnd * 90 + 10) '随机产生一个两位数 If N Mod 2 <> 0 Then '判断奇偶性 od = od + 1 ReDim Preserve odd(od) '重新定义动态数组 odd(od) = N Else ev = ev + 1 ReDim Preserve even(ev) even(ev) = N End If Next Print "产生的奇数有" & od & "个:" For I = 1 To od Print odd(I); Spc(2); If I Mod 10 = 0 Then Print Next Print Print "产生的偶数有" & ev & "个:" For I = 1 To ev Print even(I); Spc(2); If I Mod 10 = 0 Then Print Next End Sub. 在新建工程的窗体上设置 Load 事件,编写代码如下: Private Sub Form_Load() Randomize End Sub. 2.数组的清除和重定义 在 VB 中,数组一旦被定义后,便在内存中分配了相应的存储空间。如果想清除静态数组 中的内容或释放动态数组所占用的存储空间,可以使用 Erase 语句。 Erase 语句的使用语法格式如下: Erase 数组名 1,数组名 2,…. 说明: (1)Erase 语句用于静态数组时,将清除数组中各元素的值,并根据数组变量类型的不同 赋给相应的初值。初值的约定和变量相同。如整型数组各元素初值为 0。 (2)Erase 语句用于动态数组时,将释放动态数组所使用的内存。在下次使用该动态数组 前,必须用 ReDim 语句重新定义该动态数组的维数。 (3)Erase 语句可以清除多个数组的内容,数组之间用逗号隔开。 例如,执行以下窗体的单击事件代码,我们可以看到在 Erase 语句之后,数组 a 所有元素 的值都重新初始化为 0。 - 137 -.

(14) ▌▎Visual Basic 程序设计教程 ▎▌ Private Sub Command1_Click() Dim a(1 To 5) As Integer Dim i As Integer Text1 = "" For i = 1 To 5 a(i) = 2 * i + 1 '为数组赋值 Next Text1 = Text1 & "数组值为:" & vbCrLf For i = 1 To 5 Text1 = Text1 & a(i) & Space(2) '输出数组的值 Next Text1 = Text1 & vbCrLf Erase a Text1 = Text1 & "执行 Erase 语句后数组值为:" & vbCrLf For i = 1 To 5 Text1 = Text1 & a(i) & Space(2) '再次输出数组的值 Next End Sub. 图 4-13. 程序的运行结果,如图 4-13 所示。. 4.3. 程序运行结果. 与数组操作有关的几个函数. 1.Array 函数 数组一经定义以后,系统将自动根据数组的数据类型,为数组中的每个元素赋初值,如, 单精度数组中各元素初值为 0。但这种赋值是由系统进行的,用户不能决定初值的大小。为此, VB 提供了 Array 函数来给数组元素赋初值。 Array 函数的语法格式如下: 数组变量名 = Array(数组元素值). 说明: (1)使用 Array 函数给数组赋初值时,数组变量必须是一个变体变量。例如: Dim A As Variant A = Array(10,20,30) B = A(2). '创建一个 Variant 的变量 A '将数组的第二个元素的值赋给另一个变量. (2)数组中每个元素的数据类型可以不同。例如: Dim a As Variant a = Array(111, "abc", 2.22) '数组中的各元素赋予不同类型的初值 Print a(0), a(1), a(2) '打印结果为"111 abc 2.22". (3)Array 函数只适用于一维数组,不能对二维或多维数组初始化。 2.IsArray 函数 使用 IsArray 函数可以判断变量是否为一个数组。其语法格式如下: IsArray(<变量名>). 如果参数<变量名>是数组名,或是引用了数组的变体类型变量名,IsArray 函数返回 True; 否则返回 False。未重定义的动态数组返回的也是 True。如果<变量名>是数组元素,返回 False。 3.Split 函数 Split 函数可从一个字符串中以某个指定符号为分隔符,分离若干个子字符串,建立一个 - 138 -.

(15) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 下标从零开始的一维数组。 Split 函数的使用语法格式如下: Split(<字符串表达式>[, <分隔符>[, <子字符串数量>]]). 说明: <字符串表达式>是一个必选项。包含子字符串和分隔符的字符串表达式。如果<字符串表 达式>是一个长度为零的字符串("") ,Split 则返回一个空数组,即没有元素和数据的数组。 <分隔符>是可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符 (" ")作为分隔符。如果<分隔符>是一个长度为零的字符串,则返回的数组仅包含一个元素, 即完整的<字符串表达式>字符串。 <子字符串数量>是可选的。表示返回的子字符串数,–1 表示返回所有的子字符串。 【例 4-10】设计一个窗体,窗体中添加一个文本框。程序运行后,用户在文本框输入多 个用“,”分隔的整数,按回车键后,将各数据按升序显示在一个对话框中。程序运行界面如 图 4-14 所示。. 图 4-14. 例 4-10 程序运行界面. 分析:文本框的按键事件是 KeyPress(KeyAscii As Integer),KeyAscii 用于判断是否按下了 回车键,判断的标准是 KeyAscii = 13。 在新建工程的窗体上设置文本框的按键事件,编写代码如下: Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then '判断是否按了回车键 Dim i%, j%, p%, n%, m%, t%, msg$ Dim a() As String, b() As Integer a = Split(Text1.Text, ",") '将文本框中输入的文本,以","为分隔符分离子字符串存入数组 a 的各元素中 n = LBound(a) m = UBound(a) '计算数组 a 的上下界 ReDim b(n To m) For i = n To m b(i) = Val(a(i)) '将数组 a 中的数字字符串转化成数字存入数组 b 中 Next For i = n To m - 1 '排序,参见 4.5 节“排序问题”的有关内容 For j = n To m - 1 - i If b(j) > b(j + 1) Then t = b(j): b(j) = b(j + 1): b(j + 1) = t '交换数据 End If Next j Next i For i = n To m msg = msg & b(i) & " " Next i MsgBox msg, , "排序后的数据" - 139 -.

(16) ▌▎Visual Basic 程序设计教程 ▎▌ End If End Sub. 4.UBound 和 LBound 函数 UBound 和 LBound 函数可以求出数组下标的上界和下界。其语法格式为: UBound(数组名[,维数]) LBound(数组名[,维数]). UBound 和 LBound 函数可以求出数组下标某个维数的上界和下界。如果省略了维数,则 默认为求第一维的上界和下界。例如: Dim a(1 To 5, 2 To 6, 5 To 10) As Integer Print LBound(a), UBound(a), LBound(a, 2), UBound(a, 2). 程序运行的结果为:1 5 2 6. 4.4. For Each-Next 语句. For Each … Next 语句是专门用于对数组、集合等数组结构中的每一个元素进行循环操作 的语句,通过它可以列举数组、对象集合中的每一个元素,并且通过执行循环对每一个元素进 行需要的操作。其语法格式为: For Each <成员变量名> In <数组或对象集合名> [<循环体语句>] [<Exit For>] [<循环体语句>] Next [<成员变量名>]. 说明: (1)<成员变量名>必须是一个变体变量。 (2)循环执行的次数取决于数组或对象集合元素的个数,数组或对象集合元素的个数就 是循环执行的次数。 (3)每次执行循环之前,都把数组或对象集合中的一个元素赋给<成员变量名>,第一次 是数组或对象集合中的第一个元素,第二次是第二个,依此类推。 (4)可以使用 Exit For 语句退出循环。 (5)For Each … Next 语句不能用于用户定义数据类型的数组。 在数组操作中有时使用 For Each … Next 语句比用 For 循环遍历数组元素更加方便,因为 它不需要指定循环条件。 【例 4-11】使用 For Each … Next 语句求二维数组的最大值。程序设计界面如图 4-15 所示。 程序运行时单击“生成数组”按钮将产生一个 6 行 7 列的二维数组并显示出来,单击“求最大 值”按钮将求出最大值并显示出来,如图 4-16 所示。. 图 4-15. 程序设计界面. 图 4-16 - 140 -. 例 4-11 程序运行界面.

(17) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 分析:可用一个变量 max 记下最大值,首先设第一个元素值最大,用 max 记下它的值, 通过 For Each … Next 循环用 max 值和数组中的每个元素值比较,如果元素值比 max 大,则 用 max 记下它的值。当数组中的所有元素均比较完毕后,max 中的值就是二维数组的最大值。 程序设计步骤如下: 在新建工程的窗体上添加 2 个标签 Label1~2、3 个命令按钮 Command1~3。设置标签 Label1 控件和 3 个按钮 Command1~3 的 Caption 属性分别为“二维数组如下: ”、“生成数组”、 “求最大值”和“退出”;标签 Label2 控件的 Caption 和 AutoSize 属性值分别为“最大值为:” 和 True。  命令按钮 Command1(生成数组)的 Click 事件代码如下。 Dim arr(5, 6) As Integer '定义一个 6 行 7 列的数组 Private Sub Command1_Click() Dim i%, j% Randomize For i = 0 To 5 For j = 0 To 6 arr(i, j) = Int(Rnd * 90 + 10) Next Next Label1.Caption = "二维数组如下:" For i = 0 To 5 Label1.Caption = Label1.Caption & vbCrLf For j = 0 To 6 Label1.Caption = Label1.Caption & arr(i, j) & Space(2) Next Next End Sub . 命令按钮 Command2(求最大值)的 Click 事件代码如下。. Private Sub Command2_Click() Dim max%, t max = arr(0, 0) For Each t In arr If max < t Then '如果数组中的元素比 max 的值大,则用 max 记下该元素的值 max = t End If Next Label2 = "最大值为:" & max '显示最大值 End Sub. 命令按钮 Command3(退出)的 Click 事件代码如下。 Private Sub Command3_Click() End End Sub. 4.5. 控件数组. 1.基本概念 一组相同类型的相关数据可以使用数组来描述和管理,在 VB 中,一些功能相似的同类控 - 141 -.

(18) ▌▎Visual Basic 程序设计教程 ▎▌. 件也可以使用数组来进行组织管理。这样的数组称为控件数组。 控件数组由一组相同类型的控件组成,这些控件共用一个相同的控件名(即控件数组中 所有控件的 Name 属性相同),控件数组中的每个控件元素都有一个唯一的索引号,即通过 Index 属性加以区分。 控件数组中各元素的引用和普通数组一样,都是通过数组名加下标来实现。控件数组的 数组名就是数组中控件共同的控件名(Name 属性),下标就是每个控件元素唯一的索引号 (Index)属性。例如,Option1(0)引用了控件数组 Option1 中下标为 0 的元素。控件数组的下 标下界不受语句 Option Base 1 的影响,总是从 0 开始。 一个控件数组至少应有一个元素(控件) ,元素数目最大不超过 32767。同一控件数组中 的元素可以有自己的属性设置值。 控件数组中任意一个控件的事件都将触发整个控件数组的事件,不再作为单独控件的事 件处理。也就是说,如果建立了一组单选按钮的控件数组,那么无论单击哪个单选按钮,都将 触发整个控件数组的 Click 事件。为了区分是控件数组中哪个控件产生的事件,Visual Basic 将产生事件控件的索引号传递给控件数组的事件过程。例如,普通单选按钮的 Click 事件过程 如下: Private Sub Command1_Click() …… End Sub. 而一组单选按钮构成的控件数组的 Click 事件过程增加了一个 Index 参数: Private Sub Command1_Click(Index As Integer) …… End Sub. 在这里,通过 Index 参数来判断是哪一个单选按钮触发的 Click 事件。建立控件数组之后, 无论单击哪一个单选按钮,都将触发这个 Click 事件过程。 2.控件数组的建立 建立一个控件数组有以下两种方法。 方法一: (1)在窗体上画出控件数组中第一个控件。 (2)选中该控件,单击“编辑”菜单下的“复制”菜单项(或使用热键 Ctrl+C)。 (3)单击“编辑”菜单下的“粘贴”菜单项(或使 用热键 Ctrl+V),将显示如图 4-17 所示的对话框,询问是 否建立控件数组。单击“是”建立控件数组,在窗体的左 上角将出现一个控件,这就是控件数组的第二个元素。 (4)重复执行“粘贴”动作,建立控件数组中的所 图 4-17 创建控件数组对话框 有元素并放置到适当位置。 方法二: (1)在窗体上画出作为数组元素的各个控件。 (2)把每一个数组元素的 Name 属性设为同一个名称。当对第二个控件输入名称后,同 样会弹出如图 4-17 所示的对话框,询问是否建立控件数组。单击“是”建立控件数组。 控件数组建立后,只要改变某个控件的 Name 属性值,并把 Index 属性设为空,就可以把 该控件从控件数组中删除。 【例 4-12】将例 4-11 中的三个命令按钮组成一个命令按钮组,编程完成其功能。 - 142 -.

(19) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 程序设计步骤如下: ①打开例 4-11 的工程,然后将工程和窗体分别保存到其他文件中,即另存工程和窗体。 ②单击选定命令按钮 Command2(求最大值)和 Command3(退出)。分别将其 Name 属 性修改成 Command1,在出现的 4-17 所示的“创建控件数组”对话框中,单击“是”,即创建 了控件数组 Command1()。 ③双击任意一个命令按钮,打开过程代码编辑窗 口,出现控件数组的单击事件代码编辑窗口,如图 4-18 所示。 ④修改命令按钮组的 Click 事件代码如下: 图 4-18 控件数组的过程编辑窗口 Dim arr(5, 6) As Integer '定义一个 6 行 7 列的数组 Private Sub Command1_Click(Index As Integer) Dim i%, j% Dim max%, t Randomize Select Case Index '判断单击了第几个按钮? Case 0 For i = 0 To 5 For j = 0 To 6 arr(i, j) = Int(Rnd * 90 + 10) Next Next Label1.Caption = "二维数组如下:" For i = 0 To 5 Label1.Caption = Label1.Caption & vbCrLf For j = 0 To 6 Label1.Caption = Label1.Caption & arr(i, j) & Space(2) Next Next Case 1 max = arr(0, 0) For Each t In arr If max < t Then '数组中的元素比 max 的值大,则用 max 记下该元素的值 max = t End If Next Label2 = "最大值为:" & max '显示最大值 Case 1 End End Select End Sub. 【例 4-13】建立含有 4 个命令按钮的控件数组,实现简单算术运算的功能,程序运行效 果如图 4-19 所示。 程序的实现过程如下: ①建立一个新的工程,在窗体上放置 5 个标签 Label1~5,3 个文本框 Text1~3 和 1 个命 令按钮 Command1。 ②单击选择命令按钮,然后用“复制”、 “粘贴”建立控件数组中其他 3 个单选按钮。 - 143 -.

(20) ▌▎Visual Basic 程序设计教程 ▎▌. (a)设计界面. (b)运行效果 图 4-19. 例 4-13 运行界面. ③修改窗体与各控件的相关属性,并做一些位置的调整。 ④双击任意一个单选按钮,打开代码编辑器,在 Click 事件过程中输入如下代码: Private Sub Command1_Click(Index As Integer) Dim a%, s%, m%, d! '分别表示和、差、积和商值 Select Case Index Case 0 Label2 = "+" Label4 = "=" Text3 = Val(Text1) + Val(Text2) Case 1 Label2 = "-" Label4 = "=" Text3 = Val(Text1) - Val(Text2) Case 2 Label2 = "×" Label4 = "=" Text3 = Val(Text1) * Val(Text2) Case Else If Val(Text2) <> 0 Then Label2 = "÷" Label4 = "=" Text3 = Format(Val(Text1) / Val(Text2), "0.00") Else MsgBox "除数不能为 0!" Text2 = "" Text2.SetFocus End If End Select End Sub. ⑤编辑窗体(Form1)的 Load 事件代码如下: Private Sub Form_Load() Label2 = "": Label4 = "" Text1 = "": Text2 = "": Text3 = "" End Sub. 4.6. 综合应用. 1.计数 【例 4-14】用随机函数产生 100 个[0,99]范围内的随机整数,统计个位上的数字分别为 1, 2,3,4,5,6,7,8,9,0 的数的个数并打印出来。 - 144 -.

(21) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 分析:100 个随机整数用数组 a(1 to 100)存放,数组 x(1 to 10)来存放个位上的数字分别为 1,2,3,4,5,6,7,8,9,0 的数的个数。即个位是 1 的个数存放在 x(1)中,个位是 2 的 个数存放在 x(2)中,……个位是 0 的个数存放在 x(10)中。 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer Randomize '产生 100 个[0,99]范围内的随机整数,每行 10 个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.Print Next i '统计个位上的数字分别为 1,2,3,4,5,6,7,8,9,0 的数的个数,并将统计结果保存在数组 x(1),x(2),...,x(10)中,将统计结果打印出来 For i = 1 To 100 p = a(i) Mod 10. ' 求个位上的数字. If p = 0 Then p = 10 x(p) = x(p) + 1 Next i Form1.Print "统计结果如下:" For i = 1 To 10 p=i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub. 程序运行的界面,如图 4-20 所示。 2.累加与极值 图 4-20 例 4-14 运行界面 (1)累加问题 【例 4-15】根据下列公式,求自然对数 e 的近似值,要求:误差小于 0.00001。 e 1. 1 1 1 1      1 1! 2! 3! n!. . 1.  i! i 1. 分析:此类问题实际上可转化为一个累加的过程,即设变量 e=1,然后不断利用公式 1 e  e  进行求和。在求和中还要求出阶乘数 i!。 i! 根据精度要求,本题要求误差小于 0.00001,写出一条满足精度要求后跳出循环的语句: if 1/i!<0.00001 then exit do。 在新建工程的窗体上设置单击事件,编写代码如下: - 145 -.

(22) ▌▎Visual Basic 程序设计教程 ▎▌ Private Sub Form_Click() Dim i%, t!, e! e = 2 'e 公式中前两项的和 i=1 t=1 Do While t > 0.00001 i=i+1 t=t/i e=e +t Loop Print "e="; e Print "Exp(1)="; Exp(1) '与上句输出值进行对比以证明算法的正确性 End Sub. 与此类似的问题有: π 1 1 1 1 求圆周率 π 的值,  1        (1)i 1 n  1, 2,3,   4 3 5 7 2 * n 1 x2 x4 (1)n 1 x 2(n 1) 求余弦值, cos(x)  1    n  1,2,3,    2! 4! (2(n  1))! (2)最大值与最小值问题 【例 4-16】编写一个歌曲大奖赛评分计分系统。根据主持人宣读的每一位评委(8 位)的 打分情况,输入各评委的打分,当输入完每个评委的打分后,去掉其中一个最高分和其中一个 最低分,显示所有评委的打分和其中的最低分、最高分以及选手的最后得分。程序的运行界面, 如图 4-21 所示。. 图 4-21. 例 4-16 运行界面. 分析:设置 8 个文本框组成的控件数组来接收打分,并存入数组。Max 和 Min 分别表示 一个最高分和最低分,求 Max 和 Min 时,分别用比较大小的方法得到。 程序设计方法和步骤如下: 在新建工程的窗体上添加 2 个标签 Label1~2、1 个由 8 个文本框组成的控件数组 Text1 和 3 个命令按钮 Command1~3。设置标签 Label1 和命令按钮 Command1~3 的 Caption 属性 值分别为“请输入各评委的打分:”、“评委亮分” 、“最后得分”和“退出” 。 命令按钮 Command1(评委亮分)的 Click 事件代码如下。 Dim Sum As Integer Private Sub Command1_Click() Dim i% Sum = 0 Randomize For i = 0 To 7 - 146 -.

(23) ▌▎第 4 章 数组和自定义数据类型 ▎▌ Text1(i) = Int(Rnd * 41 + 60) '随机产生评委的打分 Sum = Sum + Text1(i) Next End Sub. 命令按钮 Command2(最后得分)的 Click 事件代码如下。 Private Sub Command2_Click() Dim i%, pj! Max = Text1(0) Min = Text1(0) For i = 1 To 7 If Max < Text1(i) Then Max = Text1(i) '求最大值 If Mix > Text1(i) Then Mix = Text1(i) '求最小值 Next pj = Int(100 * (Sum - Max - Min) / 6 + 0.5) / 100 Label2.Caption = "去掉一个最高分:" & Max & ",去掉一个最低分:" & _ Min & Chr(13) & "最后得分为" & pj End Sub. 命令按钮 Command3(退出)的 Click 事件代码如下。 Private Sub Command3_Click() End End Sub. 3.排序问题 (1)选择排序法 【例 4-17】有数字序列:8、6、9、3、2、7,编写一程序,用选择排序法将数字序列按 从小到大排列。 分析:选择排序法的排序方法和步骤如下: ①从 n 个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置; ②除第一个数外,在剩下的 n-1 个数中再按方法①选出第二个(次)小的数,与第二个数 交换位置; ③以此类推,最后构成递增序列。上述数字序列经过以下几轮即可完成。 第一轮交换后:2、6、9、3、8、7 第二轮交换后:2、3、9、6、8、7 第三轮交换后:2、3、6、9、8、7 第四轮交换后:2、3、6、7、8、9 第五轮无交换:2、3、6、7、8、9 在新建工程的窗体上设置单击事件,编写代码如下: Option Base 1 Private Sub Form_Click() Dim a(6) As Double Dim i As Integer, j As Integer Dim temp As Double Dim m As Integer a(1) = 8 a(2) = 6 a(3) = 9. - 147 -.

(24) ▌▎Visual Basic 程序设计教程 ▎▌ a(4) = 3 a(5) = 2 a(6) = 7 For i = LBound(a) To UBound(a) - 1 '进行数组大小–1 轮比较 m=i '在第 i 轮比较时,假定第 i 个元素为最小值元素 For j = i + 1 To UBound(a) '在剩下的元素中找出最小值元素的下标并记录在 m 中 If a(j) < a(m) Then m = j 'm 记录最小值元素下标 Next j '将最小值元素与第 i 个元素交换 temp = a(i) a(i) = a(m) a(m) = temp Next i For i% = 1 To 6 Print a(i) Next End Sub. (2)冒泡排序法 冒泡法排序(又称为下沉排序法)的思想是:首先进行第一趟冒泡,从数组的第一个元 素开始,每一个元素都和它的下一个元素进行比较,如果小于等于下一个元素则元素位置不动, 如果大于下一个元素则交换两个元素的位置。一直比较到数组的结束,这样最大的元素肯定位 于数组的最后一个元素中。然后进行第二趟冒泡,从数组的第一个元素开始,到倒数第二个元 素结束,继续上述的过程,使数组中次大的数位于数组的倒数第二个元素中。依此类推,当执 行到第 n 趟冒泡时,如果数组的结束位置是第二个元素,则该趟冒泡之后数据就成为一个有序 数组。 例如,假设有 6 个数 8、6、9、3、2、7。其冒泡排序过程如下: ①第一趟冒泡:比较 8 和 6,6 比 8 小,交换两个元素位置;比较 8 和 9,8 比 9 小,两 个元素位置不变;依此类推,第一趟冒泡比较法,冒泡结果为 6、8、3、2、7、9。 ②第二趟冒泡:比较 6 和 8,6 比 8 小,两个元素位置不变;比较 8 和 3,3 比 8 小,交 换元素位置。依此类推,最后第二趟冒泡结果为 6、3、2、7、8、9。 ③第三趟冒泡:比较 6 和 3,3 比 6 小,交换两个元素位置。依此类推,第三趟冒泡结果 为 3、2、6、7、8、9。 ④第四趟冒泡:比较 3 和 2,2 比 3 小,交换两个元素位置。依此类推,第四趟冒泡结果 为 2、3、6、7、8、9。 经过上述过程,原来的数字变为一个有序数列。经过分析我们可以得出:假设数组的长 度为 N,则需要 N-1 趟冒泡才可以使该数组有序。在第 I 趟排序中,需要元素比较 N-I 次才可 以达到冒泡的目的。 采用冒泡排序法时,新建工程窗体的单击事件代码如下: Option Base 1 Private Sub Form_Click() Dim a(6) As Double Dim i As Integer, j As Integer Dim temp As Double Dim m As Integer a(1) = 8 - 148 -.

(25) ▌▎第 4 章 数组和自定义数据类型 ▎▌ a(2) = 6 a(3) = 9 a(4) = 3 a(5) = 2 a(6) = 7 For i = LBound(a) To UBound(a) - 1 '进行 n-1 轮比较 For j = UBound(a) To i + 1 Step -1 '从 n 到 i 个元素两两进行比较 If a(j) < a(j - 1) Then '升序 temp = a(j) a(j) = a(j - 1) a(j - 1) = temp End If Next j '出了内循环,一轮排序结束最值元素冒到最上边 Next i For i% = 1 To 6 Print a(i) Next End Sub. (3)合并法排序 【例 4-18】有数字序列:2、4、6、8、10 和 1、3、5、 7、9、11,编写一程序,将两数字序列合并,合并后的数 字序列按从小到大排列,如图 4-22 所示。 分析:将两个有序数组 A、B 合并成另一个有序的数 图 4-22 例 4-18 运行界面 组 C,以升序排列,其基本思想如下: ①先在 A、B 数组中各取第一个元素进行比较,将小的元素放入 C 数组; ②取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上 述比较过程,直到某个数组被先排完; ③将另一个数组剩余元素填充到 C 数组,合并排序完成。 采用合并排序法时,新建工程窗体的单击事件代码如下: Dim A(), B(), C() Private Sub Form_Click() Dim i As Integer '对 A,B 数组赋初值 A = Array(2, 4, 6, 8, 10) B = Array(1, 3, 5, 7, 9, 11) Label1 = "数组 A:" Label2 = "数组 B:" For i = 0 To UBound(A) Label1 = Label1 & A(i) & Space(2) Next i For i = 0 To UBound(B) Label2 = Label2 & B(i) & Space(2) Next i ReDim C(UBound(A) + UBound(B) + 1) '重定义数组 C 的大小 End Sub. 工程窗体上的命令按钮 Command1(合并)的 Click 事件代码如下: Private Sub Command1_Click() Dim ia As Integer, ib As Integer, ic As Integer Dim i As Integer - 149 -.

(26) ▌▎Visual Basic 程序设计教程 ▎▌ Do While ia <= UBound(A) And ib <= UBound(B) If A(ia) < B(ib) Then C(ic) = A(ia): ia = ia + 1 Else C(ic) = B(ia): ib = ib + 1 End If ic = ic + 1 Loop Do While ia <= UBound(A) 'A 数组剩余元素抄入 C 数组 C(ic) = A(ia): ia = ia + 1: ic = ic + 1 Loop Do While ib <= UBound(B) 'B 数组剩余元素抄入 C 数组 C(ic) = B(ib): ib = ib + 1: ic = ic + 1 Loop Label3 = "合并后数组 C:" For i = 0 To UBound(C) Label3 = Label3 & C(i) & Space(2) If (i + 1) Mod 10 = 0 Then Label3 = Label3 & vbCrLf & Space(14) Next i End Sub. 4.查找、插入和删除 (1)顺序查找法 顺序查找又称为顺序搜索。它一般是指在一个数字序列中查找指定的元素,其基本方法 如下: 从数字序列的第一个元素开始,依次将数字序列中的元素与被查元素进行比较,若相等, 则表示找到(即查找成功);若不相等,则表示没有找到(即查找不成功) 。 【例 4-19】在数字序列 2,4,6,1,3,9,7、5、11 中,查找指定的数,若找到,则显 示该数在数字序列中的位置,若找不到,则显示失败信息。 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim i%, k%, index% b = Array(2, 4, 6, 1, 3, 9, 7, 5, 11) k = Val(InputBox("输入要查找的关键值")) For i = LBound(b) To UBound(b) If k = b(i) Then index = i Exit For ' 找到,结束查找 End If Next i If i > UBound(b) Then MsgBox "要查的数字" & k & "不在数字序列中。" Else Print "输入的数字" & k; "在数字序列中的位置是:" & i + 1 End If End Sub. (2)二分查找法 当数字序列很大时,顺序查找的效率较低,这时可用二分查找法。使用二分查找法的前 提是数字序列必须有序。 在进行二分查找法查找时,首先将数字序列排序,然后将要查找的关键值同数字序列的中 - 150 -.

(27) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 间元素比较,若相同则查找成功结束;否则判别关键值落在数组的哪一部分,然后保留一半, 舍弃另一半。如此重复上述查找,直到查找到或数组中没有这样的元素。二分法查找每进行一 次,就把数据的个数减少一半。 【例 4-20】在数字序列 35、16、78、85、43、29、33、48、66、21、54 中,查找指定的 数,若找到,则显示该数在数字序列中的位置,若找不到,则显示失败信息。 分析:首先利用前面所提供的各种排序法,对数字序列进行升或降排序。然后,再和数 字序列中间的元素值进行比较,以确定值落在序列中上半部分还是下半部分。计算数字序列中 间元素所在下标大小可使用以下公式: Mid=(high+low)\2. '其中 high,low 分别表示数组的上下界值. 二分查找法的查找过程,如图 4-23 所示。. 图 4-23. 二分法查找示意图. 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim a(), Key%, m%, n%, L% '原数字序列是 35, 16, 78, 85, 43, 29, 33, 48, 66, 21, 54 a = Array(16, 21, 29, 33, 35, 43, 48, 54, 66, 78, 85) Key = Val(InputBox("请输入要查找的数")) m = LBound(a) n = UBound(a) 'm 为数组 a 下界值,n 是上界值 Do While True L = (n + m) \ 2 'L 表示中间位置的元素 If Key = a(L) Then '如果找到 Print "找到!数" & Key & "是有序数字序列中的第" & L + 1 & "个。" Exit Do End If If Key > a(L) Then m=L+1 '在序列上半部查找 Else n = L- 1 '在序列下半部查找 End If If m > n Then Print "没有找到" Exit Do End If Loop End Sub - 151 -.

(28) ▌▎Visual Basic 程序设计教程 ▎▌. (3)插入和删除 插入和删除是指在已排好序的数组中插入或删除一个元素,使得插入或删除后数组还是 有序的。其做法是在数组中首先找到要插入的位置或要删除的元素,然后进行插入或删除操作。 【例 4-21】编写程序将数字 10 插入到数字序列 1,3,5,7,9,11,13,17,19 中,插 入后的序列仍然是有序的。 分析:声明 a(1 to n)为一有序数组,在指定位置 k(1<=k<=n-1)处插入一个元素,首先把最 后一个元素往后移动一个位置,再依次把前一个元素向后移,直到把 k 个元素移动完毕;这样 第 k 个元素的位置腾出,就可将数据插入。例如,在有序数组 a 中插入数值 10 的过程,如图 4-24 所示。. 1. 3. 5. 7. 图 4-24. 9. 11. 10. k. 13. 插入元素示意图. 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim a(), i%, k%, L%, H% a = Array(1, 3, 5, 7, 9, 11, 13, 17, 19) L = LBound(a) '计算数组的下界值 H = UBound(a) '计算数组的上界值 Print "插入前的数字序列:" For i = L To H Print a(i); Spc(1); Next Print For k = L To H ' 查找欲插入数 10 在数组中的位置 If 10 < a(k) Then Exit For ' 找到插入的位置下标为 k Next k ReDim Preserve a(H + 1) For i = 8 To k Step -1 ' 从最后元素开始往后移,腾出位置 a(i + 1) = a(i) Next i a(k) = 10 ' 数插入 Print "插入后的数字序列:" For i = 0 To UBound(a) Print a(i); Spc(1); Next End Sub. 程序运行的界面,如图 4-25 所示。. 图 4-25. 例 4-21 运行界面 - 152 -. 17. 19.

(29) ▌▎第 4 章 数组和自定义数据类型 ▎▌. 删除操作首先也是要找到欲删除的元素的位置 k;然后从 k+1 到 n 个位置开始向前移动; 最后将数组元素减 1。例如,要将值为 11 的元素删除的过程,如图 4-26 所示。. 1. 3. 5. 7. 9. 11. 13. 17. 19. k 图 4-26. 删除操作示意图. 请读者参阅上例,完成删除的编程。 5.迭代法 “迭代法”又称为“递推法”(或“辗转法”),其基本思想是:不断用变量的旧值递推出 新值的过程。 “迭代法”是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适 合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组 指令(或这些步骤)时,都从变量的原值推出它的一个新值。 【例 4-22】猴子第一天摘了若干个桃子,当即吃了一半后,又吃了一个。第二天将剩下 的桃子吃掉一半,又多吃一个。以后每天都吃了前一天剩下的桃子的一半零一个。到第十天想 吃的时候,只剩下一个桃子了,求第一天共摘了多少桃子。 分析:这是一个典型的“迭代法”求解问题。先从最后一天推出倒数第二天的桃子,再 从倒数第二天的桃子推出倒数第三天的桃子,依次类推。 设第 n 天的桃子为 x n ,那么它是前一天的桃子数 x n 1 的二分之一减去 1,即: 1 x n  x n 1  1 ,也就是: x n 1  2  (x n  1) 2 已知第 10 天(即 n=10)的桃子数为 1,则第 9 天的桃子数为 4 个,依次类推,可求得第 1 天摘的桃子数。 在新建工程的窗体上设置单击事件,编写代码如下: Private Sub Form_Click() Dim x%, i% Me.Caption = "猴子吃桃问题及解决方案" Form1.Cls Me.Print "第 10 天的桃子为:1 只" x=1 For i = 9 To 1 Step -1 x = 2 * (x + 1) Print "第" & i & "天的桃子数为:" & x & "只" Next i End Sub. 执行程序,程序的运行界面如图 4-27 所示。 6.字符处理 【例 4-23】编写一个英文打字训练的程序,程序运行界面,如图 4-28 所示。 程序编写的要求如下: ①在标签框内随机产生 30 个字母的范文; ②当焦点进入文本框时开始计时,并显示当时的时间; - 153 -.

(30) ▌▎Visual Basic 程序设计教程 ▎▌. 图 4-27. 例 4-22 运行界面. 图 4-28. 例 4-23 运行界面. ③在文本框中按照产生的范文输入相应的字母; ④当输满 30 个字母时结束计时,禁止向文本框输入内容,并显示打字的速度和正确率。 分析:在标签框内随机产生 30 个字母的方法是 a = Chr(Int(Rnd * 26) + 65);打字所用时间 的计算,可使用函数 DateDiff("s", t, Time);当输满 30 个字母时结束计时,禁止向文本框输入 内容,其方法是 Text2.Locked = True。 程序设计方法和步骤如下: 在新建工程的窗体上添加 4 个标签 Label1~4、4 个文本框 Text1~4 和 2 个命令按钮 Command2。设置标签 Label1~4 和命令按钮 Command1~2 的 Caption 属性值分别为“范文” 、 “录 入” 、 “所用时间” 、 “准确率” 、 “生成范文”和“退出”。文本框 Text1 的 Locked 属性值为 True。  命令按钮 Command1(生成范文)的 Click 事件代码如下。 Dim t As Date Private Sub Command1_Click() ' 产生 30 个字母的范文 Dim i%, a$ Randomize Text1 = "" For i = 1 To 30 a = Chr(Int(Rnd * 26) + 65) ' 随机产生大写字母 Text1 = Text1 + a ' 产生的字母放入范文框 Next i End Sub . 命令按钮 Command2(退出)的 Click 事件代码如下。. Private Sub Command2_Click() End End Sub . 文本框 Text2 的 GotFocus 事件代码如下。. Private Sub Text2_GotFocus() t = Time ' 输入文本框获得焦点,开始计时 End Sub . 文本框 Text2 的 KeyPress 事件代码如下。. Private Sub Text2_KeyPress(KeyAscii As Integer) Dim t1%, r%, e% 'r 和 e 分别表示正确和错误的字母数 If Len(Text2) = 30 Then ' 输入满 30 个字符 t1 = DateDiff("s", t, Time) ' 计算所用时间 Text3 = t1 & "秒" ' 显示时间 Text2.Locked = True ' 不允许再修改 For i = 1 To 30 If Mid(Text1, i, 1) = Mid(Text2, i, 1) Then - 154 -.

(31) ▌▎第 4 章 数组和自定义数据类型 ▎▌ r=r+1. '计算正确率. e=e+1 End If Next i r = r / (r + e) * 100 Text4 = r & "%" End If End Sub. '计算错误率. Else. '比较正确率. 习 题 四 一、单选题 1.下面数组声明语句, (. )正确。. A)Dim a[2,4] As Integer C)Dim a(n,n) As Integer 2.要分配存放如下数组的数据,可使用( A)Dim x(9) As Single. B)Dim a(2,4) As Integer D)Dim a(2 4) As Integer )声明语句来实现(不能浪费空间) 。 B)Dim x(3,3) As Single. C)Dim x(-1 to 1, -5 to -3) As Single D)Dim x(-3 to -1, 5 to 7) As Integer 3.能使一维数组 arr(6)元素个数加 1,但保留数组中原有元素的语句是( )。 A)ReDim arr(7) B)ReDim Preserve arr(7) C)Public arr(1 To 7) D)Static arr(7) 4.由 Array 函数建立的数组,其变量必须是( )类型。 A)整型 B)字符串 C)变体 D)双精度 5.若定义一维数组为:Dim a(N To M),则该数组的元素为(. )个。. A)M-N B)M-N+1 C)M*N D)M+N 6.下列语句中(假定变量 n 有值),能正确声明可调数组的是( )。 A)Dim a( ) As Integer B)Dim a( ) As Integer ReDim a(n) C)Dim a( ) As Integer. ReDim a(n) As String D)Dim a( 10) As Integer. ReDim a(3,4) ReDim a(n+10) ReDim Preserv 7.在窗体的通用声明段自定义了数据类型 Students,下列( )定义方式是正确的。 A)Private Type Students B)Type Students Name As String*10 Studno As Integer. Name As String*10 Studno As Integer. End Type C)Type Students. End Students D)Type Students. Name String*10 Studno Integer End Type 8.以下数据定义正确的是( A)dim a as variant. Name As String*10 Studno As Integer End Type ) 。 B)dim a(10) as integer. a=array(1,2,3,4,5). a=array(1,2,3,4,5) - 155 -.

(32) ▌▎Visual Basic 程序设计教程 ▎▌ C)dim a%(10). D)dim a(3),b(3)as integer. a(1)="ABCDE". a(0)=0 a(1)=1 a(2)=2 b=a. 9.下面程序的输出结果是(. ) 。. Option Base 1 Private Sub Command1_Click() Dim a%(3, 3) For i = 1 To 3 For j = 1 To 3 If j > 1 And i > 1 Then a(i, j) = a(a(i - 1, j - 1), a(i, j - 1)) + 1 Else a(i, j) = i * j End If Print a(i, j); Next j Print Next i End Sub A) B) 1 2 3 C) 123. D). 123. 231 123 246 323 123 369 10.以下定义数组或给数组元素赋值的语句中,正确的是( )。 A)Dim a As Variant B)Dim a(10) As Integer. 222 333. a =Array(1,2,3,4,5) C)Dim a%(10). 123. a = Array(1,2,3,4,5) D)Dim a(3),b(3) As Integer. a(1) = "ABCDE". a(0) = 0 a(1) = 1 a(2) = 2 b=a. 11.设有如下的自定义数据类型 Type Student number As String name As String age As Integer End Type 则正确引用该自定义数据类型变量的代码是( A)Student.name ="张红" C)Dim s As Type Student s.name ="张红". ) 。 B)Dim s As Student s.name ="张红" D)Dim s As Type s.name ="张红". 12.在窗体上画一个命令按钮(其 Name 属性为 Command1) ,然后编写如下代码: Option Base 1 Private Sub Command1_Click() Dim a - 156 -.

(33) ▌▎第 4 章 数组和自定义数据类型 ▎▌ s=0 a=Array(1,2,3,4) j=1 For i=4 To 1 Step -1 s=s+a(i)*j j=j*10 Next i Print s End Sub 运行上面的程序,单击命令按钮,其输出结果是(. ) 。. A)4321 B)1234 C)34 D)12 13.在窗体上画一个名称为 Command1 的命令按钮,然后编写如下事件过程: Option Base 1 Private Sub Command1_Click() Dim a a = Array(1, 2, 3, 4, 5) For i = 1 To UBound(A) a(i) = a(i) + i – 1 Next Print a(3) End Sub 程序运行后,单击命令按钮,则在窗体上显示的内容是( ) 。 A)4 B)5 C)6 D)7 14.窗体上画一个命令按钮,其名称为 Command1,然后编写如下事件过程: Private Sub Command1_Click() Dim M(10), N(10) I=3 For T = 1 To 5 M(T) = T N(I) = 2 * I + T Next T Print N(I); M(I) End Sub 窗体运行后,单击命令按钮,输出结果为( )。 A)3 11 B)3 15 C)11 3 D)15 3 15.有以下程序: Option Base 1 Dim arr() As Integer Private Sub Form_Click() Dim i As Integer, j As Integer ReDim arr(3, 2) For i=1 To 3 For j=1 To 2 arr(i,j)=i*2+j Next j Next i ReDim Preserve arr(3,4) For j=3 To 4. - 157 -.

(34) ▌▎Visual Basic 程序设计教程 ▎▌ arr(3,j)=j+9 Next j Print arr(3,2);arr(3,4) End Sub 程序运行后,单击窗体,输出结果为( )。 A)8 13 B)0 13 C)7 12 D)0 16.在窗体上画一个命令按钮,名称为 Command1,然后编写如下代码: Option Base 0 Private Sub Command1_Click() Dim A(4) As Integer, B(4) As Integer For k=0 To 2 A(k+1)=InputBox("请输入一个整数") B(3-k)=A(k+1) Next k Print B(k) End Sub 程序运行后,单击命令按钮,在输入对话框中分别输入 2、4、6,输出结果为( A)0 B)2 C)3 D)4 17.在窗体上画一个命令按钮,然后编写如下事件过程: Private Sub Command1_click() Dim a(5)as String For i = 1 to 5 a(i)=Chr (Asc("A")+(i-1)) Next i For Each b in a Print b; Next End Sub 程序运行后,单击命令按钮,输出结果是( A)ABCDE B)1 2 3 4 5. )。 C)a b c d e. 0. )。. D)出错信息. 18.下面叙述中不正确的是( )。 A)自定义类型只能在窗体模块的通用声明段进行声明 B)自定义类型中的元素类型可以是系统提供的基本数据类型或已声明的自定义类型 C)在窗体模块中定义自定义类型时必须使用 Private 关键字 D)自定义类型必须在窗体模块或标准模块的通用声明段进行声明 19.在设定 Option Base 0 后,经 Dim arr(3,4) As Integer 定义的数组 arr 含有的元素个数为( A)12 B)20 C)16 D)9 20.在窗体上画一个名称为 Label1 的标签,然后编写如下事件过程: Private Sub Form_Click() Dim arr(10, 10) As Integer Dim i As Integer, j As Integer For i = 2 To 4 For j = 2 To 4 arr(i, j) = i * j Next j Next i Label1.Caption = Str(arr(2, 2) + arr(3, 3)) End Sub - 158 -. )。.

(35) ▌▎第 4 章 数组和自定义数据类型 ▎▌ 程序运行后,单击窗体,在标签中显示的内容是( ) 。 A)12 B)13 C)14 D)15 21.设有如下程序,其功能是用 Array 函数建立一个含有 8 个元素的数组,然后查找并输出该数组中的 最小值,请选择程序中空白处应为( ) 。 Option Base 1 Private Sub Command1_Click() Dim arr1 Dim Min As Integer, i As Integer arr1 = Array(12, 435, 76, -24, 78, 54, 866, 43) Min = _____ For i = 2 To 8 If arr1(i) < Min Then Min=arr1(i) Next i Print "最小值是:"; Min End Sub A)-24 B)886 C)arr1(1) D)arr1(0) 22.以下有关数组定义的语句序列中,错误的是( ) 。 A) Static arr1(3) B) Dim arr2() As Integer Arr1(1)=100 Arr1(2)="Hello" Arr1(3)=123.45. Dim size As Integer Private Sub Command2_Click() size=InputBox("输入:") ReDim arr2(size). C) Option Base 1 Private Sub Command3_Click(). ...... End Sub D) Dim n As Integer Private Sub Command4_Click(). Dim arr3() As Integer Dim arr4(n) As Integer ...... ...... End Sub End Sub 23.在窗体上画一个名称为 Command1 的命令按钮,然后编写如下程序: Option Base 1 Private Sub Command1_Click() Dim c As Integer,d As Integer d=0 c=6 x=Array(2,4,6,8,10,12) For i=1 To 6 If x(i)>c Then d=d+x(i) Else d=d-c End If Next i Print d End Sub 程序运行后,如果单击命令按钮,则在窗体上输出的内容为( A)10. B)16. C)12. - 159 -. ) 。 D)20.

(36) ▌▎Visual Basic 程序设计教程 ▎▌ 24.阅读程序: Option Base 1 Dim arr() As Integer Private Sub Form_Click() Dim i As Integer, j As Integer ReDim arr(3, 2) For i = 1 To 3 For j = 1 To 2 arr(i, j) = i * 2 + j Next j Next i ReDim Preserve arr(3, 4) For j = 3 To 4 arr(3, j) = j + 9 Next j Print arr(3, 2) + arr(3, 4) End Sub 程序运行后,单击窗体,输出结果为( A)21 B)13 25.以下程序的输出结果是( )。. )。 C)8. D)25. Option Base 1 Private Sub Command1_Click( ) Dim a , b(3 ,3) A=Array(1,2,3,4,5,6,7,8,9) For i=1 To 3 For j=1 To 3 b(i ,j)=a(i*j) if (j>=i) Then Print Tab(j*3) ; Format(b(i , j) , ”# # #”) ; Next j Next i End Sub A) 1 2 3 B) 1 C) 1 4 7. D). 1 2 3. 4 5 6 4 5 2 4 6 4 6 7 8 9 7 8 9 3 6 9 9 26.在窗体上画 4 个文本框,并用这 4 个文本框建立一个控件数组,名称为 Text1(下标从 0 开始,自左 至右顺序增大) ,然后编写如下事件过程: Private Sub Command1_Click() For Each TextBox In Text1 Text1(i)= Text1(i).Index i=i+1 Next End Sub 程序运行后,单击命令按钮,4 个文本框中显示的内容分别( A)0123 B)1234 C)0132 27.若在某窗体模块中有如下事件过程 Private Sub Commandl_Click(Index As Integer) …… End Sub - 160 -. )。 D)出错信息.

(37) ▌▎第 4 章 数组和自定义数据类型 ▎▌ 则以下叙述中正确的是( )。 A)此事件过程与不带参数的事件过程没有区别 B)有 1 个名称为 Command1 的窗体,单击此窗体则执行此事件过程 C)有 1 个名称为 Command1 的控件数组,数组中有多个不同类型控件 D)有 1 个名称为 Command1 的控件数组,数组中有多个相同类型控件 28.如下程序段中包含一个错误。 x=4 Dim a(x) For m = 4 To 0 Step -1 a(m) = m + 1 Next m 出错的原因是( )。 A)第四行,数组元素 a(m)下标越界. B)第四行,不能用循环变量 m 进行运算. C)第二行,不能用变量定义数组下标 D)以上原因都不对 29.在窗体上画一个命令按钮,然后编写如下事件过程: Private Sub Command1_Click() Dim a5.As String For i = 1 To 5 a(i)= Chr(Asc("A")+ (i - 1)) Next i For Each b In a Print b; Next End Sub 程序运行后,单击命令按钮,输出结果是( A)ABCDE B)1 2 3 4 5. )。 C)abcde. D)出错信息. 30.设有命令按钮 Command1 的单击事件过程,代码如下: Option Base 1 Private Sub Command1_Click() Dim a(30) As Integer For i=1 To 30 a(i)=Int(Rnd*100) Next For Each arrItem In a If arrItem Mod 7=0 Then Print arrItem; If arrItem>90 Then Exit For Next End Sub 对于该事件过程,以下叙述中错误的是( ) 。 A)a 数组中的数据是 30 个 100 以内的整数 B)语句 For Each arrItem In a 有语法错误 C)If arrItem Mod 7=0……语句的功能是输出数组中能够被 7 整除的数 D)If arrItem>90……语句的作用是当数组元素的值大于 90 时退出 For 循环. 二、填空题 1.随机产生 6 位学生的分数(分数范围 0~100) ,存放数组 a 中,每 2 分用一个“*”显示,如下图所示。. - 161 -.

(38) ▌▎Visual Basic 程序设计教程 ▎▌. Private Sub form_Click() Dim a%(1 To 6) For i = 1 To 6 a(i) = 【1】 Print 【2】 Next i End Sub 2.输出大小可变的正方形图案,如右图所示,最外圈是第一层,要求每层上用的数字与层数相同。 Option Base 1 Private Sub Form_Click() Dim a() n = InputBox("输入 n") ReDim a(n, n) For i = 1 To (n + 1) / 2 For j = i To n - i + 1 For k = i To n - i + 1 【3】 Next k Next j Next i For i = 1 To n For j = 1 To n 【4】 Next j 【5】 Next i End Sub 3.设有如下程序: Option Base 1 Private Sub Command1_Click() Dim arr1 Dim Min As Integer,i As Integer arr1=Array(12,435,76,-24,78,54,866,43) Min= 【6】 For i=2 To 8 If arr1(i)<Min Then 【7】 Next i Print "最小值是:";Min End Sub 以上程序的功能是:用 Array 函数建立一个含有 8 个元素的数组,然后查找并输出该数组中各元素的最 小值。请填空。 4.冒泡排序程序如下,请填空。 Private Sub Form_Click() Dim a, i%, n%, j% - 162 -.

(39) ▌▎第 4 章 数组和自定义数据类型 ▎▌ a = Array(1, 5, 6, 4, 13, 23, 26, 31, 51) n = UBound(A) For i = 0 To n - 1 For j = 0 To n - 1 - i If a(j) > a(j + 1) Then 【8】 【9】 a(j + 1) = t End If Next j Next i For i = 0 To UBound(A) Print a(i) Next i End Sub 5.在窗体上画一个名称为 Command1 的命令按钮,然后编写如下事件过程: Private Sub Command1_Click() Dim a As String a = "123456789" For i = 1 To 5 Print Space(6 - i); Mid$(a, 【10】 , 2 * i - 1) Next i End Sub 程序运行后,单击命令按钮,窗体上的输出结果是: 5 456 34567 2345678 123456789 请填空。 6.以下程序段产生 100 个 1~4 之间的随机整数,并进行统计。数组元素 S(i)(i=1,2,3,4)的值表示等于 i 的随机数的个数,要求输出如下格式: S(1)=… S(2)=… S(3)=… S(4)=… 将程序补充完整。 Dim S(4) As Integer Randomize For I=1 To 100 X=Int(Rnd * 4+1) S(X)=S(X)+1 Next I For I=1 To 4 【11】 Next I 7.以下程序代码将任意一组数存入数组,从键盘接收一数据,将其插入数组中,插入的位置也从键盘接收。. - 163 -.

(40) ▌▎Visual Basic 程序设计教程 ▎▌ Dim A( ) Private Sub Form_Click( ) N=InputBox("数据个数:") N=N+1 【12】 For I=1To N-1 A(I)=Val(InputBox("原数据:")) Next I D=Val(InputBox("插入的数据:")) P=Val(InputBox("插入的位置:")) Do While P>N Or P<1 MsgBox"位置越界!" P=Val(InputBox("插入的位置:")) Loop For I=N To P+1 Step -1 A(I)=A(I-1) Next I A(P)=D For I=1 To N Text1.Text=Text1.Text & Str(A(I))&"" Next I End Sub 8.设在窗体上有一个文本框 Text1,一个标签数组 Label1,共有 10 个标签,以下程序代码实现在单击任 一个标签时将标签的内容添加到文本框现有内容之后。 Private Sub Label1_Click(Index As Integer) Text1.Text= 【13】 End Sub 9.在窗体上画两个标题分别为“初始化”和“求和”的命令按钮 Command1~2。程序运行后,如果单 击“初始化”按钮,则对数组 a 的各元素赋值;如果单击“求和”按钮,则求出数组 a 的各元素之和,并在 文本框中显示出来,如右图所示。 Option Base 1 Dim a(3, 2) As Integer Private Sub Command1_Click() For i = 1 To 3 For j = 1 To 2 【14】 = i + j Next Next End Sub Private Sub Command2_Click() For i = 1 To 3 For j = 1 To 2 s = s + 【15】 Next Next Text1.Text = 【16】 End Sub. - 164 -.

(41)

參考文獻

相關文件

学校现有教学仪器设备超过1亿元,学校图书馆纸质藏书125万册,电子图书

通常把这种过去时期的,具有滞后作用的变量 叫做 滞后变量(Lagged Variable) ,含有滞后变量

如圖 4-22 IBM Via Voice 語音辨識軟體與 Visual Basic 機器人程式只是一個互 助的關係,Visual Basic 無法控制 Via Voice,Via Voice

Visual 的中文意思是「視覺化」,顧名思義,Visual basic 是一套視覺化的程 式開發工具。在設計程式的過程中,對於使用者的介面,設計師可以用直覺化

李胜宏 第44届IMO中国队领队、浙江大学教授、博士生导师 李伟固 国家集训队教练、北京大学教授、博士生导师 刘鸿坤 第31、32届IMO中国队副领队、华东师范大学教授 刘诗雄

微积分的创立是数学发展中的里程碑, 它的发展 和广泛应用开启了向近代数学过渡的新时期, 为研究 变量和函数提供了重要的方法和手段. 运动物体的瞬

本章我们又一次经历了用函数研究变化规律的过程 ,用反比例函数刻画具 有反比例关系的两个变量之间的对应关系 :在变量y 随变量x 的变化而变化的

11.了解傅里叶级数的概念和狄利克雷收敛定理,会将 定义在 上的函数展开为傅里叶级数, 会 将定义在