版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章复合数据类型主编:制作:本章主要讲解内容5.1枚举5.2数组5.3结构5.4集合5.5综合应用5.1枚举5.1.1枚举类型的定义枚举类型使用关键字Enum语句来声明,其语法格式如下:[访问权限]Enum枚举类型名称成员名[=常数表达式]
成员名[=常数表达式]……EndEnum说明:(1)访问权限为可选项,可以为public和private,默认情况下,访问权限为public。(2)使用Enum关键字声明枚举类型。(3)成员名是必选项,是定义枚举中的常数。默认情况下,枚举中的第一个常数初始值为0,后面的常数依次递增1。(4)常数表达式是可选项,可以显式为成员名指定一个常数,类型可以是Byte、Integer、Long、Short类型,默认为Long类型。举例例如,定义一个枚举类型ColorVal:PublicEnumColorValRedGreenBlueEndEnum5.1.2枚举的使用枚举类型声明后,就可以定义该枚举类型的变量,然后使用该变量存储枚举成员的值。若要引用枚举类型中的成员,可以使用下列格式:<枚举类型名>.<成员名>例如要引用ColorVal枚举类中的Green颜色值,可以使用下列方法:DimcolorAsColorValcolor=ColorVal.Green【例5.1】编写一个程序,用来实现简单的菜单选择操作,菜单包含有1.Add,2.Modify,3.Delete,4.Save。分析:这四种操作可以组成一个枚举,然后通过文本框输入不同操作所对应的编号,点击命令按钮提示所选择的操作。5.2数组5.2.1数组的几个基本概念1.数组与数组元素2.数组的类型3.数组的维数5.2.2数组的声明数组须先声明后使用,声明数组的语法格式如下:访问修饰符数组名(下标1上界[,下标2上界…])[As
数据类型]说明:(1)“访问修饰符”可以是Dim、Private、Static、Public,通常使用Dim关键字。(2)省略“数据类型”,默认数组为Object类型。(3)“数组名”与简单变量的命名规则相同。但在同一个过程中,数组与简单变量不能同名,即不能在某个过程中同时声明数组a和变量a。(4)下标上界的个数代表数组的维数。例如:Dima(30)AsString '声明一维字符串型数组aDimb(30,5)AsInteger '声明二维整型数组bDimc(10,5,5)AsSingle '声明三维单精度浮点型数组c(5)声明数组时的下界为0,不能改变。与VB6.0不同,VisualBasic.NET上界不一定非要是常量或者常量表达式,也可以是变量,但在使用时,上界最好使用常量或者常量表达式。例如,以下声明数组的语句都是合法的:DimmAsIntegerm=100Dima(m)AsInteger'这里的m是变量,不提倡使用建议使用常量作为下标上界:ConstmAsInteger=100Dima(m)AsInteger'这里的m是常数(6)下标必须是整数,否则系统将按四舍五入自动取整。例如:Dima(3.5)AsInteger'这里下标上界为45.2.2数组的初始化1.一维数组初始化语法格式为:Dim数组名()[As数据类型]={初始值序列}说明:(1)格式中“初始值序列”要用花括号括起来,并且各数据必须为常数,各数据间用逗号隔开。(2)当对数组进行初始化时,不能在数组名后的圆括号内指定下标上界,数组元素个数由初始值个数决定。例如:Dima()AsInteger={1,2,3,4,5}表示声明了整型数组a,共有5个元素,并进行了初始化,其中a(0)=1,a(1)=2,a(2)=3,a(3)=4,a(4)=5。下面数组初始化是错误的:Dima(4)AsInteger={1,2,3,4,5} '指明了下标的上界2.二维数组初始化语法格式为:Dim数组名(,)[AS数据类型]={{第1行初始值},{第2行初始值},…,{第n行初始值}}说明:(1)数组名后的圆括号内必须有一个“,”,以指明是个二维数组。(2)数组第一维个数由内层花括号个数确定,第二维个数由每行元素个数确定。例如:Dima(,)AsInteger={{1,2,3},{4,5,6}}声明了一个二维数组a,含有2行3列,并进行初始化,其中a(0)(0)=1a(0)(1)=2a(0)(2)=3a(1)(0)=4a(1)(1)=5a(1)(2)=65.2.3数组的基本操作数组的基本操作包括对其元素的赋值和引用、输入和输出。对数组元素的大部分操作如同简单变量,例如,对数组元素进行赋值:a(1)=1:a(2)=1a(3)=(a(1)+a(2))/2其中,第2条语句对a(3)赋值,也包含了对a(1)和a(2)这两个数组元素的引用。不管是哪种情况,在使用数组元素时都要注意以下几点:(1)使用数组元素时,数组名、数组类型和维数必须与数组声明时一致。(2)使用数组元素时,下标值应在数组声明时所指定的范围之内。(3)使用数组时其元素下标可以用常量,也可以用变量、函数及表达式等。(4)要特别注意区分下面两条语句中数字10的含义:Dima(10)AsInteger'声明数组a的下标上界等于10a(10)=85'给数组a中的下标为10的元素赋值数组的输入、输出本质上与简单变量没有区别,但由于数组本身所具备的特点,其输入、输出往往是利用循环结构实现的。【例5.2】给一维数组a赋初值,要求每个元素的值等于其下标的平方,并输出其下标和元素的值。分析:利用循环结构可以实现数组的输入和输出,只要将循环变量作为数组元素的下标,并在每次循环中依次改变循环变量的值,即可访问数组中的所有元素。界面设计:建立一个窗体,增加一个文本框,将MultiLine设置为True,添加一个命令按钮,将Text属性设置为“计算”。5.2.4ForEach…Next语句与For...Next语句一样,两者都可以执行循环操作,但是当需要为集合或数组的每个元素重复执行一组语句时,使用ForEach...Next循环更方便。其一般格式为:ForEach成员变量[As数据类型]In数组或者集合[语句][ExitFor]Next[成员变量]说明:(1)成员变量:用于循环访问集合的元素。在ForEach语句中是必选项,在Next语句中是可选项。(2)数据类型:成员变量的数据类型。如果尚未声明成员变量,则是必选项。(3)数组或者集合:必选项,需要遍历的数组或者集合。(4)语句:要执行的循环体,一条或者多条语句。(5)ExitFor:可选。将控制转移到ForEach循环外。【5.3】定义一个5行5列的矩阵,并利用随机函数给矩阵赋1~100之间的数,求所有偶数的和。分析:矩阵是一个二维数组,如果使用For…Next语句,则要使用嵌套循环。ForEach…Next语句可以遍历数组中的每个元素,而不管数组的维数,这对于多维数组的遍历操作是非常方便的。5.2.5数组的使用数组是程序设计中最为常用的一种数据结构,离开了数组,许多问题会变得较为复杂,或者难以解决。本节从几个最常用的方面介绍数组的实际应用。1.数据统计和处理利用数组中存储的信息,可以对数据进行各种统计和处理,例如,求最大值、最小值和平均值,对数据和信息进行分类统计等。图5-4求最大数、最小数和平均值【例5.4】从键盘输入10个数据,找出其中的最大数、最小数和平均值,并输出高于平均值的数据及其个数。分析:求最大数、最小数和平均值,可以不使用数组,但要查找其中高于平均值的数据,如果不使用数组,就必须在求得平均值之后再次输入所有数据才能进行比较。因此,使用数组可以简化问题的解决。【例5.5】统计选票。设有10名候选人,试统计每个人的选票。分析:设置候选人的代号分别为1,2,…,10,并规定输入i表示第i个人得一张选票。这样,就将问题转化为统计输入了多少个1,多少个2,……,多少个10。【例5.6】从键盘输入一个字符串,判断每一个字母(不区分大小写)出现的次数。分析:这是一个分类统计问题,可以借鉴上一道例题的设计思想,用一个内含26个元素的一维数组存放26个字母出现的次数。(提示:大写字母“A”的ASCII码为65,大写字母“Z”的ASCII码为90)2.矩阵操作可以将二维数组看作一个m行n列的矩阵,以进行有关行列式的操作,例如,针对各行、各列、对角线上的元素或者上、下三角形中的元素进行操作,又如求两个矩阵的和、差或者乘积等。本节仅讨论一些简单的矩阵操作及其应用。【例5.7】设有一个5×5的方阵,分别计算两条对角线上的元素之和。分析:主对角线上元素的行号与列号相等。对于一个m×m的方阵,其次对角线上元素的行号与列号之和等于m-1。为简单起见,数组元素可由程序自动产生。设计:Form窗体上增加三个文本框,TextBox1显示矩阵,MutiLine设置为True,TextBox2和TextBox3输出两个对角线的和。3.递推问题递推算法可以用循环结构来实现,这在4.4.5节已有介绍。该算法的核心是通过前项计算后项,从而将一个复杂的问题转换为一个简单过程的重复执行。由于一个数组本身就包含了一系列变量,因此利用数组可以简化递推算法。【例5.8】改写例4.24,输出斐波那契(Fibonacci)数列的前20项。分析:可以用一个数组f来存放斐波那契数列,则初始条件为f(0)=1和f(1)=1,递推公式为f(i)=f(i-1)+f(i-2)。4.排序问题排序是数组应用中最重要的内容之一。排序的方法很多,例如,比较法、选择法、冒泡法、插入法及Shell排序等。下面介绍最常用的3种排序方法:比较法、选择法和冒泡法。(1)比较法排序设有10个数,存放在数组a中,比较法排序的思路如下(以降序排列为例)。第1轮:将a(0)与a(1)~a(9)逐个比较。先比较a(0)与a(1),若a(0)<a(1),则交换a(0)和a(1)中的数据,再比较a(0)与a(2),a(0)与a(3),……,并将每次比较的较大数交换到a(0)中。这样,第1轮结束后,a(0)中存放的必然是10个数中的最大数。第2轮:将a(1)与a(2)~a(9)逐个进行比较,方法同上,故第2轮结束后,a(1)中存放的是a(1)~a(9)这9个数中的最大者。继续进行第3轮、第4轮、……,直到第9轮。其中,第9轮只需要比较a(8)与a(9)两个数据。至此,10个数已按从大到小的顺序存放在数组a中。a(i)<a(j)比较法排序(n个数按降序排列)的流程图如图5-7所示。Fori=0ton-2Forj=i+1ton-1真假a(i)与a(j)互换Fori=0ton-2Forj=i+1ton-1真假a(i)与a(j)互换【例5.9】产生10个随机整数,用“比较法排序”按从大到小的顺序输出数据程序代码如下:PrivateSubForm5_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
Dima(9)AsIntegerDimiAsInteger,jAsInteger,tAsInteger
Randomize()Console.WriteLine("原始数据如下:")Fori=0To9a(i)=Int(200*Rnd())+100'产生10个随机整数,区间[100,299]
Console.Write(a(i)&vbTab)
NextiFori=0To8Forj=i+1To9Ifa(i)<a(j)Thent=a(i):a(i)=a(j):a(j)=t'交换a(i)与a(j)EndIfNextNextConsole.WriteLine()Console.WriteLine("按从大到小的顺序排列输出:")Fori=0To9
Console.Write(a(i)&vbTab)
NextConsole.WriteLine()EndSub(2)选择法排序比较法排序比较容易理解,但在排序时可能产生较多的交换次数。选择法排序针对此不足进行了改进,其算法如下(以10个数的降序排列为例)。第1轮:引入一个指针变量k,k指向0(先假定第1个元素最大),将a(0)与a(1)比较,若a(0)<a(1),则将k指向1,即将指针指向较大者。再将a(k)与a(2)~a(9)逐个比较,并在比较的过程中将k指向其中的较大数。完成比较后,k指向10个数中的最大者。如果k<>0(与假定不符),交换a(k)和a(0);如果k=0,表示a(0)就是这10个数中的最大数,不需要进行交换。第2轮:将指针k指向1(再假定第2个元素为余下的最大数),将a(1)与a(2)~a(9)逐个比较,方法同上。继续进行第3轮、第4轮、……,直到第9轮。选择法排序每轮最多进行一次交换,以n个数按降序排列为例,其流程图如图5-8所示。其中,k<>i表示在第i轮比较的过程中,指针k曾经移动过,需要互换a(i)与a(k),否则不进行任何操作。Fori=0ton-2k=i
Forj=i+1ton-1真假K=j真假
a(k)与a(i)互换【例5.10】改写例5.9,用“选择法排序”实现10个随机整数的降序排列。设计:按照选择法排序的算法及其流程图(见图5-8)进行设计。改写排序部分的代码如下:
Fori=0To8k=iForj=i+1To9Ifa(k)<a(j)Thenk=j'指针k指向大数
NextIfk<>iThent=a(k):a(k)=a(i):a(i)=tNext(3)冒泡法排序冒泡法排序的基本思想是:将待排序的数看作是竖着排列的“气泡”,每次比较相邻的两个数,小数上浮,大数下沉(这只是一种形象的说法,根据排序要求,亦可改为大数上浮,小数下沉)。冒泡法排序的具体算法如下(以10个数的升序排列为例)。第1轮:先将a(0)与a(1)比较,如果a(0)>a(1),交换a(0)和a(1),使得a(1)存放较大数。再将a(1)与a(2)比较,并将较大的数放入a(2)中,……,依次比较相邻两数,直到a(8)与a(9)。最后将10个数中的最大者放入a(9)中。第2轮:依次将a(0)与a(1)、a(1)与a(2),……,直到a(7)与a(8),最后将此轮9个数中的最大者放入a(8)中。继续进行第3轮、第4轮、……,直到第9轮。冒泡法排序(n个数按升序排列)的算法流程图如图5-9所示。Fori=0ton-2Forj=0ton-2-i真假a(j)与a(j+1)互换【例5.11】产生10个随机整数,用“冒泡法排序”按从小到大的顺序输出数据。设计:按照冒泡法排序的算法及其流程图(见图5-9)进行设计。程序代码如下:改写排序部分的代码如下:
Fori=0To8Forj=0To8-iIfa(j)>a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tNextNext5.2.6动态数组静态数组在声明时已经指定了各维的大小。但数组的大小到底多大才算合适,有时可能是无法事先确定的。如果希望在运行时能够改变数组的大小,就要用到动态数组。使用动态数组可以更加有效的利用内存。其格式为:ReDim[Preserve]数组名(下标1上界[,下标2上界]...)例如:Dima()AsInteger '声明数组a,无指定大小ReDima(10) '重新改变数组a的大小Dimb(5)AsInteger '声明数组b,有5个元素ReDimb(10) '重新改变数组b的大小,有10个元素Dimc(10,10)AsIntegerReDimc(15,15) '重新定义二维数组,有15×15个元素说明:(1)与Dim语句不同,ReDim语句是一个可执行语句,故只能在过程中使用。(2)可以用ReDim语句改变数组的各维数的大小,但不能够改变数组的维数及数组的数据类型。(3)用ReDim语句重新定义一个数组的大小,数组中各元素原有的值将丢失,重新将数组元素的值初始化。如果想保留数组中原有数组元素的值,加上关键字Preserve,但这时只能改变数组最后一维的大小。【例5.12】从键盘任意输入n个数,按从小到大的顺序排列输出。设计:原始数据和排序后的数据可以用TextBox控件显示。输入数据的个数通过InputBox对话框接收,然后利用ReDim语句重新定义数组。数据采用比较法进行排序。【例5.13】输出杨辉三角形(Pascal三角形)。分析:一个8行杨辉三角形如图5-8所示。杨辉三角形中的各行是二项式(a+b)n展开式中各项的系数。由图5-8可以看出,杨辉三角形第1列元素及对角线上的元素均为1,其余各项的值都是其上一行中前一列元素与同列元素之和。若上一行的同列中没有元素则认为是0。由此可得如下递推关系:5.3结构实际的信息处理过程中,有许多信息是由多个不同类型的数据组合在一起进行描述的,而且这些不同类型的数据互相联系组成了一个有机的整体。例如,要表示一个学生的信息,学生有学号、姓名、性别、出生日期、成绩,含有5个数据项,并且数据类型也不一样。此时,就要用到一种新的复合类型——结构。5.3.1结构的定义VisualBasic.NET中,结构的定义用Strcture语句开始,以EndStructure语句结束,语法格式如下:[访问限定符]Structure结构名变量声明
[过程声明]EndStructure例如:PublicStructureSTUDENTDimxhAsString'学号
DimxmAsString'姓名
DimxbAsBoolean'性别
DimcjAsInteger'成绩EndStructure定义一个结构STUDENT,含有学号、姓名、性别、成绩四个基本信息。说明:(1)访问限定符可以是Public、Friend、Private,省略不写,默认为Public。(2)结构名为有效的VisualBasic.NET标识符。(3)变量声明,必选项。变量声明的方法和普通变量的声明方法一样,可以用Dim、Private、Public语句声明。结构中的变量经常也称为结构的数据成员,一个结构中至少要有一个成员变量或事件。(4)过程声明,可选项。和VB6.0不同,VisualBasic.NET的结构体中可以包含Function、Property、或者Sub过程的声明,一般不常使用。(5)Structure语句在模块级使用,即VisualBasic.NET不允许在过程内部声明结构,只能在源文件、模块、接口或者类内部声明结构。(6)结构中可以包含其他结构,即一个结构内部的数据成员可以是一个结构类型的变量。5.3.2定义结构类型变量结构只是用户定义的一种数据类型,因此要通过定义结构类型的变量来使用这种类型。结构类型变量的定义与普通变量的定义类似,语法格式为:[Dim|Public|Private]变量1,变量2…变量nAs结构类型名例如:Dimstu1,stu2AsSTUDENT定义两个STUDENT结构类型的变量stu1和stu2。5.3.3结构类型变量成员的引用定义完结构类型变量,该变量就拥有该种结构类型的所有成员,引用成员的格式:结构类型变量名.成员名例如,要引用前面定义的结构变量stu1中的学号、姓名,则表示为:stu1.xh,stu1.xm。5.3.4结构类型变量的赋值结构体变量的赋值,就是对其内部数据成员的赋值,内部数据成员可以像普通变量一样被赋值,参加各种运算,例如对变量stu1中的所有成员赋值:stu1.xh=2012101stu1.xm="张三平"stu1.xb=Truestu1.cj=85逐个为成员变量赋值,书写非常麻烦,可以使用With...EndWith语句,格式为:With结构类型变量名语句块EndWith例如上述对stu1的赋值,可以简化为:Withstu1.xh=2012101.xm="张三平".xb=True.cj=85EndWith另外,结构类型变量支持整体赋值,比如将结构变量stu1的信息赋值给stu2,则可执行:stu2=stu1。【例5.14】编写一个简单的程序,输入5个学生的基本信息,并将其输出。分析:每个学生信息可以定义为一个结构类型,5个学生,可以定义成一个数组,只不过数组类型为结构类型。设计:利用InputBox函数输入5个学生的基本信息,在一个文本框中输出该学生的信息,建立一个windows窗体,窗体上增加一个文本框,文本框MultiLine属性设置为True。程序代码如下:5.4集合VisualBasic.NET提供了一个预定义对象集合(Collection),可以存放多个数据项,其功能类似于前面所讲的数组,也是由元素组成的,而且也可以通过索引值来引用数据元素,但使用起来比数组更灵活、更方便。与数组相比,集合可以随意添加删除元素,而不需要重新定义集合的大小;集合可以存储不同类型的数据,而数组只能存储统一类型的数据;数组要声明元素的类型,集合类的元素类型是Object。5.4.1创建集合对象集合是一个预定义对象,建立一个集合对象,要用New关键字建立一个Collection类的实例。其语法格式如下:Dim集合对象名AsNewCollection()例如建立一个Student集合对象:DimStudentAsNewCollection()5.4.2集合的使用集合的使用主要有三种操作,即在集合中添加、删除、查找数据项,下面介绍Collection类中封装的几个方法和属性。1.Add方法格式:集合对象名.Add(Item[,Key][,Before][,After])功能:向集合中添加数据项。说明:(1)Item,必需。指定要添加到集合的数据项。(2)Key,可选。指定键值,是一个唯一的字符串表达式,可作为索引值使用,用来标示集合中的一个数据成员。(3)Before,可选。指定集合中的相对位置的表达式。将要添加的元素放在集合中由Before参数标识的元素前面。(4)Afte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沟通的课件教学课件
- 2024年广告资源销售合同文本
- 2024年度合作经营咖啡馆之合伙协议书
- 模拟法庭课件教学课件
- 课件带语音教学课件
- 2024商场美食广场保险服务合同
- 2024【工商局业务表格格式条款备案申请书】工商局合同格式条款整治工作方案
- 2024年度吨不锈钢带打印功能电子地磅秤生产批次检验合同
- 04道路交通事故赔偿合同
- 2024房产借款抵押合同样本
- 人教版三年级数学上册期中考试试卷带答案
- 部编版2024-2025学年语文五年级上册第4单元-单元测试卷(含答案)
- 缤纷舞曲-《青年友谊圆舞曲》教学课件-2024-2025学年人音版(简谱)(2024)七年级音乐上册
- 大学与文化传承智慧树知到期末考试答案章节答案2024年浙江大学
- 2024年心理咨询师(中科院心理研究所版)考试题库大全-上(单选题)
- 2024春形势与政策课件当前国际形势与中国原则立场
- 一年级拼音默写表
- GB/T 1536-2021菜籽油
- 工作报告村干部“三述”报告(3篇)村干部三述一评报告
- 7A文哈特风险基金
- 新奥60万吨甲醇精馏塔内件和填料技术(天久)
评论
0/150
提交评论