《第六章【数组】课后复习材料_计算机-C++资料.pdf》由会员分享,可在线阅读,更多相关《第六章【数组】课后复习材料_计算机-C++资料.pdf(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学习必备 欢迎下载 第六章 数 组【学习目的和要求】1 掌握静态数组的定义和程序设计方法 2 掌握动态数组的定义和程序设计方法 3 熟悉控件数组的创建和使用 4 掌握数组常用算法的程序设计【学习要点】一何时需要使用数组?在程序设计过程中,如果需要对一组同类型的很多数据进行处理时,就必须使用数组进行程序设计。比如求某班级 80 个学生某门课成绩的平均分,再统计所有高于平均分成绩的学生人数。如果不用数组,通过简单变量,要么定义 80 个变量来保存学生的成绩,光赋值语句就得写 80 行,要么采用循环程序设计,定义一个变量,通过 80 次循环来接收每个学生的成绩,并计算平均分。程序段如下:Dim cj
2、 As Integer,sum As Integer,ave As Single Dim i As Integer For i=1 To 80 cj=InputBox(请输入第&i&个学生的成绩)sum=sum+cj 求总分 Next i ave=sum/80 求平均分 问题是:当求出平均分后,还需要统计成绩高于平均分的学生人数,而变量 cj 只能存放一个值,在本循环结束后,cj 中存放的是最后一个学生的成绩,它无法同时保存 80 个学生的成绩,只能再编写程序重新输入 80 个学生的成绩,依次与平均分进行比较,程序段如下:For i=1 To 80 cj=InputBox(请输入第&i&个学生
3、的成绩)If cj ave Then n=n+1 统计成绩高于平均分的人数 Next i Print 成绩高于平均分的人数有&n&个 这样处理会带来 2 个问题:1 数据的输入量变为原来的 2 倍 2 数据量很大,在第二次输入过程中很可能出现与第一次不一致的情况,造成数据统学习必备 欢迎下载 计的错误。在类似的问题上,如果采用数组处理就可以有效解决上述问题。数组在形式上可以看成为一组同类型的数据集合,每个数组元素拥有相同的名称,但根据其在数组中的位置分配一个唯一标识的序号,如本例中,可以定义一个数组 cj(80)来表示成绩,数组名为 cj,cj(1)表示第 1 个学生的成绩,cj(2)表示第
4、2 个学生的成绩,这样只要一次输入,就可以有效解决上面的问题。二数组的形式 1一维数组 在上例中,只要用一个下标就可以标识一个数组元素,这样的数组称为一维数组。比如定义一个一维数组 a(10),表示数组名为 a,数组中有 11 个元素(注意:VB 中数组的下标默认为从 0 开始),分别是 a(0)、a(1)、a(2)、a(10)。2二维数组 从形式上看,可以把一维数组看成是一个数列,适合于类型相同的一组数据的处理,但有的时候用一维数组处理就不能满足要求了。比如处理一个班 50 个人 4 门课的成绩,将其按总分从高到低的顺序进行排序。很显然,这是一张二维表,每个人的 4 门课成绩构成表中的一行,
5、要表示其中每个人的成绩,都需要指定行和列两个下标才能唯一的确定,这时就需要定义一个二维数组。如定义一个数组 cj(50,4),用 cj(1,1)表示第一个人的第一门课成绩,cj(2,3)表示第二个人的第三门课成绩。象这样,需要两个下标才能确定一个数组元素在数组中的位置,这样的数组称为二维数组。从形式上看,二维数组就是一张二维表格。比如定义一个二维数组 a(1 To 3,1 To 4),共有 12 个元素,分成 3 行 4 列,其中每个元素的分布如下表 5-1所示:表 5-1 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(3,1)a(3,2)
6、a(3,3)a(3,4)3多维数组 如果数组中的每个元素需要 2 个或 2 个以上的下标才可以标识,这样的数组统称为多维数组。比如三维数组 a(3,4,2)中的每个元素都需要 3 个下标才能够唯一的确定。以后我们进行程序设计时,定义的数组一般不会超过三维,所以应重点掌握一维和二维数组的使用。三数组的定义 程序中用到的变量,可以不定义就使用,如果没有定义,系统会自动定义其类型为变体型。但数组不可以直接使用,所有的数组只有先定义才可以使用。VB 提供了两类数组可以定义。计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进
7、行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 1 固定大小的数组定义 如果在程序设计时可以确定其大小和维数,这样的数组称为固定大小数组。比如:Dim
8、a(20)As Integer,表示定义一个固定大小的数组 a,有 21 个元素,下标从 0到 20。固定大小的数组一经定义,以后在程序中就不能再改变其大小和维数。例 6-1 以下定义数组的语句错误的是_。A Dim a(-3 to 5)As Integer B Dim a(1 to 6.7)As Single C Dim a(n)As Integer D Dim a(-2 to 3,2*3)As Integer 分析:选项 A 中定义一个整型的一维数组,分别为 a(-3)、a(-2)、a(5),共 9 个元素;在 VB 中如果数组下标不是整数,系统会自动四舍五入取整,所以选项 B 等价于 D
9、im a(1 To 7)As Integer;选项 D 表示定义一个整型的二维数组,其中第一维的下标从-2到 3,第二维的下标从 0 到 6,一共有 6*7=42 个元素;选项 C 是错误的,因为 VB 不允许用变量来定义数组,如果不能确定数组大小,定义时数组名后的()中也不能是变量,必须将其定义成动态数组:Dim a()As Integer,数组名后的()中不写任何内容。考虑以下定义数组的语句是否正确?1)Const n As Integer=6 Dim a(n)As Integer 2)Dim a(n)As Integer Const n As Integer=6 3)Dim a(5 To
10、-3)As Integer 分析:定义 1 是正确的,这时 n 是符号常量,相当于常量 6,所以 Dim a(n)As Integer等价于 Dim a(6)As Integer;定义 2 是错误的,因为在执行 Dim a(n)As Integer 之前并没有定义符号常量 n,VB 不允许用变量定义数组;定义 3 是错误的,因为定义数组时不允许其下界高于上界。2 动态数组定义 如果在程序设计时不能确定数组的大小和维数,就必须定义动态数组。动态数组的大小和维数可以在程序运行时根据需要改变。动态数组的定义和固定大小数组不同,它一般分两个步骤进行:1)用数组名加()来定义动态数组 比如需要定义一个整
11、型的动态数组 b,只能按以下格式定义:Dim b()As Integer 表示 b 是一个数组,但数组的大小和维数都不确定,以后在程序运行时可根据需要定义。计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学
12、生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 注意:只能用数组名后加()来定义,不能写成 b(n)或 b(m,n)或 b(,)等形式。2)用 Redim 重新定义动态数组大小 动态数组只有用 Redim 重新定义后才可以使用。比如上面定义的数组 b,如果在程序运行时需要定义其为 10 个元素的一维数组,则可以执行语句 Redim b(1 to 10),若需要定义其为 3 行 4 列的二维数组,则可以执行语句 Redim b(1 to 3,1 to 4)。一旦用
13、 Redim 重定义动态数组后,该数组就可以象固定大小数组一样地使用。3 Option Base 1 数组默认的下标下界是 0,如果希望定义数组的下标从 1 开始,可以在模块的通用声明段中用 Option Base 1 说明。注意:1)Option Base 后面只可以是 0 或 1,不能是其他数字。比如不能通过 Option Base 2 让数组的下标从 2 开始。2)Option Base 语句只可以出现在模块的通用声明段,不可以出现在过程中。四数组的使用 1数组元素的引用 数组定义后,可以通过下标来引用数组的每个元素。和数组的定义不同,引用数组元素时下标可以是变量、常量或表达式。例 6-
14、2 以下引用数组元素的语句中正确的是_。ADim a(2,3)As Integer a(1)=10 BDim a(3 To 6)As Single a(1)=1 Ca(n+3)=a(n-1)+a(n)DDim a(5)As Single a=1 分析:选项 A 中定义一个 3 行 4 列的二维数组(注意:每一维的下标下界默认为 0),每个数组元素必须用两个下标表示,比如,第一个元素应该为 a(0,0),第 2 行第 2 列的元素应该为a(1,1)。不允许通过 a(1)企图引用二维数组中的某个元素,所以选项 A 是错误的;选项 B 中定义一个单精度型一维数组,规定下标的范围从 3 到 6,不存在
15、下标为 1 的元素,所以引用a(1)会出现“下标越界”的错误;选项 D 中定义一个一维数组,数组名为 a,拥有 6 个元素,分别是 a(0)到 a(5),对数组赋值只能分别对每个元素赋值,而不能通过给 a 赋值来达到给所有数组元素赋值的目的,程序中并不存在名称为 a 的变量,所以选项 D 是错误的;由于引计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请
16、输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 用数组元素时允许下标是变量和表达式,所以选项 C 的含义是计算 a(n-1)+a(n)的值,并将其赋给数组元素 a(n+3),比如,当 n 为 2 时,该语句的功能是计算 a(1)+a(2)的值,并将其赋给数组元素 a(5),很显然,选项 C 是正确的。归纳一下:1)
17、引用数组元素时要注意,下标不能越界,即数组元素的下标不允许比定义数组时的上界大,也不允许比下界小。2)一维数组元素用 1 个下标引用,二维数组元素必须用 2 个下标引用,依次类推。3)引用数组元素时,下标可以是变量和表达式。4)对数组元素操作时,不可以直接引用数组名,只可以引用单个数组元素。2数组的相关函数 数组的相关函数只需要掌握以下三个:1)LBound:获得数组某一维下标的下界 格式:LBound(数组名)或 LBound(数组名,维数)比如 Lbound(a)表示返回数组 a 第一维下标的下界;Lbound(a,2)表示返回数组 a 第二维下标的下界。2)UBound:获得数组某一维下
18、标的上界 格式:UBound(数组名)或 UBound(数组名,维数)例 6-3 执行以下程序段,输出结果是_。Dim a(-3 To 5)As Single Dim b(3,4)As Integer Print UBound(a),UBound(b,1)Print LBound(a),LBound(b,2)分析:根据 UBound 和 LBound 函数的功能可以知道,第一行的输出结果是 5 3,第二行的输出结果是-3 0。3)Array 函数 利用 Array 函数可以将一个变体型变量创建成一维数组,同时实现数组元素的赋值。例 6-4 执行以下程序段,第一行输出结果是_,第二行输出结果是_
19、。Private Sub Form_Click()Dim a Dim i As Integer a=Array(1,2,3,4,5,6,7,8,9)For i=0 To 3 计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序
20、段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 Print a(5-i);Next Print a=Array(abc,123,def)Print a(1)End Sub 分析:根据 Array 函数的功能,赋值语句 a=Array(1,2,3,4,5,6,7,8,9)将变体型变量 a 创建成一个整型的一维数组,有 9 个元素,下标从 0 到 8(注意:默认下标的下界为 0),其中 a(0)的值为 1,a(1)的值为 2,a(8)的值为 9。F
21、or 循环的功能是分别输出 a(5)、a(4)、a(3)、a(2)的值,所以第一行输出结果为 6 5 4 3;执行赋值语句 a=Array(abc,123,def)后,a 被创建成一个字符串型的一维数组,有 3 个元素,下标从 0 到 2,a(1)的值为123,所以第二行输出结果为 123。例 6-5 执行以下程序段,输出结果是_。Private Sub Form_Click()Dim a(9)As Variant Dim i As Integer a=Array(1,2,3,4,5,6,7,8,9)Print a(2)End Sub 分析:由于 Array 函数只能给变体型简单变量或变体型动
22、态数组赋值,虽然程序中定义的 a(9)是变体型数组,却是固定大小的数组,所以上述程序运行时会出错。考虑一下:如果将上述程序改成以下程序段,输出结果是多少?Dim a()As Variant Dim i As Integer a=Array(1,2,3,4,5,6,7,8,9)Print a(2)注意:Array 函数只能生成一维数组,不能生成多维数组;Array 函数只能给变体型变量和变体型动态数组赋值,赋值时有多少个数值,生成的一维数组就有多少个元素,数组的类型由数值的类型决定。3数组相关语句 对于数组的相关语句,只需要大家掌握 Erase 语句的功能。例 6-6 执行以下程序段,输出结果是
23、_。计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致
24、的情况造成学习必备 欢迎下载 Option Base 1 Private Sub Command1_Click()Dim a,b(5)As Integer a=Array(1,2,3,4,5)b(2)=a(a(1)+2)Print a(2),b(2)Erase a,b Print b(2)Print a(2)End Sub 分析:程序中定义变量 a 为变体型变量,b 为一维数组,有 5 个元素,下标从 1 到 5。执行语句 a=Array(1,2,3,4,5)后将 a 创建成一维数组,有 5 个元素,值分别为 1、2、3、4、5;因为 a(1)值为 1,所以语句 b(2)=a(a(1)+2)等
25、价于将 a(3)的值赋给 b(2),第一行的输出结果为 2 3。注意:Erase 语句对动态数组和固定大小数组有不同的功能。若 a 是动态数组,执行语句 Erase a 的功能是释放动态数组 a 的空间,此时 a 没有任何元素,在内存中也没有空间分配,除非用 Redim 重新定义,否则该数组不可访问;若 a 是固定大小数组,执行语句 Erase a 的功能是将原来数组的值全部清空,但数组空间仍存在。由于 a 是 Array 函数创建的动态数组,b 是固定大小数组,程序中执行 Erase a,b 后,数组 a 的空间将被撤消,数组 b 的每个元素值将恢复初始值 0,所以运行上述程序后,第二行的结
26、果为 0,但执行到 Print a(2)语句时程序会出现“下标越界”错,因为此时已经不存在数组元素 a(2)。五数组的输入输出操作 数组由于其构成和存储的特殊性,非常适合用循环程序来实现其各种操作。1一维数组的输入输出 例 6-7 定义一个包含 20 个元素的整型数组,让用户输入每一个值,并在窗体上打印输出。分析:假设数组名为 a,数组元素下标从 1 变化到 20,即 a(1)到 a(20),每一个数组元素都执行统一的输入和输出操作,同样的操作要执行 20 次,很显然用循环处理更方便。设一个循环控制变量,假设为 i,每个数组元素可用 a(i)来表示,i 的值从 1 变化到 20,在循环体中对每
27、一个 a(i)执行相关操作。程序如下:Private Sub Form_Click()计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来
28、个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 Dim i As Integer,a(1 To 20)As Integer For i=1 To 20 Rem 从键盘输入 a(i)的值,i 的值从 1 变化到 20,即输入 a(1)一直到 a(20)的值 a(i)=InputBox(请输入 a(&i&)的值)Next i Rem 输出 a(1)到 a(20)的值 For i=1 To 20 步长缺省,默认为 1 Print a(i);Next i Next 语句完成给循环变量 i 增加步长的操作,即 i=i+1 End Sub 不
29、难发现,输入和输出都是 20 次循环,还可将以上程序简化为:Dim i As Integer,a(1 To 20)As Integer For i=1 To 20 a(i)=InputBox(请输入 a(&i&)的值)Print a(i);Next i 这样利用一次循环就可以同时实现输入和输出操作。当然,以上程序段用 Do-loop 语句也可实现。程序段如下:Dim i As Integer,a(1 To 20)As Integer i=1 Do While i Sqr(n)Then n 是素数 将计数器加 1,动态数组大小增加一个,并给新增加元素赋值 k=k+1 ReDim Preserve
30、 a(k)a(k)=n End If Next n 输出数组元素 For i=1 To UBound(a)Print a(i);If i Mod 5=0 Then Print Next i 归纳一下:当在程序设计中不能直接确定数组大小时,就可以采用上述的方法来实现,即将动态数组的重定义与计数器配合起来使用,这是通常的做法。七控件数组 1控件数组元素的访问 如果程序界面上有很多同类型的控件,并且他们需要执行相同或相似的操作,就可以考虑使用控件数组。控件数组中,每个元素都是指定类型的控件,其所有的属性、方法和事件都和简单控件一样,但这时访问控件的标识符以及响应事件的过程框架会有区别,具体表现为:1
31、)简单控件和控件数组元素的访问名称 比如,在窗体上有 3 个文本框控件,如果是简单控件,其名称可能是 Text1、Text2 和Text3,但如果是控件数组,则它们的名称必须相同(相当于数组名),每个控件数组元素必须通过数组名(下标)的方式来访问。假设将 3 个文本框的名称都设置为 Text1,则 3 个文计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下
32、请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 本框将分别是 Text1(0)、Text1(1)和 Text1(2),其中元素的下标可以在属性窗口中设置其 Index属性。注意:普通控件也有 Index 属性,但值为空,不能设置任何数值;控件数组元素的 Index属性代表其下标,值为大于等于 0 的数值。2)属性
33、和方法的使用 虽然控件数组的每个元素和简单控件具有相同的属性和方法,要注意引用属性和方法时,所有控件数组元素必须带下标。比如普通的文本框控件 Text1,引用其 Text 属性可以用 Text1.Text,执行设置焦点的方法可以用语句 Text1.Setfocus 实现;而对于文本框控件数组元素 Text1(0),则必须用 Text1(0).Text 和 Text1(0).Setfocus 实现。3)事件过程的框架 对于一个控件数组来讲,数组中的每个元素都响应同一个事件过程,但其事件过程框架会比简单控件对应的事件过程多一个参数 Index。比如一个名称为 Text2 的文本框的 Change
34、事件过程框架为:Private Sub Text2_Change()End Sub 对于上面的文本框控件数组 Text1,它有 3 个元素,分别是 Text1(0)、Text1(1)和 Text1(2),它们响应的 Change 事件过程框架为:Private Sub Text1_Change(Index As Integer)End Sub 因为 3 个控件元素都响应同样的事件过程,所以为了知道在事件发生时,究竟是哪个控件响应了该事件,控件数组的事件过程中都会比简单控件事件过程多一个参数,Index 返回响应事件的数组元素的下标。比如 Index 值为 0 时,表示 Text1(0)元素引发
35、了该事件,Index值为 2 时,表示 Text1(2)元素引发了该事件。很多时候,在控件数组的事件过程的处理都是和多分支结构的程序配合完成。例 6-14 在窗体上有一个文本框和三个单选按钮,单选按钮构成控件数组 op1,下标分别为 0、1、2,要求实现程序运行时,根据单选按钮的选中情况改变文本框的字体。界面如下图 5-1 所示:计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成
36、绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 图 5-1 按上述要求完善以下程序:Private Sub Op1_Click(Index As Integer)Select Case (1)Case 0 Text1.FontName=宋体 Case 1 Text1.FontName=黑体
37、 Case (2)Text1.FontName=隶书 End Select End Sub 分析:3 个单选按钮构成一个控件数组,当单击“宋体”单选按钮 op1(0),将文本框字体设置为“宋体”,当单击“黑体”单选按钮 op1(1),将文本框字体设置为“黑体”,依次类推。每个单选按钮都响应同一个事件过程,在 Index 参数中记录了响应事件的控件下标。很显然,Select Case 语句中需要根据 Index 识别是哪个控件响应了该事件,所以(1)应该填入 Index,填空(2)中应该填入 2 或 Else。考虑一下:上述事件还可以改为以下程序段实现,效果是一样的。Private Sub Op
38、1_Click(Index As Integer)Text1.FontName=Op1(Index).Caption End Sub 八数组相关算法程序设计 1数组的排序 假设已将 n 个数存放在数组中,要求将其按从小到大的顺序排序。计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均
39、分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 排序是程序设计中很重要的算法,排序的算法有很多,这里介绍两种常见的算法:选择法和冒泡法。1)选择法排序 选择法的排序思想是:a、将第一个数依次与后面的 n-1个数进行比较,如果有一个数比它小,就执行交换操作,经过这一轮比较,产生最小数放在第一个数中。b、将第二个数再依次与后面的 n-2个数进行比较,如果有一个数比它小,就执行交换操作,经过
40、这一轮比较,产生第二小的数放在第二个数中。c、重复执行以上操作,最后是第 n-1个数和第 n 个数进行比较,如果后者小于前者,执行交换,否则保持原值。从以上的排序过程可以看出:n 个元素排序要进行 n-1 轮的比较,每一轮中要进行若干次比较,所以排序的算法是一个双重循环。若用循环变量 i 表示比较的轮数,则 i 的值从 1变化到 n-1,当 i=1 时,a(1)分别与 a(2)到 a(n)的每一个元素进行比较,一旦有元素比 a(1)小就执行交换;当 i=2 时,a(2)分别与 a(3)到 a(n)的每一个元素进行比较,一旦有元素比 a(2)小就执行交换;所以在第 i 轮的比较中,a(i)分别与
41、 a(i+1)到 a(n)的每一个元素进行比较,一旦有元素比 a(i)小就执行交换。若用 j 表示内循环的控制变量,则 j 的值是从 i+1 变化到 n。因为涉及到交换,所以还需定义变量 Temp作交换时的临时变量。例 6-15 随机产生 10 个三位正整数,用选择法将其按增序排序,并输出原始顺序和排序后的顺序。(分析见上面)程序如下:Option Base 1 Private Sub Form_Click()Dim a(10)As Integer,i As Integer,j As Integer Dim temp As Integer Randomize Print 原始顺序:For i=
42、1 To 10 a(i)=Int(Rnd*900)+100 利用随机函数产生数组元素的值 Print a(i);Next i Print For i=1 To 9 10 个元素,外围循环需要 9 次 For j=i+1 To 10 每次 a(i)都和其后面的每个元素作比较 If a(i)a(j)Then 如果 a(i)a(j)就执行交换 计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个
43、学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 temp=a(i)a(i)=a(j)a(j)=temp End If Next j Next i Print 排序后的顺序:For i=1 To 10 Print a(i);Next i End Sub 优化一下:从上面排序的执行可以
44、看出,在第 i 轮的比较中,只要有一个数比它小就执行交换,实际上这里有很多交换是无效的,因为每一轮比较中,a(i)只需与当前的最小元素执行一次交换既可,无需发现比它小的数就执行交换。因此可将选择法优化一下,过程如下:a、对有 n 个数的序列,从中选出最小的数,与第 1 个数交换。b、除第 1 个数外,其余 n-1个数再按 a 的方法选出最小的数,与第 2 个数交换。c、重复以上操作,直到最后只剩下一个数时结束。假设数组 a 中有 5 个元素,下标从 1 到 5,分别被赋值为 12、23、15、34、9。排序的执行过程如下所示:(下划线部分表示执行交换的两个数组元素)原始数据 12、23、15、
45、34、9 a(1)a(2)a(3)a(4)a(5)第 1 遍交换后 9、23、15、34、12 a(2)a(3)a(4)a(5)第 2 遍交换后 9、12、15、34、23 a(3)a(4)a(5)第 3 遍交换后 9、12、15、34、23 a(4)a(5)第 4 遍交换后 9、12、15、23、34 可以看出,优化的选择法执行外层和内层的循环次数完全一样,只不过在每轮比较中,优化的选择法不会频繁执行交换操作,在数据量比较大时可提高运行效率。优化的选择法在每轮比较中,是找出该轮的最小值后再进行交换。若用循环变量 i 表示比较的轮数,在第 i 轮的比较中,只需记录 a(i)到 a(n)中的最小
46、元素所在的下标 k,如果 k不等于 i,则将 a(k)与 a(i)交换,否则说明 a(i)中就是最小值,不需交换,所以每轮比较中最多执行一次交换。所以上述排序部分的程序段可优化如下:For i=1 To 9 计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放
47、一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 k=i 将本轮第一个元素下标赋给 k For j=i+1 To 10 只要发现有元素的值比 a(k)小,就用 k 记录最小元素所在的下标 If a(k)a(j)Then k=j Next j 如果 a(i)不是本轮最小元素,将 a(i)与本轮最小元素 a(k)交换 If k i Then temp=a(i)a(i)=a(k)a(k)=temp End If Nex
48、t I 2)数组的冒泡法排序 冒泡排序法主要是比较相邻两个元素的值,如果前面的数比后面的数大,就执行一次交换,即在每一轮的比较中都产生了本轮的最大值。下面以一个例子来看一下冒泡排序法的执行过程。为方便叙述,假设有一个数组 a(4),下标从 1 开始,现将其按冒泡法进行排序。排序的执行过程如下所示:(下划线部分表示执行交换的两个数组元素,每次都是相邻两个元素之间进行比较)原始数据 34、23、15、9 a(1)a(2)a(3)a(4)第 1 轮 23、34、15、9 23、15、34、9 23、15、9 、34 a(1)a(2)a(3)第 2 轮 23、15、9 15、23、9 、15、9 、2
49、3、a(1)a(2)第 3 轮 15、9 9、15 排序后数据 9、15、23、34 由上述的排序过程可看出,n 个数按冒泡法排序也需 n-1 轮比较,每一轮中也要进行若干次比较,所以冒泡排序也是一个双重循环。若用循环变量 i 表示比较的轮数,则 i 的值从1 变化到 n-1,在每轮中是相邻两个数进行比较,如果前面的数比后面的大,就执行交换,每次产生本轮的最大数。(它的执行过程有点象在水中气泡的运动,轻的往上浮,重的往下计方法熟悉控件数组的创建和使用掌握数组常用算法的程序设计学习要点一何时需要使用数组在程序设计过程中如果需要对一组同类型的很多数据进行处理时就必须使用数组进行程序设计比如求某班级
50、个学生某门课成绩的平均分再得写行要么采用循环程序设计定义一个变量通过次循环来接收每个学生的成绩并计算平均分程序段如下请输入第个学生的成绩求总分求平均分问题是当求出平均分后需要统计成绩高于平均分的学生人数而变量只能存放一个值在本循次与平均分进行比较程序段如下请输入第个学生的成绩统计成绩高于平均分的人数成绩高于平均分的人数有个这样处理会带来个问题数据的输入量变为原来的倍数据量很大在第二次输入过程中很可能出现与第一次不一致的情况造成学习必备 欢迎下载 沉,所以叫冒泡排序。)当 i=1 时,a(1)与 a(2)、a(2)与 a(3)、a(n-1)与 a(n)进行两两比较,最后产生最大数放在 a(n)中