《Visual Basic NET程序设计》课件第5章 枚举、数组和结构_第1页
《Visual Basic NET程序设计》课件第5章 枚举、数组和结构_第2页
《Visual Basic NET程序设计》课件第5章 枚举、数组和结构_第3页
《Visual Basic NET程序设计》课件第5章 枚举、数组和结构_第4页
《Visual Basic NET程序设计》课件第5章 枚举、数组和结构_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前面提到的数据类型,如整型、实型、日期型等属于存储单一信息的简单数据类型。而实际应用中,有些数据是由若干种相关数据构成的,这些数据可以通过枚举、数组和结构等复杂数据类型存储。5.1枚举所谓“枚举”,是指将变量的值逐一列举出来,变量的值只限于列举出来的值的范围。例如,可以把一周七天相关联的一组整数常数声明为一个枚举类型,然后在代码中使用这七天的名称而不是它们的整数值。5.1.1枚举类型的定义枚举类型通过Enum语句来定义,语法如下:[Public|Private]Enum类型名称成员名[=常数表达式]成员名[=常数表达式]…EndEnum例如,在Enum语句定义中定义了一个枚举类型CourseCodes,其中使用赋值语句为一组课程命名常数:PublicEnumCourseCodesComputer=1 English=2 Math=3EndEnum在Enum语句定义中,常数表达式可以省略,在默认情况下,枚举中的第一个常数被初始化为0,其后的常数将按步长1递增。可以自定义每个枚举成员相关联的常量值,但是要求必须在该枚举的类型范围内。下面的示例将产生编译错误,原因是常量值-1、-2和-3不在Uinteger的范围内。EnumColorsASUinteger Red=-1 Green=-2 Blue=-3EndEnum多个枚举成员可以共享一个关联值。下面的示例中,两个枚举成员(Blue和Max)具有相同的关联值11。EnumColorsASUinteger Red ‘成员常量值=0 Green=10 ‘成员常量值=10 Blue ‘成员常量值=11 Max=Blue ‘成员常量值=11EndEnum5.1.2枚举的使用声明枚举类型后,就可以定义该枚举类型的变量。引用枚举类型变量的成员的语法如下:

枚举类型变量名.成员名称例如,利用前面例子中定义的一个枚举类型CourseCodes,定义一个该枚举类型的变量,然后访问它的Math常量:DimMyCourseAsCourseCodesMyCourse=CourseCodes.Math 'MyCourse值为3例5.1枚举类型应用示例。PublicClassForm1PublicEnumDaysSundayMondayTuesdayWednesdayThursdayFridaySaturdayEndEnumPrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimMyDayAsDaysMyDay=Days.MondayIfMyDay<Days.SaturdayThenMsgBox("今天是星期一,不是周末",,"")EndIf

EndSubEndClass5.2数组数组是同类型变量的一个有序集合。数组中的元素称为数组元素,数组元素具有相同名字和数据类型,通过下标(索引)来识别它们。只有一个下标的数组称一维数组,有两个下标的数组称为二维数组,有三个以上下标的数组称多维数组。如:A%(10)、B$(5,5)、C!(2,3,4)5.2.1数组声明语法:数组名(第一维下标上界[,第二维下标上界,...])[As数据类型]数组具有以下属性。①数组使用类型声明,通过数组下标(或称索引)来访问数组中的数据元素。②数组元素可以为任何数据类型,包括数组类型。③每个维度的下标(索引)从0开始。④数组的大小与其元素的数据类型无关。数组的大小表示数组中的元素总数,而不是元素所占用的存储字节数。数组大小的计算方法数组的大小是数组的所有维度的长度乘积。它表示数组中当前包含的元素的总数。每一维度的长度是其对应的下标值加1。例如,声明一个三维数组Dimprices(3,4,5)AsLong,则数组prices的总大小是(3+1)×(4+1)×(5+1)=120。关于数组,要注意以下事项。①“数组名”可以是任何合法的VB.NET变量名。②数组元素下标上界"的个数表示数组的维数,当只有一个时表示一维数组,最多可声明32维数组。③数组元素下标上界只能是常数,不能是变量或表达式,其最大值可为264-1。④数组元素下标下界为0,不能改变。⑤数组的数据类型可以是基本的数据类型,也可以是Object类型。如果省略“As数据类型”,则默认为Object类型。例如:DimA(14)AsInteger '15个元素,从A(0)到A(14)DimB(5,3)AsDecimal

'24个元素,从B(0,0)到B(5,3)DimC(2+7)AsString '出错数组下标函数:1.LBound函数LBound函数来获得数组任一维的下界。语法:Lbound(数组名[,维])说明:维是指定返回数组的哪一维。1(默认)表示第一维,2表示第二维,依次类推。例如:DimA(9,14)AsInteger,LAsIntegerL=Lbound(A,1) '获得数组第一维的下界,返回0

2.UBound函数UBound函数来获得数组任一维的上界。语法:Ubound(数组名[,维])说明:维是指定返回数组的哪一维。1(默认)表示第一维,2表示第二维,依次类推。例如:DimA(9,14)AsInteger,UAsIntegerU=Ubound(A,2) '获得数组第二维的上界,返回14通过组合使用Lbound和Ubound函数,可以确定一个数组的大小。5.2.2数组的初始化在声明的时候指定各数组元素的初始值,称为初始化。1.一维数组的初始化一维数组的初始化,语法如下:Dim数组名()[As数据类型]={值1,值2,值3,……,值n}如:DimA()AsInteger={1,2,3,4,5}2.二维数组的初始化二维数组的初始化,语法如下:Dim数组名(,)[As数据类型]={{第1行值},{第2行值},{第3行值},……,{第n行值}}例如:DimA(,)AsInteger={{1,2,3,4},{5,6,7,8},{9,10,11,12}}5.2.3动态数组动态数组指其大小可以在运行时改变。使用动态数组有助于有效管理内存。定义动态数组的方法:(1)用Dim语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。(2)在过程中用ReDim语句分配实际的数组元素个数,形式如下:ReDim[Preserve]数组名(数组下标上界,…)其中,下标的上、下界可以是常量,也可以是有了确定值的变量或表达式。例5.2正确使用Dim、ReDim和Preserve语句。PublicClassForm1PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimArr(,)AsInteger'声明动态数组Arr(,)DimiAsInteger,jAsIntegerLabel1.text=""ReDimArr(2,3)'指明数组的大小Fori=0To2'为每一个数组元素赋值并显示Forj=0To3Arr(i,j)=2*j+8*iLabel1.Text&="Arr("&i&","&j&")="&Arr(i,j)&""NextjLabel1.text&=vbcrlfNextiLabel1.text&=vbcrlfReDimPreserveArr(2,4)'重新指明数组的大小,并保留原来的值,只能改变第二维大小Fori=0To2'为新增加的数组元素赋值Arr(i,4)=Arr(i,0)+Arr(i,1)+Arr(i,2)+Arr(i,3)NextiFori=0To2'重新显示数组的元素Forj=0To4Label1.Text&="Arr("&i&","&j&")="&Arr(i,j)&""NextjLabel1.text&=vbcrlfNextiEndSubEndClass5.2.4数组的使用使用数组就是对数组元素进行各种操作,如赋值、表达式运算、数组元素统计、查找、排序等。1.给数组元素赋值给数组元素赋值,可以采用下面二种方式:(1)利用循环结构可以使用循环语句为数组元素赋值。(2)数组直接对数组赋值就像变量给变量赋值一样,也可以将一个数组的内容赋值给另一个数组。例5.3一个数组直接对另一个数组赋值。PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimarrA(5)AsInteger,arrB()AsIntegerDimi%Label1.Text=""Fori=1To5arrA(i)=iNextiReDimarrB(UBound(arrA))arrB=arrAFori=LBound(arrA)ToUBound(arrA)Label1.Text&=arrB(i)&""NextiEndSub2.数组中元素的统计例5.4求数组中所有元素之和、之积,以及数组中最大元素及其下标。PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimArr(10)AsIntegerDimi%,max%,imax%,sum%'max中放最大值,imax中放最大值的下标,sum中放求和值Label1.Text=""Fori=1To10'随机产生10个1~100的自然数Arr(i)=Int(Rnd()*100)+1Label1.Text&=Arr(i)&""NextiLabel1.Text&=vbCrLfimax=1:max=Arr(1)sum=Arr(1)Fori=2To10sum=sum+Arr(i)IfArr(i)>maxThenmax=Arr(i):imax=iEndIfNextiLabel2.Text="最大值下标="&imax&""&"最大值="&max&""&"和="&sumEndSub3.在数组中查找元素查找是指在数组中,根据指定的值,找出与其值相同的元素。查找算法有很多,最简单的方法有顺序查找和二分法查找。顺序查找是将待查找值与数组中的元素逐一比较,若相同,则查找成功;若找不到,则查找失败。二分法查找的思想是:待查找值同数组的中间项元素比较,若相同则查找成功结束;否则,判别待查找值落在数组的哪半部分,然后在剩下的这半部分里重复上述查找,直到找到或数组中没有待查找值。例5.5二分法查找。PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimArr()AsInteger={1,2,4,6,8,9,11,18,29,30}‘数组下标从0开始Dimkey%,mid%,p%,q%key=Val(TextBox1.Text)p=0:q=9Domid=(p+q)/2Ifkey=Arr(mid)ThenExitDoElseIfkey>Arr(mid)Thenp=mid+1Elseq=mid-1EndIfEndIfLoopWhilep<=qIfp>qThenLabel1.Text="未找到数"&keyElseLabel1.Text=key&"是数组中第"&mid&"个数"EndIfEndSub4.交换数组中元素的位置例5.6设有一个4×4的方阵,求其转置矩阵。程序运行结果如图5-3所示。PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimMetrix(4,4)AsIntegerDimiAsInteger,tAsIntegerLabel1.Text=""Fori=1To4'用二维数组存放矩阵Forj=1To4Metrix(i,j)=j+4*(i-1)Label1.Text&=Str(Metrix(i,j)).PadRight(4)NextjLabel1.Text&=vbCrLfNextiLabel1.Text&=vbCrLfFori=1To4'矩阵转置Forj=1Toit=Metrix(i,j)Metrix(i,j)=Metrix(j,i)Metrix(j,i)=tNextjNextiFori=1To4Forj=1To4Label1.Text&=Str(Metrix(i,j)).PadRight(4)NextjLabel1.Text&=vbCrLfNextiLabel1.Text&=vbCrLfEndSub5.数组元素排序排序是将一组数按递增或递减的次序排列。排序的算法有很多,下面采用冒泡法对10个数由小到大排序。算法思想是:设有10个待排序数存放在数组A中,分别表示为A(1)~A(10)。第1趟:先将A(1)与A(2)比较,若A(1)>A(2),则将A(1)、A(2)中的值互换,使得A(1)存放较小者。再将A(2)与A(3)、A(3)与A(4)、……、A(9)与A(10)比较,并且依次作出同样的处理。最后,10个数中的最大者放入A(10)中。第2趟:将A(1)与A(2)、……、A(8)与A(9)比较,并且依次作出同样的处理,使得10个数中的次大者放如A(9)中。如此进行第3趟、第4趟……,直到第9趟。至此,将得到A(1)~A(10)中存放的有序数,算法结束。例5.7冒泡法排序。PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimA(10)AsIntegerDimiAsInteger,jAsInteger,tAsIntegerLabel1.Text=""Fori=1To10'随机产生10个1~100的自然数A(i)=Int(Rnd()*100)+1Label1.Text&=A(i)&""NextiLabel1.Text&=vbCrLf&vbCrLfFori=1To9'起泡法排序Forj=1To10-iIfA(j)>A(j+1)Thent=A(j):A(j)=A(j+1):A(j+1)=tEndIfNextjNextiFori=1To10Label1.Text&=A(i)&""NextiLabel1.Text&=vbCrLfEndSub5.3结构结构是一种较为复杂但非常灵活的复合数据类型,一个结构类型可以由若干个称为成员的数据成分组成,每个成员的数据类型可以互不相同,不同的结构可以包含不同的成员。例如,一个学生的基本信息包括学号、姓名、电话号码、出生日期、成绩等数据,这些数据类型、长度各不同,但它们都是学生的基本信息。对这种数据,就可以用结构类型。5.3.1定义结构结构类型的定义是用Structure语句开始,用EndStructure语句结束,其定义的语法如下:[DimIPublicIFriendIPrivate]Structure结构名变量声明[过程声明]EndStructure例如,使用Structure语句定义学生的一系列信息:PublicStructurestruStudentsPublicstrIdAsStringFriendstrNameAsStringPrivatestrBirthDayAsDatePrivateintScoreAsInteger‘下面定义一个过程成员,它可以访问结构的私有成员FriendSubDoubleScore(ByvalinScoreAsInteger)intScore=intScore*2EndSubEndStructure在结构中可以包含其他结构,例如先定义telephone结构如下:PublicStructuretelephonePublicstrPhoneAsStringFriendstrMobilPhoneAsstringEndStructure然后,再定义newStudents结构,其中包含telephone结构:PublicStructurenewStudentsPublicstrIdAsStringFriendstrNameAsStringPrivatestrBirthDayAsDatePrivateintScoreAsIntegerDimphoneAstelephone '定义结构类型的成员EndStructure5.3.2定义结构类型的变量结构类型的变量(简称结构变量)的定义与普通变量的定义类似,格式如下:[Dim|Public|Private]变量名1,变量名2,…,变量名nAs结构名例如,定义struStudents结构类型的两个变量Stu1和Stu2的语句如下: DimStu1,Stu2AsstruStudents5.3.3初始化结构变量结构变量的初始化不能直接对结构变量本身进行,只能用赋值语句对结构变量的各个成员分别赋值。例如,定义两个具有telephone结构类型的变量X1和X2,并初始化它们:PublicStructuretelephonePublicstrPhoneAsStringFriendstrMobilPhoneAsStringEndStructureDimX1,X2AstelephoneX1.strPhone="6210087"X1.strMobilPhone=X2.strPhone="6253023"X2.strMobilPhone=5.3.4引用结构变量对结构变量的引用主要是对它的成员引用,即对成员进行赋值、运算、输入和输出等操作。在引用结构变量时,可以采用如下几种方式:1.成员引用结构变量名.成员名说明:例如,引用5.3.3节举例中的X1和X2变量如下:DimX1,X2Astelephone ‘定义结构变量X1.strPhone="12345678" ‘对x1的成员strPhone赋值X1.strMobilPhone= ‘对x1的成员strMobilPhone赋值X2.strPhone=X1.strPhone ‘将X1的成员strPhone赋值给x2的相应的成员2.成员变量的运算结构中的成员变量具有各种类型,根据其类型可以像普通变量一样进行各种运算和输入输出,如算术运算、赋值运算、关系运算、逻辑运算等。例如,下面代码对5.3.3节举例中的X1变量的strPhone成员进行赋值运算和关系运算:DimX1,X2Astelephone ‘定义结构变量X1.strPhone="12345678" ‘对x1的成员strPhone进行赋值运算IfX1.strMobilPhone<>X1.strPhoneThen ‘对X1的成员进行关系运算X2.strPhone=X1.strPhoneEndIf3.嵌套引用如果一个结构中的成员本身又是一个结构类型,则在引用时需要使用多个成员运算符,按照从高到低的原则,一级一级地找到最低一级的成员,最后对最低级的成员进行访问。例如,下面代码定义了一个具有5.3.1节举例中的newStudents结构的变量X1,然后访问其嵌套的strPhone成员,对该成员进行赋值运算。DimX1AsnewStudents '定义结构变量X1.Phone.strPhone="12345678" ‘对X1的Phone成员的子成员strPhone进行赋值运算X1.strName="李明" ‘对x1的成员strName进行赋值运算4.结构变量整体赋值VB.NET允许将一个结构变量作为一个整体赋值给另一个同类型的结构变量,即将一个结构变量的所有成员的值依次赋给另一个结构变量的相应的成员。例如,下面代码中X1和X2被声明为同类型结构变量,可以将X1结构变量整体赋值给X2结构变量。DimX1,X2Astelephone ‘定义结构变量X1.strPhone="12345678" ‘对x1的成员strPhone进行赋值运算X1.strMobilPhone= ‘对X1的成员strMobilPhone赋值运算X2=X1 5.3.5结构数组结构变量中可以存放一组数据,例如一个学生的学号、姓名、出生日期等,如果有多个学生的数据需要处理,显然应该使用数组,这种存储具有结构类型数据的数组称为结构数组。与普通数据类型数组不同,结构数组的每个数组元素都是一个结构类型的数据,它们都分别包含各个成员项。定义结构数组变量的语法格式如下:Dim数组变量名(下标上界)As结构名如:DimMyArray(99)AsnewStudents ‘定义结构数组变量1.引用结构数组元素的成员结构数组名(下标).成员名例如,引用前面例中的MyArray结构数组变量的第10个元素的strName成员:DimxAsStringx=MyArray(9).strName

2.结构数组元素间的赋值运算例如,将前面例中的MyArray结构数组变量的第10个元素赋给第1个元素:MyArray(0)=MyArray(9)3.结构成员的输入输出例如对前面例中的MyArray结构数组变量的第10个元素的strName成员进行输出:Debug.WriteLine(MyArray(9).strName) ‘在集成环境的“输出”窗口显示成员值例5.8编写程序实现学生基本信息的数据输入和输出操作。程序代码如下:PublicStructurenewStudentsPublicXHAsString '学号PublicXMAsString '姓名PublicZYMAsString '专业名PublicXBAsString '性别PublicNLAsInteger '年龄EndStructurePrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadConstMAX_STU=2DimarrayXS(MAX_STU)AsnewStudentsDimIAsInteger‘从键盘依次输入每个学生的基本信息ForI=0ToMAX_STUarrayXS(I).XH=InputBox("请输入学号")arrayXS(I).XM=InputBox("请输入姓名.")arrayXS(I).ZYM=InputBox("请输入专业名称")arrayXS(I).XB=InputBox("请输入性别")arrayXS(I).NL=Val(InputBox("请输入年龄"))NextIDebug.WriteLine("")Debug.WriteLine("学号

姓名

专业

性另

年龄")ForI=0ToMAX_STUDebug.Write(arrayXS(I).XH&Space(4))Debug.Write(arrayXS(I).XM&Space(4))Debug.Write(arrayXS(I).XH&Space(4))Debug.Write(arrayXS(I).ZYM&Space(4))Debug.Write(arrayXS(I).XB&Space(4))Debug.Write(arrayXS(I).NL) NextIEndSub5.4综合应用1.选择排序当对数组元素进行排序时,“选择法”比“冒泡法”的效率高。选择排序的算法是:对一个有N个元素的数组进行递增排序,从第2到第N个元素中选出最小值和第1个元素进行比较,如果第1个元素的值大于这个该最小值,则交换两个元素的值,否则什么都不做;再从第3到第N个元素中选出最小值和第2个元素进行比较,如果第2个元素的值大于该最小值,则交换两个元素的值,否则什么都不做……这样,比较完第N-1个元素和第N个元素之后,排序完毕。选择排序程序代码如下:(升序)PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimnAsInteger,k%,temp%DimNum(100)AsIntegerDimi,jAsIntegerRandomize()n=100Fori=1TonNum(i)=Int(100*Rnd()+1)NextiFori=1Ton-1k=iForj=i+1TonIfNum(j)<Num(k)Thenk=jNextjIfk<>iThenTemp=Num(i)Num(i)=Num(k)Num(k)=TempEndIfNextiFori=1TonTextBox1.Text=TextBox1.Text&vbCrLf&Num(i)NextiEndSub2.比较排序比较排序法的原理是这样的,先拿数组的第一个元素I(1)与第二个元素I(2)进行比较,如果I(1)大于I(2)则交换二者的值,如果I(1)不大于I(2)就什么也不做。接着再比较第一个元素I(1)和第三个元素I(3)的值,如果I(1)大于I(3)则交换二者的数据,否则就什么也不做。这样,用第一个元素I(1)和所有的元素进行比较之后,第一个元素I(1)的值就是所有元素中最小的一个。然后,拿第二个元素I(2)和它后面所有的元素进行与上面类似的比较,比较完毕之后,I(2)保存的就是所有元素中的次小值。这样一直循环执行,当比较完I(n-1)与I(n)的大小之后,整个数组中元素的值就已经按从小到大的顺序进行了排列。比较排序法程序代码如下:(降序)PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimnAsInteger,k%,temp%DimNum(100)AsIntegerDimi,jAsIntegerRandomize()n=100Fori=1TonNum(i)=Int(100*Rnd()+1)NextiFori=1Ton '对数组Num中的数进行排序Forj=i+1TonIfNum(i)<Num(j)Thentemp=Num(i)Num(i)=Num(j)Num(j)=tempEndIfNextjNextiFori=1TonTextBox1.Text=TextBox1.Text&vbCrLf&Num(i)NextiEndSub3.学生成绩表表5-1是一张学生成绩表。设计程序,定义一个结构类型,存储表5-1的相关数据,即学号、姓名、性别、成绩l、成绩2、成绩3。学号姓名性别成绩1成绩2成绩3总分201312001万里女908788

201312002王彤女896987

201312003张大力男789085

201312004李丽女858780

201312005钱图男938992

本例的界面设计,需要在窗体中添加7个标签控件,1个文本框控件和1个按钮控件。文本框控件的Multiline属性设置为True,ReadOnly属性设置为True。“输入数据”按钮的Click事件处理程序如下。PublicClassForm1PublicStructurexscjPublicxhAsStringPublicxmAsStringPublicxbAsStringPublicscore()AsSingleEndStructurePrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimstudentAsxscjDimn,sumAsIntegern

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论