《Visual Basic 2005 程序设计》第5章 数据结构_第1页
《Visual Basic 2005 程序设计》第5章 数据结构_第2页
《Visual Basic 2005 程序设计》第5章 数据结构_第3页
《Visual Basic 2005 程序设计》第5章 数据结构_第4页
《Visual Basic 2005 程序设计》第5章 数据结构_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

第5章数据结构1本章主要内容:结构类型的定义和使用。使用数组。常用的排序算法。使用ListBox列表框控件和ComboBox下拉列表框控件。数组列表定义与使用。集合定义及使用。枚举类型定义及使用。2前面介绍和使用的Boolean类型、Integer类型、Double类型、String类型等数据都是简单类型,通过定义的变量来存取相应类型的数据。但在一些复杂的应用中,这些简单类型在组织和处理一些数据时可能不是很有效。比如计算机学院2007级有500名学生的信息需要处理,而每个学生的信息包括其学号、姓名、年龄、家庭住址和E-mail,如果使用简单类型的变量,则需要声明500×5=2500个不同名称的变量!可以想象,要实现对如此庞大数量的变量进行准确引用,即使对于经验丰富的程序设计人员,也将是一个巨大的挑战!3其实,我们分析一下上述需求可以看出,每个学生的信息包括5部分,可以把这5部分关联在一起形成一个整体(在VisualBasic2005中可以声明成结构或类),即构造一个新的“复合数据类型”。如果以复合数据类型声明描述学生信息的变量,则处理500名学生的信息只需要500个变量即可。由于每个学生的信息具有相同的关联成员,因此把500个复合数据类型变量可以组织成一个在物理存储上连续的列表,这样只要知道了第一个变量的存储地址,其它变量的存储地址也就容易计算得出,进而可以访问存储地址中学生的信息。由此可见,在程序设计中,需要根据所处理数据的特点,构建一定的数据结构,实现对数据有效的描述、组织和存储,便于对数据进行快速访问操作和灵活引用!4提示:数据结构(DataStructure)主要是指对数据的组织和处理,主要包括三个方面的含义:①数据之间的逻辑关系;②数据在计算机中的存储;③对数据的操作处理。55.1结构结构是VisualBasic支持的用户定义类型(UDT)之一,其中包含一个或多个关联的元素,这些元素是结构类型的一部分,可以是基本数据类型变量,也可以是已经定义的其它结构类型。65.1.1声明结构声明一个结构类型的基本语句格式为:PublicStructurestructureName

datamemberdeclarationsEndStructure其中PublicStructure和EndStructure是关键字,是结构声明的开始和结束。structureName是声明的结构类型的名字,在程序中通过structureName使用该结构类型。Datamemberdeclarations是结构中的数据成员(元素)的声明部分,声明格式和前面介绍的通过Dim声明变量的方式一样。7结构只是用户自定义的一个类型,结构中的数据成员只是说明该结构关联的变量名称和类型,在声明结构时系统并不为数据成员分配存储空间,因此数据成员不能有初始值。例如声明如下结构:PublicStructureInfoStruDimMessageAsString=“Good”……EndStructureVisualBasic2005通过智能感知,在错误窗口中提示DimMessageAsString=“Good”的错误信息。8只有声明该结构类型的变量时,系统才为该变量(即结构中的所有数据成员)分配存储空间。例如:DimobjStuAsStudent'声明结构变量objStu系统为objStu分配存储空间,其大小为结构Student中所有数据成员的大小。95.1.2访问结构变量的数据成员访问结构变量的数据成员的方式为:结构变量.数据成员10例5.1声明一个学生信息结构,通过文本框显示学生信息结构变量数据成员的值。具体操作过程:⑴新建项目,选择“Windows应用程序”,项目名称为“学生信息”。⑵在解决资源管理器中把“Form1.vb”文件名改为“学生信息.vb”。⑶打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name为“frmStu1”;StartPosition为“CenterScreen”;Text为“显示学生信息”。⑷为窗体添加5个Label控件,Text分别为“学号:”、“年龄:”、“姓名:”、“地址:”、“E-mail:”。⑸为窗体添加5个TextBox控件,Name分别为“txtNo”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。11⑹为窗体添1个Button控件,Name为“btnShowStudent”,Text为“显示学生信息”。⑺添加学生信息结构的声明:在解决方案资源管理器中用鼠标右键单击项目名“学生信息”,在弹出的上下文菜单中选择“添加”,并从“添加”菜单的子菜单中选择“类”。如图5-1所示。图5-1通过解决方案资源管理器添加类的声明12在弹出的添加新项对话框中,在“名称”后的文本框中输入“student.vb”,单击“添加”,则在代码编辑器中编辑student.vb,用下面的代码替换现有代码:'声明学生信息结构StudentPublicStructureStudentDimNoAsString'学号

DimNameAsString'姓名

DimAgeAsByte'年龄

DimAddressAsString'地址

DimEmailAsString'E-mail地址EndStructure这时在解决方案资源管理器中出现结构的声明文件student.vb。13⑻双击“显示学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码:

PrivateSubbtnShowStudent_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnShowStudent.Click'声明结构变量

DimobjStuAsStudent

'为结构变量中的数据成员赋值

objStu.No="49012011"

objStu.Age=17

objStu.Name="李刚"

objStu.Address="陕西省西安市长安南路199号"

objStu.Email="cssnnu@"14

'通过文本框输出结构变量(数据成员)的内容

txtNo.Text=objStu.No

txtAge.Text=objStu.Age

txtName.Text=objStu.Name

txtAddress.Text=objStu.Address

txtEmail.Text=objStu.EmailEndSub155.2数组每名学生的信息使用相同的结构进行描述。为了存储500名学生的信息,同时又要便于对单一学生的信息进行处理,在VisualBasic2005中,使用数组是解决方案之一。165.2.1数组声明与引用声明数组的基本语句格式为:DimArrayName(MaxIndex)AsDataType其中ArrayName是数组名,MaxIndex是数组的索引上限,即数组中所包含的元素的最大下标,数组元素的最小下标是0,这样,声明的数组中共包含MaxIndex+1个元素,而且每个元素都存储DataType类型的数据。17可以通过ArrayName(Index)的形式访问数组中的元素,这里Index是数组中元素的索引值,其取值范围是[0,MaxIndex],由于只使用一个下标Index索引数组中的元素,因此这种格式声明的数组又称为一维数组。一维数组元素及索引下标如图5-3所示。可以看出,声明一个数组,就像声明了一批存储空间连续的变量,只不过这些变量的名称由两部分组成:数组名和索引下标。图5-3一维数组示意图(0)(1)(2)(3)(4)(5)18例5.2试设计一个简单的学生信息管理程序,要求:①列出所有学生的名字;②选择学生的名字,通过如例1的形式输出学生的信息。分析:要列出所有学生的名字,可以通过ListBox控件实现。19具体操作过程:⑴新建项目,选择“Windows应用程序”,项目名称为“学生信息管理”。⑵在解决方案资源管理器中把“Form1.vb”文件名改为“学生信息管理.vb”。⑶打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name为“frmStudents”;StartPosition为“CenterScreen”;Text为“学生信息管理”。⑷为窗体添加5个Label控件,Text分别为“学号:”、“年龄:”、“姓名:”、“地址:”、“E-mail:”。⑸为窗体添加5个TextBox控件,Name分别为“txtNo”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。⑹为窗体添加ListBox控件,Name为“lstStuName”。20⑺为窗体添1个Button控件,Name为“btnInputStudents”,Text为“导入学生信息”。窗体中控件的布局如图5-4所示。图5-4学生信息管理程序窗体设计21⑻导入学生信息结构的声明:在解决方案资源管理器中用鼠标右键单击项目名“学生信息管理”,在弹出的上下文菜单中选择“添加”,并从“添加”菜单的子菜单中选择“现有项”。在弹出的文件管理对话框中找到例5.1对应的目录“学生信息/学生信息”,选择文件student.vb,单击“添加”按钮,则student.vb添加到当前解决方案中。22⑼在代码编辑器中,在“PublicClassfrmStudents”后为类添加成员:PublicClassfrmStudents'声明结构变量数组,最多可以保存500名学生的信息

PrivateobjStu(500)AsStudent'intStuNum记录数组中已经保存学生信息的个数PrivateintStuNumAsInteger23⑽为了便于向结构变量数组添加数据,在⑼步声明的变量的后面定义下面的过程:

PrivateSubCreateStuInfo(ByValnoAsString,ByValnameAsString,_

ByValageAsByte,ByValaddressAsString,ByValemailAsString) 'intStuNum是数组中已经记录学生信息的个数,也是数组中下一个空闲位置的索引下标

'把学生信息保存到数组中

objStu(intStuNum).No=no'保存学号

objStu(intStuNum).Name=name'保存姓名

objStu(intStuNum).Age=age'保存年龄

objStu(intStuNum).Address=address'保存地址

objStu(intStuNum).Email=email'保存E-mail '数组中已保存学生信息的个数加1

intStuNum+=1EndSub24⑾定义显示学生信息的过程:

'显示学生信息

PrivateSubShowStuInfo(ByVal

stuAsStudent)'通过文本框输出结构变量(数据成员)的内容

txtNo.Text=stu.No

txtAge.Text=CStr(stu.Age)

txtName.Text=stu.Name

txtAddress.Text=stu.Address

txtEmail.Text=stu.EmailEndSub25⑿双击“导入学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码:

PrivateSubbtnInputStudents_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnInputStudents.Click'清除数组中已经保存学生信息的个数,确保没有重复导入学生信息

intStuNum=0'调用过程CreateStuInfo为结构数组元素的数据成员赋值

CreateStuInfo("49012011","李刚",17,"西安市长安南路199号","cssnnu@")CreateStuInfo("49012012","王涛",18,"西安市长安南路199号","wtsnnu@")CreateStuInfo("49012013","张其",17,"西安市长安南路199号","zhqsnnu@")26

'如果列表框中的内容非空,先清除列表框中的内容

If(lstStuName.Items.Count())Then

lstStuName.Items.Clear()EndIf'把数组中元素Name成员的值添加到列表框中

ForintCAsInteger=0TointStuNum-1

lstStuName.Items.Add(objStu(intC).Name)Next'ListBox列表框的第项处于选中状态

lstStuName.SelectedIndex=0EndSub27⒀当列表框中的项被选中时,在文本框中显示被选中学生的信息,为此,需要添加列表框中的项被选中事件SelectedIndexChanged的响应代码:

PrivateSublstStuName_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandleslstStuName.SelectedIndexChanged'读取列表框被选中项的索引下标

DimintIndexAsInteger=lstStuName.SelectedIndexIfintIndex<0Then'如果没有选中任何项

ExitSubEndIf'显示选中的学生的信息

ShowStuInfo(objStu(intIndex))EndSub28提示:ListBox控件用于显示一个文本项目列表,用户可以选择一个或多个项,进而触发SelectedIndexChanged事件。ListBox控件列表框中的内容通过集合Items进行组织管理,一些常用方法的含义:lstStuName.Items.Count():返回列表框对象lstStuName中项的个数。lstStuNameItems.Clear():清除列表框对象lstStuName中的内容。29lstStuName.Items.Add(objStu(intC).Name):把数组元素objStu(intC)的Name成员的值添加到ListBox控件对象lstStuName中。lstStuName.SelectedIndex:返回列表框对象lstStuName中选中的项的索引值(项的索引值从0开始),如果没有选中任何项,则lstCityName.SelectedIndex的返回值为-1。还可以通过lstCityName.SelectedItem得到选中的项的对象的引用。如果要删除项,可以通过ListBox控件的Remove方法实现,如要删除列表框对象lstStuName选中的一个项,语句为:lstStuName.RemoveAt(lstCityName.SelectedIndex)。30例5.2中,声明数组后为数组中的元素进行了赋值。还可以在声明数组的同时为数组中的元素赋初始值。例如:

DimstrCity()AsString={"北京","西安","兰州","天水","上海"}声明数组并为数组元素赋初始值时,不需要指定数组索引下标的上限,因为初始值的个数确定数组元素下标的上限。上述语句声明了一个数组strCity,其中共有5个元素。31如果要遍历上述5个元素,可以使用For…Next循环:

ForintCAsInteger=0TostrCity.Length-1……'遍历数组中的元素

Next注意:strCity.Length返回数组strCity中元素的个数,由于元素的索引下标从0开始,因此数组strCity的最大索引下标是strCity.Length-1。提示:访问数组元素时,如果ArrayName(Index)的下标Index不在[0,MaxIndex]范围之内,则会出现异常!32如果要遍历数组中的所有元素,还可以使用ForEach…Next循环,这种遍历方式由于不使用下标,可以防止数组元素下标越界,ForEach…Next循环的基本语句格式为:ForEachelement[Asdatatype]Ingroup语句块Next[element]33其中element的数据类型和group中元素的数据类型一致。ForEach…Next循环的执行过程和前面讲述的For运行一样,只是控制循环的部分改变为每次判断集合中的下一个元素是否存在。例如遍历strCity数组中的元素的代码可可变更为:ForEachstrCityNameAsStringInstrCity……'遍历数组中的元素Next345.2.2二维数组使用一维数组保存的计算机学院2007级500名学生的信息可以看成是一行,每个学生的信息通过唯一的下标索引进行访问。如果在学生信息管理程序中,不但要保存2007级学生的信息,还要保存2005和2006级学生的信息,这样访问某一学生的信息时,则需要两个索引值,一是学生所在的年级索引,二是在该年级学生的索引。为此,可以使用VisualBasic中的二维数组实现,如图5-6所示。35可以看出,同一行中的学生具有相同的年级索引(第一个索引值相同),但在同一年级,每个学生又有不同的索引(第二个索引值),这两个索引值构成一个二元组,可以唯一标识每一个学生。声明和引用二维数组和一维数组在格式上类似,只是在维数上不同。(0,0)(0,2)(0,1)(1,0)(1,2)(1,1)(2,0)(2,2)(2,1)图5-6二维数组示意图年级索引同一年级学生索引(0,y)(1,y)(2,y)(x,0)(x,1)(x,2)36例5.3在例5.2的基础上增加学生信息管理程序的功能,要求:①列出指定年级学生的名字;②选择学生的名字,通过如例1的形式输出学生的信息。分析:列出年级名称通过ComboBox下拉列表实现。为了实现当选中的年级名称变化时列表框中学生的名字也随之变化,需要在ComboBox下拉列表框的SelectedIndexChanged事件中更新ListBox列表框的内容。37具体操作过程:新建项目的⑴-⑻步和例5.2相同,为了区别,把该项目的“名称”修改为“学生信息管理2”,并将Form1窗体属性的Text改为“学生信息管理(2)”。该项目需要新添的内容有:⑼为窗体添加ComboBox控件,Name为“cbxGrade”。窗体中控件的布局如图5-7所示。图5-7学生信息管理2程序窗体设计38⑽在代码编辑器中,在“PublicClassfrmStudents”后为类添加成员:

'声明结构变量二维数组,行为年级索引,列为同一年级学生的索引

PrivateobjStu(2,2)AsStudent注意:本例中假定共有3个年级,每个年级有3名学生。39⑾在“PublicClassfrmStudents”中定义下面的过程:PrivateSubCreateStuInfo(ByVal

intGradeAsInteger,ByVal

intCAsInteger,_ByValnoAsString,ByValnameAsString,ByValageAsByte,_ByValaddressAsString,ByValemailAsString)'intGrade为学生所在年级的索引,intC为同一年级中学生的索引

'把学生信息保存到二维数组元素中

objStu(intGrade,intC).No=no

objStu(intGrade,intC).Name=name

objStu(intGrade,intC).Age=age

objStu(intGrade,intC).Address=address

objStu(intGrade,intC).Email=emailEndSub40⑿同例5.2的⑾步。⒀双击“导入学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码:

PrivateSubbtnInputStudents_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnInputStudents.Click'调用过程CreateStuInfo为结构数组元素的数据成员赋值

CreateStuInfo(0,0,"40612011","刘智",17,"西安市长安南路199号","lzsnnu@")CreateStuInfo(0,1,"40612012","张瑞",18,"西安市长安南路199号","zhrsnnu@")CreateStuInfo(0,2,"40612013","李欣",17,"西安市长安南路199号","lixsnnu@")CreateStuInfo(1,0,"40712011","李刚",17,"西安市长安南路199号","cssnnu@")CreateStuInfo(1,1,"40712012","王涛",18,"西安市长安南路199号","wtsnnu@")CreateStuInfo(1,2,"40712013","张其",17,"西安市长安南路199号","zhqsnnu@")CreateStuInfo(2,0,"40812011","魏其",17,"西安市长安南路199号","wqisnnu@")CreateStuInfo(2,1,"40812012","古德",18,"西安市长安南路199号","gudesnnu@")CreateStuInfo(2,2,"40812013","王奇",17,"西安市长安南路199号","wangqsnnu@")41

'如果ComBox下拉列表框中的内容非空,先清除列表框中的内容

If(cbxGrade.Items.Count())Then

cbxGrade.Items.Clear()EndIf'把年级名称添加到ComBox下拉列表框中

ForintCAsInteger=0To2cbxGrade.Items.Add(2006+intC)Next'设置默认选中的项目索引为

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一个项处于选中状态42

'设置默认选中的项目索引为

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一个项处于选中状态

'如果List列表框中的内容非空,先清除列表框中的内容

If(lstStuName.Items.Count())Then

lstStuName.Items.Clear()EndIf'默认把行号是的数组中元素Name成员的值添加到列表框中()ForintCAsInteger=0To2lstStuName.Items.Add(objStu(0,intC).Name)Next'设置默认选中的项目索引为

lstStuName.SelectedIndex=0'使ListBox列表框的第一个项处于选中状态EndSub43⒁当ComboBox下拉列表框中选中项(年级名称)发生改变时,需要更新ListBox列表框中学生的名字和输出文本框中学生的信息,为此,需要添加ComboBox下拉列表框中项被选中事件SelectedIndexChanged的响应代码:

PrivateSubcbxGrade_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlescbxGrade.SelectedIndexChanged'读取ComoBox下拉列表框被选择项的索引下标DimintGradeAsInteger=cbxGrade.SelectedIndexIfintGrade<0Then'如果没有选中任何项intGrade=0'设置为默认选中项目的索引为cbxGrade.SelectedIndex=0'使ComoBox下拉列表框第一个项处于选中状态EndIf44'根据ComboBox下拉列表框的选中项的索引intGrade,更新ListBox列表框的内容'清除ListBox列表框的内容lstStuName.Items.Clear()'在ListBox下拉列表框添加年级索引为intGrade的学生的名字ForintSAsInteger=0To2lstStuName.Items.Add(objStu(intGrade,intS).Name)NextlstStuName.SelectedIndex=0'使ListBox列表框的第一个项处于选中状态DimintCAsInteger=lstStuName.SelectedIndex'显示选中的学生的信息ShowStuInfo(objStu(intGrade,intC))EndSub45⒂当ListBox列表框中的项被选中时,在文本框中显示被选中学生的信息,为此,需要添加列表框中的项被选中事件SelectedIndexChanged的响应代码:

PrivateSublstStuName_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandleslstStuName.SelectedIndexChanged'读取ComBox下拉列表框被选择项(年级)的索引下标

DimintGradeAsInteger=cbxGrade.SelectedIndexIfintGrade<0Then'如果没有选中任何项

intGrade=0'设置为默认选中项目的索引为

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一个项处于选中状态

EndIf46

'读取ListBox下拉列表框被选择项的索引下标

DimintCAsInteger=lstStuName.SelectedIndexIfintC<0Then'如果没有选中任何项

intC=0'设置为默认选中项目的索引为

lstStuName.SelectedIndex=0'使ListBox列表框的第一个项处于选中状态

EndIf

'显示选中的学生的信息

ShowStuInfo(objStu(intGrade,intC))EndSub475.2.3多维数组如果在学生信息管理程序中,不同的学生属于不同的院系,同一院系的学生又属于不同的年级,同一年级的学生又有不同的索引,即每一个学生需要三个索引值。为此,可以通过VisualBasic中的三维数组实现,如图5-9所示。48图5-9三维数组示意图年级索引同一年级学生索引(x,0,z)(x,1,z)(x,2,z)(x,y,0)(x,y,1)(x,y,2)(2,0,0)(2,0,2)(2,0,1)(0,1,0)(2,1,2)(0,1,1)(0,2,0)(2,2,2)(0,2,1)(1,0,0)(1,0,2)(1,0,1)(0,1,0)(1,1,2)(0,1,1)(0,2,0)(1,2,2)(0,2,1)(0,0,0)(0,0,2)(0,0,1)(0,1,0)(0,1,2)(0,1,1)(0,2,0)(0,2,2)(0,2,1)(0,y,z)(1,y,z)(2,y,z)院系索引495.2.4改变数组的大小在某一过程中,如果某个已声明的数组包含的元素太多、或包含的元素太少,可以使用ReDim语句来更改该数组的一个或多个维度的大小。更改数组大小的基本语句格式为:ReDim[Preserve]ArrayName(boundlist)[,name(boundlist)[,...]]其中ArrayName是需要被更改大小的数组的名称。VisualBasic2005执行ReDim语句时,首先根据boundlist所描述的数组各个维度的大小创建一个新数组,如果有Preserve,表示需要把原数组的内容复制到新数组,最后释放原数组的存储空间。50如果boundlist所描述的数组各个维度元素个数大于原数组,则新添加的元素的值为相应数据类型的默认值;如果boundlist所描述的数组各个维度元素个数小于原数组,则有可能原数组的部分内容会丢失。51例如:DimintArray(10,10,10)AsInteger'创建新数组,且每一层每一行的结尾比原数组多10列,新列中的元素初始化为0(数组元素类型'Integer的默认值);并复制原有元素的内容。ReDimPreserveintArray(10,10,20)'创建新数组,且每一层每一行的结尾比原数组减少5列,并复制没有被减掉的元素的内容。ReDimPreserveintArray(10,10,15)'创建新数组,且每一层每一行的结尾比原数组减少5列,不复制原数组任何元素内容,将所有元素'还原为原始默认值0。ReDimintArray(10,10,10)52提示:ReDim

语句无法更改数组变量或其元素的数据类型。ReDim

语句无法为数组元素提供新的初始化值。ReDim

语句无法更改数组的维数。535.2.5使用Array.Sort对基本数据类型一维数组元素排序VisualBasic2005提供的Array.Sort方法对基本数据类型数组元素排序的基本调用格式为:Array.Sort(ArrayName,[LowIndex[,HighIndex]])Array.Sort对数组ArrayName中索引从LowIndex到其中HighIndex的元素进行排序。如果省略LowIndex和HighIndex,则对数组中的所有元素进行排序。54例5.4对一组城市的名称分别按升序和降序排序,并通过文本框输出。具体操作过程:⑴新建项目,选择“Windows应用程序”,项目名称为“一维数组排序”。⑵在解决资源管理器中把“Form1.vb”文件名改为“一维数组排序.vb”。⑶打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name为“frmArraySort”;StartPosition为“CenterScreen”;Text为“一维数组排序演示”。⑷为窗体添加1个TextBox控件,Name改为“txtOutput”,Multiline改为“True”,ScrollBars改为“Vertical”。55⑸为窗体添1个Button控件,Name为“btnDemo”,Text为“演示”。双击“演示”按钮,在代码编辑器中添加对该按钮Click事件响应的代码:

PrivateSubbtnDemo_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnDemo.Click'声明一维数组

DimstrCity()AsString={"Beijing","Xi'an","Lanzhou","Tianshui","Shanghai","Guangzhou","Chengdu"}'通过文本框输出数组strCity的内容

txtOutput.Text="数组的原始内容:"&vbCrLf56

ForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLf'调用下面的过程,实现对strCity数组元素内容的排序

MySort(strCity)57

'通过文本框输出数组strCity的内容

txtOutput.Text=txtOutput.Text&"使用Array.Sort方法进行递增排序结果:"&vbCrLfForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLf58

'使用VisualBasic2005提供的Array.Sort方法反转数组内容

Array.Reverse(strCity)'通过文本框输出数组strCity的内容

txtOutput.Text=txtOutput.Text&"使用Array.Reverse方法反转数组内容(递减排序)结果:"&vbCrLf59

ForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLfEndSub60如果使用VisualBasic2005提供的Array.Sort方法进行排序,在PublicClassfrmArraySort后为过程MySort添加代码:

PrivateSubMySort(ByVal

str()AsString)'调用VisualBasic2005提供的Array.Sort方法进行排序

Array.Sort(str)EndSub615.2.6用户自定义排序算法对基本数据类型一维数组元素排序常见的用户自定义的排序算法有冒泡排序,选择排序等,每种排序算法在空间、时间复杂度上有所不同。作为示例,下面主要讨论冒泡排序算法的实现。同时介绍其它排序算法的思想及其示例代码。62⑴冒泡排序算法冒泡排序算法的基本思想是:将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。对于有n个元素的排序过程,需要进行n-1次扫描(第n次扫描只有1个元素,所以也就不需要扫描了),第1次扫描找出最小的元素,通过元素比较交换上浮到倒数第1个位置,第2次扫描找出次小的元素,通过元素比较交换上浮到倒数第2个位置,依次类推,当扫描n-1次后,所有的元素也就按从大到小的次序排列了。当然,也可以让最大的元素上浮,这样进行n-1次扫描后,所有的元素也就按从小到大的次序排列了。63比如要对4个数1,3,2,4使用冒泡排序算法进行排序,排序过程如图5-12所示。在图5-12中,共进行了3次扫描,第1次扫描进行了3次交换操作,第2次扫描进行了2次交换操作,第3次扫描进行了1次交换操作。第3次扫描的结果即为排序的结果。64第1次扫描342132413241312413244321第3次扫描3421第2次扫描32413214结果第3次比较第2次比较第1次比较65从冒泡排序算法基本思想的描述和图5-12的示例可以看出,要实现冒泡排序算法,需要两重循环,外循环控制是第几次扫描,而内循环控制是本次扫描的第几次比较。同时,从图5-12可以看出,随着扫描次数的递增,每次扫描中比较的次数在依次减少,这是因为每完成一次扫描,就有一个位置的数据在最终的排序结果中确定,已经确定位置的数据将不再参与比较。冒泡排序算法的流程图如图5-13所示,得排序的元素保存在数组str(n)中,其中n为数组中元素的个数。66开始j=0i=0j<=n-1str(i)<=>str(i+1)i=i+1是图5-13冒泡排序算法流程图是是i<=n-1-j-1str(i)>str(i+1)否否j=j+1否结束67

'str为待排序的字符串数组,n为字符串的个数

'使用冒泡排序法进行排序

PrivateSubBubbleSort(ByVal

str()AsString,ByValnAsInteger)Dimi,jAsInteger'定义控制循环的变量

DimstrtmpAsString'定义临时字符串变量,用于字符串进行交换操作68

Forj=0Ton-1Fori=0To(n-1)-j-1Ifstr(i)>str(i+1)Then'字符串进行交换

strtmp=str(i)

str(i)=str(i+1)

str(i+1)=strtmpEndIfNextiNextjEndSub69过程MySort的代码修改为:

PrivateSubMySort(ByVal

str()AsString)'调用用户自定义的排序过程进行排序

BubbleSort(str,str.Length)EndSub70⑵选择排序算法选择排序算法的基本思想:对于有n个元素的排序过程,需要进行n-1次扫描(第n次扫描只有1个元素,所以也就不需要扫描了)。第1次扫描找出最小(或最大)的元素的位置,然后和待排序数组中的第1个元素进行交换;第2次扫描找出次小(或次大)的元素,然后和待排序数组中的第2个元素进行交换;依次类推,当扫描n-1次后,所有的元素也就有序了。71

'str为待排序的字符串,n为字符串的个数

'使用选择排序法进行排序

PrivateSubSelectionSort(ByVal

str()AsString,ByValnAsInteger)Dimi,jAsInteger'定义控制循环的变量

DimstrtmpAsString'定义临时字符串变量,用于字符串进行交换操作

DimpositionAsInteger'定义变量,用于记录待交换的元素的位置72

Forj=0Ton-1position=j'待交换元素位置的初始值即为当前需要交换位置的值

Fori=j+1Ton-1Ifstr(i)<str(position)Then'如果条件成立,则记录新的位置

position=iEndIf'如果最小元素的位置和当前需要交换的位置不是同一位置,则进行交换

Ifposition<>jThen

strtmp=str(j)

str(j)=str(position)

str(position)=strtmpEndIfNextiNextjEndSub73提示:选择排序和冒泡排序的最大差别是:冒泡排序在一次扫描中可能进行多次交换数组元素值的操作,而选择排序在一次扫描中最多进行一次交换数组元素值的操作。745.2.7使用Array.Sort对用户自定义数据类型一维数组元素排序使用Array.Sort方法对数组元素进行排序时,需要比较两个数组元素的大小,VisualBasic2005已经提供了针对基本数据类型的比较运算规则。但对于用户自定义的数据类型,如Student结构类型,比较两个Student结构的对象时必须按照对象中的指定数据成员进行比较,两个单纯的Student结构对象由于有多个数据成员,在没有指定进行比较的数据成员前,无法进行比较。为此,使用Array.Sort方法对自定义数据类型数组元素进行排序时,必须明确指定按照那个或那些数据成员进行比较。75对于用户自定义数据类型数组元素的比较,通过VisualBasic2005提供的接口IComparer创建比较器接口,实现对用户自定义数据类型元素的比较,基本实现框架为:76PublicClassCompareName:ImplementsIComparer'实现Compare方法,实现确定的比较含义

FunctionCompare(ByValaAsObject,ByValbAsObject)AsInteger_ImplementsSystem.Collections.IComparer.Compare

具体比较语句

EndFunctionEndClass77Array.Sort方法对用户自定义数据类型数组元素排序的基本调用格式为:Array.Sort(ArrayName,[LowIndex[,HighIndex]],NewCompareName())CompareName是用户自定义的比较器接口类,通过NewCompareName()创建CompareName对象实现对ArrayName数组中用户自定义数据类型的比较。78例5.5在例5.2的基础上,实现ListBox列表框中的学生能够分别按学生的学号、姓名和年龄排序。具体操作过程,前7步同例5.2,为了区别,把项目名称改为“学生信息管理4”,并将Form1窗体属性的Text为“学生信息管理(4)”。。⑻为窗体添加一个Panel控件,并为Panel添加三个RadioButton控件,Name分别为“rdbNo”、“rdbAge”、“rdbName”,Text分别为“学号”、“年龄”、“姓名”。rdbNo的Checked为True。⑼在代码编辑器中,在PublicClassfrmStudents类定义代码EndClass之后分别创建三个比较器类:sortByAge比较器接口类定义:79'实现接口IComparer,创建通过年龄(Age)比较两个Student类型变量值的大小PublicClasssortByAge:ImplementsIComparer'实现Compare方法,指定根据Student中的Age进行比较

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.Compare Dimc1AsStudent=CType(a,Student) Dimc2AsStudent=CType(b,Student)

If(c1.Age>c2.Age)Then Return1 EndIf If(c1.Age<c2.Age)Then Return-1 Else Return0 EndIf EndFunctionEndClass80sortByNo比较器接口类定义:'实现接口IComparer,创建通过学号(No)比较两个Student类型变量值的大小PublicClasssortByNo:ImplementsIComparer'实现Compare方法,指定根据Student中的No进行比较

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.CompareDimc1AsStudent=CType(a,Student)Dimc2AsStudent=CType(b,Student)If(c1.No>c2.No)ThenReturn1EndIfIf(c1.No<c2.No)ThenReturn-1ElseReturn0EndIfEndFunctionEndClass81sortByName比较器接口类:'实现接口IComparer,创建通过(姓名)比较两个Student类型变量值的大小PublicClasssortByName:ImplementsIComparer'实现Compare方法,指定根据Student中的Name进行比较

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.CompareDimc1AsStudent=CType(a,Student)Dimc2AsStudent=CType(b,Student)If(c1.Name>c2.Name)ThenReturn1EndIfIf(c1.Name<c2.Name)ThenReturn-1ElseReturn0EndIfEndFunctionEndClass82⑽在代码编辑器中“导入学生信息”按钮Click事件响应的代码中,在ListBox列表框添加内容之前,添加对数组中的内容按学号(No)排序的代码:'判断并清除列表框内容的代码'对数组中的内容按学号(No)进行排序'NewsortByNo()为按照学号排序的比较器接口对象Array.Sort(objStu,0,intStuNum,NewsortByNo())

'把数组中元素Name、No成员的值添加到列表框中代码83⑾双击rdbNo单选框按钮,在编辑器中添加对CheckedChanged

事件响应的代码:

PrivateSubrdbNo_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbNo.CheckedChanged'对数组中的内容按学号(No)进行排序

Array.Sort(objStu,0,intStuNum,NewsortByNo())'更新列表框的内容

lstStuName.Items.Clear()ForintCAsInteger=0TointStuNum-1

lstStuName.Items.Add(objStu(intC).Name&""&objStu(intC).No)NextEndSub84同样,双击rdbName和rdbAge,添加对其CheckedChanged

事件响应的代码,对数组中的内容分别按姓名(Name)和年龄(Age)排序的代码分别是:

'对数组中的内容按姓名(Name)进行排序

Array.Sort(objStu,0,intStuNum,NewsortByName())'对数组中的内容按年龄(Age)进行排序

Array.Sort(objStu,0,intStuNum,NewsortByAge())855.2.8用户自定义排序算法对用户自定义数据类型一维数组元素排序如果用用户自定义的冒泡排序算法实现对objStu数组中结构体元素进行排序,则在冒泡排序算法中需要指定按什么数据成员进行排序。代码如下:

86'obj为待排序的学生结构体数组,n结构体数组中元素的个数

'使用冒泡排序法进行排序PrivateSubBubbleSort_Structure(ByVal

obj()AsStudent,_ByValnAsInteger,ByValjudgeAsString)Dimi,jAsInteger'定义控制循环的变量

DimobjtmpAsStudent'定义临时字符串变量,用于字符串进行交换操作

DimexchangeAsBoolean'用来标示是否需要交换相邻元素87

Forj=0Ton–1Fori=0To(n-1)-j-1exchange=FalseSelectCasejudge.ToLower()'把字符串judge转换成小写字符进行比较

Case"name"'按姓名进行比较

Ifobj(i).Name>obj(i+1).NameThenexchange=TrueEndIfCase"age"'按年龄进行比较

Ifobj(i).Age>obj(i+1).AgeThenexchange=TrueEndIfCase"no"'按学号进行比较

Ifobj(i).No>obj(i+1).NoThenexchange=TrueEndIfEndSelect88

'如果需要交换,则交换相邻元素的值

IfexchangeThen

objtmp=obj(i)

obj(i)=obj(i+1)

obj(i+1)=objtmpEndIfNextiNextjEndSub89把rdbName,rdbNo和rdbAge对应的CheckedChanged

事件响应代码中使用Array.Sort的代码分别替换成如下代码,调用用户自定义的排序算法进行排序:

'调用BubbleSort_Structure对学生数组中的元素按学生结构体的姓名(Name)进行排序

BubbleSort_Structure(objStu,intStuNum,"Name")'调用BubbleSort_Structure对学生数组中的元素按学生结构体的学号(No)进行排序

BubbleSort_Structure(objStu,intStuNum,"No")'调用BubbleSort_Structure对学生数组中的元素按学生结构体的年龄(Age)进行排序

BubbleSort_Structure(objStu,intStuNum,"Age")905.2.9数组列表用VisualBasic2005提供的ArrayList类,可以创建可变长度的数组列表,这种数组的数据类型为Object,因此在数组元素中可以存放任何类型的数据。声明数组列表的基本格式为:DimArrayNameAsNewArrayList()91数组列表提供的属性有:Count:获取数组列表中当前数组元素的个数。Item:设置或获取索引所指的数组元素的内容。92数组列表提供的主要方法有:Add:将对象加入到数组列表的最后。Insert:将对象插入到数组指定索引的位置。Remove:删除数组列表中第一个符合指定对象的数组元素。Clear:清除数组列表中所有的数组元素。IndexOf:返回数组列表中第一个符合指定对象的数组元素的索引值,若找不到,返回一个负值。Sort:将数组列表中的元素按递增的方式排序。Reverse:将数组列表中的元素反转。Bi

温馨提示

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

评论

0/150

提交评论