第5章 数据结构本章主要内容:结构类型的定义和使用。使用数组。常用的排序算法。使用ListBox列表框控件和ComboBox下拉列表框控件。 数组列表定义与使用。集合定义及使用。枚举类型定义及使用。前面介绍和使用的Boolean类型、Integer类型、Double类型、 String类型等数据都是简单类型,通过定义的变量来存取相应类型的数据。但在一些复杂的应用中,这些简单类型在组织和处理一些数据时可 能不是很有效。比如计算机学院2007级有500名学生的信息需要处理,而每个学生的信息包括其学号、姓名、年龄、家庭住址和E-mail ,如果使用简单类型的变量,则需要声明500×5 = 2500个不同名称的变量!可以想象,要实现对如此庞大数量的变量进行准确引用,即 使对于经验丰富的程序设计人员,也将是一个巨大的挑战!其实,我们分析一下上述需求可以看出,每个学生的信息包括5部分,可以把这5部分关 联在一起形成一个整体(在Visual Basic 2005中可以声明成结构或类),即构造一个新的“复合数据类型”。如果以复合数据类 型声明描述学生信息的变量,则处理500名学生的信息只需要500个变量即可。由于每个学生的信息具有相同的关联成员,因此把500个复合 数据类型变量可以组织成一个在物理存储上连续的列表,这样只要知道了第一个变量的存储地址,其它变量的存储地址也就容易计算得出,进而可以 访问存储地址中学生的信息。由此可见,在程序设计中,需要根据所处理数据的特点,构建一定的数据结构,实现对数据有效的描述、组织和存储, 便于对数据进行快速访问操作和灵活引用!提示:数据结构(Data Structure)主要是指对数据的组织和处理,主要包括三个方面的 含义:① 数据之间的逻辑关系;② 数据在计算机中的存储; ③ 对数据的操作处理。5.1 结构结构是 Visual Basic支持的 用户定义类型 (UDT) 之一,其中包含一个或多个关联的元素,这些元素是结构类型的一部分,可以是基本数据类型变量,也可以是已经定义 的其它结构类型。5.1.1 声明结构声明一个结构类型的基本语句格式为:Public Structure structureName datamemberdeclarationsEnd Structure其中Public Structure和End Structure是关键字,是结构声明的开始和结束。structureName是声明的结构类型的名字,在程序中通过structu reName使用该结构类型。Datamemberdeclarations是结构中的数据成员(元素)的声明部分,声明格式和前面介绍的 通过Dim声明变量的方式一样。结构只是用户自定义的一个类型,结构中的数据成员只是说明该结构关联的变量名称和类型,在声明结构时系统并 不为数据成员分配存储空间,因此数据成员不能有初始值。例如声明如下结构:Public Structure InfoStru Dim Message As String = “Good” ……End Structure Visual Basic 2005通过智能感知,在错误窗口中提示Dim Message As String = “Good”的错误 信息。只有声明该结构类型的变量时,系统才为该变量(即结构中的所有数据成员)分配存储空间。例如:Dim objStu As Stud ent ''声明结构变量objStu系统为objStu分配存储空间,其大小为结构Student中所有数据成员的大小。5 .1.2 访问结构变量的数据成员访问结构变量的数据成员的方式为: 结构变量.数据成员例5.1 声明一个学生信息结构,通过文本 框显示学生信息结构变量数据成员的值。具体操作过程:⑴ 新建项目,选择“Windows应用程序”,项目名称为“学生信息”。⑵ 在解决 资源管理器中把“Form1.vb”文件名改为“学生信息.vb”。⑶ 打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性 :Name为“frmStu1”;StartPosition为“CenterScreen”;Text为“显示学生信息”。⑷ 为窗体添 加5个Label控件,Text分别为“学号:”、“年龄:”、“姓名:”、“地址:”、“E-mail:”。⑸ 为窗体添加5个Text Box控件,Name分别为“txtNo”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。⑹ 为窗体添1个Button控件, Name为“btnShowStudent”,Text为“显示学生信息”。⑺ 添加学生信息结构的声 明:在解决方案资源管理器中用鼠标右键单击项目名“学生信息”,在弹出的上下文菜单中选择“添加”,并从“添加”菜单的子菜单中选择“类” 。如图5-1所示。在弹出的添加新项对话框中,在“名称”后的文本框中输入“student.vb”,单击“添加”,则在代码编辑器中编辑 student.vb,用下面的代码替换现有代码:''声明学生信息结构StudentPublic Structure Student Dim No As String ''学号 Dim Name As String ''姓名 Dim Age As Byte ''年龄 Dim Address As String ''地址 Dim Email As String ''E-mail地址End Structure这时在解决方案资源管理器中出现结构的声明文件 student.vb。⑻ 双击“显示学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码: Private S ub btnShowStudent_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnShowStudent.Click ''声明结构变量 Dim objStu As Student ''为结构变量中的数据成员赋值 objStu.No = "49012011" objStu.Age = 17 objS tu.Name = "李刚" objStu.Address = "陕西省西安市长安南路199号" ob jStu.Email = "cssnnu@gmail.com" ''通过文本框输出结构变量(数据成员)的内容 txtN o.Text = objStu.No txtAge.Text = objStu.Age txtName .Text = objStu.Name txtAddress.Text = objStu.Address txtEmail.Text = objStu.EmailEnd Sub5.2 数组每名学生的信息使用相同的结构进行描述。为了存 储500名学生的信息,同时又要便于对单一学生的信息进行处理,在Visual Basic 2005中,使用数组是解决方案之一。5.2 .1 数组声明与引用声明数组的基本语句格式为:Dim ArrayName(MaxIndex) As DataType其中Array Name是数组名,MaxIndex是数组的索引上限,即数组中所包含的元素的最大下标,数组元素的最小下标是0,这样,声明的数组中共包 含MaxIndex+1个元素,而且每个元素都存储DataType类型的数据。可以通过ArrayName(Index)的形式访问数组 中的元素,这里Index是数组中元素的索引值,其取值范围是[0,MaxIndex],由于只使用一个下标Index索引数组中的元素, 因此这种格式声明的数组又称为一维数组。一维数组元素及索引下标如图5-3所示。可以看出,声明一个数组,就像声明了一批存储空间连续的变 量,只不过这些变量的名称由两部分组成:数组名和索引下标。例5.2 试设计一个简单的学生信息管理程序,要求:① 列出所有学生的名字; ② 选择学生的名字,通过如例1的形式输出学生的信息。分析:要列出所有学生的名字,可以通过ListBox控件实现。具体操作过程:⑴ 新建项目,选择“Windows应用程序”,项目名称为“学生信息管理”。⑵ 在解决方案资源管理器中把“Form1.vb”文件名改为“ 学生信息管理.vb”。⑶ 打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name为“frmStudents”;S tartPosition为“CenterScreen”;Text为“学生信息管理”。⑷ 为窗体添加5个Label控件,Text分别 为“学号:”、“年龄:”、“姓名:”、“地址:”、“E-mail:”。⑸ 为窗体添加5个TextBox控件,Name分别为“txt No”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。⑹ 为窗体添加ListBox控件,N ame为“lstStuName”。⑺ 为窗体添1个Button控件, Name为“btnInputStudents”,Text为“ 导入学生信息”。窗体中控件的布局如图5-4所示。⑻ 导入学生信息结构的声明:在解决方案资源管理器中用鼠标右键单击项目名“学生信息管 理”,在弹出的上下文菜单中选择“添加”,并从“添加”菜单的子菜单中选择“现有项”。在弹出的文件管理对话框中找到例5.1对应的目录“ 学生信息/学生信息”,选择文件student.vb,单击“添加”按钮,则student.vb添加到当前解决方案中。⑼ 在代码编辑器 中,在“Public Class frmStudents”后为类添加成员:Public Class frmStudents ''声明结构变量数组,最多可以保存500名学生的信息 Private objStu(500) As Stude nt''intStuNum记录数组中已经保存学生信息的个数Private intStuNum As Integer ⑽ 为了便于向结 构变量数组添加数据,在⑼步声明的变量的后面定义下面的过程: Private Sub CreateStuInfo(ByV al no As String, ByVal name As String, _ ByVal age As Byte, ByVal address As String, ByVal email As String) ''intStuNum是数组中已经记录学生信息的个数,也是数组中下一个空闲位置的索引下标 ''把学生信息保存到 数组中 objStu(intStuNum).No = no ''保存学号 ob jStu(intStuNum).Name = name ''保存姓名 objStu(intStuNum ).Age = age ''保存年龄 objStu(intStuNum).Address = ad dress ''保存地址 objStu(intStuNum).Email = email ''保存E-ma il ''数组中已保存学生信息的个数加1 intStuNum += 1 End Sub⑾ 定义 显示学生信息的过程: ''显示学生信息 Private Sub ShowStuInfo(ByVal stu As Stu dent) ''通过文本框输出结构变量(数据成员)的内容 txtNo.Text = stu.No txtAge.Text = CStr(stu.Age) txtName.Text = stu.Name txtAddress.Text = stu.Address txtEmail.Text = stu.Ema ilEnd Sub⑿ 双击“导入学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码: Private Sub btnInputStudents_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnInputStudents.Clic k ''清除数组中已经保存学生信息的个数,确保没有重复导入学生信息 intStuNum = 0 ''调用过程CreateStuInfo为结构数组元素的数据成员赋值 CreateStuInfo("49012011 ", "李刚", 17, "西安市长安南路199号", "cssnnu@gmail.com") CreateStuI nfo("49012012", "王涛", 18, "西安市长安南路199号", "wtsnnu@gmail.com") CreateStuInfo("49012013", "张其", 17, "西安市长安南路199号", "zhqsnnu@gm ail.com") ''如果列表框中的内容非空,先清除列表框中的内容 If (lstStuName.Items.Cou nt()) Then lstStuName.Items.Clear() End If ''把数组中元素Name成员的值添加到列表框中 For intC As Integer = 0 To intSt uNum - 1 lstStuName.Items.Add(objStu(intC).Name) Next ''ListBox列表框的第项处于选中状态 lstStuName.SelectedInde x = 0End Sub⒀ 当列表框中的项被选中时,在文本框中显示被选中学生的信息,为此,需要添加列表框中的项被选中事件Selec tedIndexChanged的响应代码: Private Sub lstStuName_SelectedIndexChan ged(ByVal sender As System.Object, _ ByVal e As Sy stem.EventArgs) Handles lstStuName.SelectedIndexChanged ''读 取列表框被选中项的索引下标 Dim intIndex As Integer = lstStuName.Selecte dIndex If intIndex < 0 Then ''如果没有选中任何项 Exit S ub End If ''显示选中的学生的信息 ShowStuInfo(objStu(int Index))End Sub提示:ListBox控件用于显示一个文本项目列表,用户可以选择一个或多个项,进而触发SelectedI ndexChanged事件。ListBox控件列表框中的内容通过集合Items进行组织管理,一些常用方法的含义:lstStuNam e.Items.Count():返回列表框对象lstStuName中项的个数。lstStuNameItems.Clear():清除 列表框对象lstStuName中的内容。lstStuName.Items.Add(objStu(intC).Name):把数组元素 objStu(intC)的Name成员的值添加到ListBox控件对象lstStuName中。lstStuName.Selecte dIndex:返回列表框对象lstStuName中选中的项的索引值(项的索引值从0开始),如果没有选中任何项,则lstCityNa me.SelectedIndex的返回值为-1。还可以通过lstCityName.SelectedItem得到选中的项的对象的引用 。如果要删除项,可以通过ListBox控件的Remove方法实现,如要删除列表框对象lstStuName选中的一个项,语句为:ls tStuName.RemoveAt(lstCityName.SelectedIndex)。例5.2中,声明数组后为数组中的元素进行 了赋值。还可以在声明数组的同时为数组中的元素赋初始值。例如: Dim strCity() As String = {"北京", "西安", "兰州", "天水", "上海"}声明数组并为数组元素赋初始值时,不需要指定数组索引下标的上限,因为初始值的个数确定 数组元素下标的上限。上述语句声明了一个数组strCity,其中共有5个元素。如果要遍历上述5个元素,可以使用For … Next循 环: For intC As Integer = 0 To strCity.Length -1 …… ''遍历数组中的元素 Next注意:strCity.Length返回数组strCity中元素的个数,由于元素的索引 下标从0开始,因此数组strCity的最大索引下标是strCity.Length-1。提示:访问数组元素时,如果ArrayName (Index)的下标Index不在[0, MaxIndex]范围之内,则会出现异常!如果要遍历数组中的所有元素,还可以使用For Each … Next循环,这种遍历方式由于不使用下标,可以防止数组元素下标越界,For Each … Next循环的基本语句格式 为:For Each element [ As datatype ] In group语句块Next [ element ]其中e lement的数据类型和group中元素的数据类型一致。For Each … Next循环的执行过程和前面讲述的For运行一样,只 是控制循环的部分改变为每次判断集合中的下一个元素是否存在。例如遍历strCity数组中的元素的代码可可变更为: For E ach strCityName As String In strCity …… ''遍历数组中的元 素 Next5.2.2 二维数组使用一维数组保存的计算机学院2007级500名学生的信息可以看成是一行,每个学生的信息通过唯一的下 标索引进行访问。如果在学生信息管理程序中,不但要保存2007级学生的信息,还要保存2005和2006级学生的信息,这样访问某一学生 的信息时,则需要两个索引值,一是学生所在的年级索引,二是在该年级学生的索引。为此,可以使用Visual Basic中的二维数组实现 ,如图5-6所示。可以看出,同一行中的学生具有相同的年级索引(第一个索引值相同),但在同一年级,每个学生又有不同的索引(第二个索引 值),这两个索引值构成一个二元组,可以唯一标识每一个学生。声明和引用二维数组和一维数组在格式上类似,只是在维数上不同。例5.3 在 例5.2的基础上增加学生信息管理程序的功能,要求:① 列出指定年级学生的名字;② 选择学生的名字,通过如例1的形式输出学生的信息。 分析:列出年级名称通过ComboBox下拉列表实现。为了实现当选中的年级名称变化时列表框中学生的名字也随之变化,需要在ComboB ox下拉列表框的SelectedIndexChanged事件中更新ListBox列表框的内容。具体操作过程:新建项目的⑴-⑻步和例 5.2相同,为了区别,把该项目的“名称”修改为“学生信息管理2”,并将Form1窗体属性的Text改为“学生信息管理(2)”。该项 目需要新添的内容有:⑼ 为窗体添加ComboBox控件,Name为“cbxGrade”。窗体中控件的布局如图5-7所示。⑽ 在代码 编辑器中,在“Public Class frmStudents”后为类添加成员: ''声明结构变量二维数组,行为年级索引,列为同一 年级学生的索引 Private objStu(2, 2) As Student注意:本例中假定共有3个年级,每个年级有3名学 生。⑾ 在“Public Class frmStudents”中定义下面的过程:Private Sub CreateStuInfo (ByVal intGrade As Integer, ByVal intC As Integer, _ ByVal no As String, ByVal name As String, ByVal age As Byte, _ ByVal address As String, ByVal email As String) ''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 = email End Sub⑿ 同例5 .2的⑾步。⒀ 双击“导入学生信息”按钮,在代码编辑器中添加对该按钮Click事件响应的代码: Private Sub bt nInputStudents_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnInputStudents.Click ''调用过程CreateStuInfo为结构数组元素的数据成员赋值 CreateStuInfo(0, 0, "406 12011", "刘智", 17, "西安市长安南路199号", "lzsnnu@gmail.com") CreateS tuInfo(0, 1, "40612012", "张瑞", 18, "西安市长安南路199号", "zhrsnnu@gmail. com") CreateStuInfo(0, 2, "40612013", "李欣", 17, "西安市长安南路199号 ", "lixsnnu@gmail.com") CreateStuInfo(1, 0, "40712011", "李刚" , 17, "西安市长安南路199号", "cssnnu@gmail.com") CreateStuInfo(1, 1, "40712012", "王涛", 18, "西安市长安南路199号", "wtsnnu@gmail.com") Cr eateStuInfo(1, 2, "40712013", "张其", 17, "西安市长安南路199号", "zhqsnnu@g mail.com") CreateStuInfo(2, 0, "40812011", "魏其", 17, "西安市长安南 路199号", "wqisnnu@gmail.com") CreateStuInfo(2, 1, "40812012", "古德", 18, "西安市长安南路199号", "gudesnnu@gmail.com") CreateStuInf o(2, 2, "40812013", "王奇", 17, "西安市长安南路199号", "wangqsnnu@gmail.com ") ''如果ComBox下拉列表框中的内容非空,先清除列表框中的内容 If (cbxGrade.Items.Coun t()) Then cbxGrade.Items.Clear() End If ''把年级名称添加到ComBox下拉列表框中 For intC As Integer = 0 To 2 cbxGrade.Items.Add(2006 + intC) Next ''设置默认选中的项目 索引为 cbxGrade.SelectedIndex = 0 ''使ComboBox下拉列表框的第一个项处于选中 状态 ''设置默认选中的项目索引为 cbxGrade.SelectedIndex = 0 ''使ComboBox下 拉列表框的第一个项处于选中状态 ''如果List列表框中的内容非空,先清除列表框中的内容 If (lst StuName.Items.Count()) Then lstStuName.Items.Clear() End If ''默认把行号是的数组中元素Name成员的值添加到列表框中() For int C As Integer = 0 To 2 lstStuName.Items.Add(objStu(0, i ntC).Name) Next ''设置默认选中的项目索引为 lstStuName.Sel ectedIndex = 0 ''使ListBox列表框的第一个项处于选中状态End Sub⒁ 当ComboBox下拉列表框中选 中项(年级名称)发生改变时,需要更新ListBox列表框中学生的名字和输出文本框中学生的信息,为此,需要添加ComboBox下拉列 表框中项被选中事件SelectedIndexChanged的响应代码: Private Sub cbxGrade_Select edIndexChanged(ByVal sender As System.Object, _ B yVal e As System.EventArgs) Handles cbxGrade.SelectedIndexChanged ''读取ComoBox下拉列表框被选择项的索引下标Dim intGrade As Integer = cbxGrade.Select edIndexIf intGrade < 0 Then ''如果没有选中任何项intGrade = 0 ''设置为默认选中项目的索引为cbxGrade.SelectedIndex = 0 ''使Com oBox下拉列表框第一个项处于选中状态End If''根据ComboBox下拉列表框的选中项的索引intGrade,更新ListBo x列表框的内容''清除ListBox列表框的内容lstStuName.Items.Clear()''在ListBox下拉列表框添加年级 索引为intGrade的学生的名字For intS As Integer = 0 To 2lstStuName.Items.Add (objStu(intGrade, intS).Name)NextlstStuName.SelectedIndex = 0 '' 使ListBox列表框的第一个项处于选中状态Dim intC As Integer = lstStuName.SelectedIn dex''显示选中的学生的信息ShowStuInfo(objStu(intGrade, intC))End Sub⒂ 当ListBo x列表框中的项被选中时,在文本框中显示被选中学生的信息,为此,需要添加列表框中的项被选中事件SelectedIndexChange d的响应代码: Private Sub lstStuName_SelectedIndexChanged(ByVal send er As System.Object, _ ByVal e As System.EventArgs ) Handles lstStuName.SelectedIndexChanged ''读取ComBox下拉列表框被选 择项(年级)的索引下标 Dim intGrade As Integer = cbxGrade.SelectedInd ex If intGrade < 0 Then ''如果没有选中任何项 intGrade = 0 ''设置为默认选中项目的索引为 cbxGra de.SelectedIndex = 0 ''使ComboBox下拉列表框的第一个项处于选中状态 End If ''读取ListBox下拉列表框被选择项的索引下标 Dim intC As Integer = lstStuName. SelectedIndex If intC < 0 Then ''如果没有选中任何 项 intC = 0 ''设置为默认选中项目的索引为 lstStuName.SelectedIndex = 0 ''使ListBox列表框的第一个项处于选中状态 End If ''显示选中的学生的信息 ShowStuInfo(objStu(intGrade, intC))End Sub5.2.3 多维数组如果在学生信息管理程序中,不同的学生属于不同的院系,同一院系的学生又属于不同的年级, 同一年级的学生又有不同的索引,即每一个学生需要三个索引值。为此,可以通过Visual Basic中的三维数组实现,如图5-9所示。 5.2.4 改变数组的大小在某一过程中,如果某个已声明的数组包含的元素太多、或包含的元素太少,可以使用ReDim语句来更改该数组的 一个或多个维度的大小。更改数组大小的基本语句格式为:ReDim [ Preserve ] ArrayName(boundlist) [ , name(boundlist) [, ... ] ]其中ArrayName是需要被更改大小的数组的名称。Visual B asic 2005执行ReDim语句时,首先根据boundlist所描述的数组各个维度的大小创建一个新数组,如果有Preserve ,表示需要把原数组的内容复制到新数组,最后释放原数组的存储空间。如果boundlist所描述的数组各个维度元素个数大于原数组,则新 添加的元素的值为相应数据类型的默认值;如果boundlist所描述的数组各个维度元素个数小于原数组,则有可能原数组的部分内容会丢失 。例如:Dim intArray(10, 10, 10) As Integer''创建新数组,且每一层每一行的结尾比原数组多 10 列,新列中的元素初始化为 0(数组元素类型''Integer 的默认值);并复制原有元素的内容。ReDim Preserve int Array(10, 10, 20) ''创建新数组,且每一层每一行的结尾比原数组减少 5 列,并复制没有被减掉的元素的内容。ReD im Preserve intArray(10, 10, 15) ''创建新数组,且每一层每一行的结尾比原数组减少 5 列,不复制 原数组任何元素内容,将所有元素''还原为原始默认值0。ReDim intArray(10, 10, 10) 提示:ReDim 语句无 法更改数组变量或其元素的数据类型。ReDim 语句无法为数组元素提供新的初始化值。ReDim 语句无法更改数组的维数。5.2.5 使用Array.Sort对基本数据类型一维数组元素排序Visual Basic 2005提供的Array.Sort方法对基本数据类 型数组元素排序的基本调用格式为:Array.Sort(ArrayName,[ LowIndex [ , HighIndex] ]) Array.Sort对数组ArrayName中索引从LowIndex到其中HighIndex的元素进行排序。如果省略LowInde x和HighIndex,则对数组中的所有元素进行排序。例5.4 对一组城市的名称分别按升序和降序排序,并通过文本框输出。具体操作过 程:⑴ 新建项目,选择“Windows应用程序”,项目名称为“一维数组排序”。⑵ 在解决资源管理器中把“Form1.vb”文件名改 为“一维数组排序.vb”。⑶ 打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name为“frmArraySort ”;StartPosition为“CenterScreen”;Text为“一维数组排序演示”。⑷ 为窗体添加1个TextBox控件 ,Name改为“txtOutput”,Multiline改为“True”,ScrollBars改为“Vertical”。⑸ 为窗体 添1个Button控件, Name为“btnDemo”,Text为“演示”。双击“演示”按钮,在代码编辑器中添加对该按钮Click 事件响应的代码: Private Sub btnDemo_Click(ByVal sender As System.Obj ect, ByVal e As System.EventArgs) Handles btnDemo.Click ''声明 一维数组 Dim strCity() As String = {"Beijing", "Xi''an", "Lanzh ou", "Tianshui", "Shanghai", "Guangzhou", "Chengdu"} ''通过文本 框输出数组strCity的内容 txtOutput.Text = "数组的原始内容: " & vbCrLf For Each strCityName As String In strCity txtOutput.Text = txtOutput.Text & strCityName & " " Next txtOutput .Text = txtOutput.Text & vbCrLf & vbCrLf''调用下面的过程,实现对strCity数组元素内容 的排序 MySort(strCity) ''通过文本框输出数组strCity的内容 txtOutput. Text = txtOutput.Text & "使用Array.Sort方法进行递增排序结果:" & vbCrLf For Each strCityName As String In strCity txtOutput.T ext = txtOutput.Text & strCityName & " " Next txtO utput.Text = txtOutput.Text & vbCrLf & vbCrLf ''使用Visual Basic 200 5提供的Array.Sort方法反转数组内容 Array.Reverse(strCity) ''通过文本 框输出数组strCity的内容 txtOutput.Text = txtOutput.Text & "使用Array .Reverse方法反转数组内容(递减排序)结果:" & vbCrLf For Each strCityName As Strin g In strCity txtOutput.Text = txtOutput.Text & strCity Name & " " Next txtOutput.Text = txtOutput.Text & vbCrLf & vbCrLfEnd Sub如果使用Visual Basic 2005提供的Array.Sort方法进行排序,在P ublic Class frmArraySort后为过程MySort添加代码: Private Sub MySort(ByV al str() As String) ''调用Visual Basic 2005提供的Array.Sort方法进行排 序 Array.Sort(str) End Sub5.2.6 用户自定义排序算法对基本数据类型一维数组元素排序 常见的用户自定义的排序算法有冒泡排序,选择排序等,每种排序算法在空间、时间复杂度上有所不同。作为示例,下面主要讨论冒泡排序算法的实 现。同时介绍其它排序算法的思想及其示例代码。⑴ 冒泡排序算法冒泡排序算法的基本思想是:将待排序的元素看作是竖着排列的“气泡”,较小 的元素比较轻,从而要往上浮。对于有n个元素的排序过程,需要进行n-1次扫描(第n次扫描只有1个元素,所以也就不需要扫描了),第1次 扫描找出最小的元素,通过元素比较交换上浮到倒数第1个位置,第2次扫描找出次小的元素,通过元素比较交换上浮到倒数第2个位置,依次类推 ,当扫描n-1次后,所有的元素也就按从大到小的次序排列了。当然,也可以让最大的元素上浮,这样进行n-1次扫描后,所有的元素也就按从 小到大的次序排列了。比如要对4个数1,3,2,4使用冒泡排序算法进行排序,排序过程如图5-12所示。在图5-12中,共进行了3次扫 描,第1次扫描进行了3次交换操作,第2次扫描进行了2次交换操作,第3次扫描进行了1次交换操作。第3次扫描的结果即为排序的结果。从冒 泡排序算法基本思想的描述和图5-12的示例可以看出,要实现冒泡排序算法,需要两重循环,外循环控制是第几次扫描,而内循环控制是本次扫 描的第几次比较。同时,从图5-12可以看出,随着扫描次数的递增,每次扫描中比较的次数在依次减少,这是因为每完成一次扫描,就有一个位 置的数据在最终的排序结果中确定,已经确定位置的数据将不再参与比较。冒泡排序算法的流程图如图5-13所示,得排序的元素保存在数组st r(n)中,其中n为数组中元素的个数。 ''str为待排序的字符串数组,n为字符串的个数 ''使用冒泡排序法进行排序 Pr ivate Sub BubbleSort(ByVal str() As String, ByVal n As Integer) Dim i, j As Integer ''定义控制循环的变量 Dim strtmp As Stri ng ''定义临时字符串变量,用于字符串进行交换操作 For j = 0 To n - 1 For i = 0 To (n - 1) - j - 1 If str(i) > str(i + 1) Then ''字符串进行交换 strtmp = str(i) st r(i) = str(i + 1) str(i + 1) = strtmp End If Next i Next j End Sub过程MySort的 代码修改为: Private Sub MySort(ByVal str() As String) ''调用用户自定 义的排序过程进行排序 BubbleSort(str, str.Length) End Sub⑵ 选择排序算法选 择排序算法的基本思想:对于有n个元素的排序过程,需要进行n-1次扫描(第n次扫描只有1个元素,所以也就不需要扫描了)。第1次扫描找 出最小(或最大)的元素的位置,然后和待排序数组中的第1个元素进行交换;第2次扫描找出次小(或次大)的元素,然后和待排序数组中的第2 个元素进行交换;依次类推,当扫描n-1次后,所有的元素也就有序了。 ''str为待排序的字符串,n为字符串的个数 ''使用选择排 序法进行排序 Private Sub SelectionSort(ByVal str() As String, ByVal n As Integer) Dim i, j As Integer ''定义控制循环的变量 Di m strtmp As String ''定义临时字符串变量,用于字符串进行交换操作 Dim position As Integer ''定义变量,用于记录待交换的元素的位置 For j = 0 To n - 1 posi tion = j ''待交换元素位置的初始值即为当前需要交换位置的值 For i = j + 1 To n - 1 If str(i) < str(position) Then ''如果条件成立, 则记录新的位置 position = i End If ''如果最小元素的位置和当前需要交换的位置不是同一位置,则进行交换 If po sition <> j Then strtmp = str(j) str(j) = str(position) str(position) = s trtmp End If Next i Next jEnd Su b提示:选择排序和冒泡排序的最大差别是:冒泡排序在一次扫描中可能进行多次交换数组元素值的操作,而选择排序在一次扫描中最多进行一次交 换数组元素值的操作。5.2.7使用Array.Sort对用户自定义数据类型一维数组元素排序使用Array.Sort方法对数组元素进 行排序时,需要比较两个数组元素的大小,Visual Basic 2005 已经提供了针对基本数据类型的比较运算规则。但对于用户自定 义的数据类型,如Student结构类型,比较两个Student结构的对象时必须按照对象中的指定数据成员进行比较,两个单纯的Stud ent结构对象由于有多个数据成员,在没有指定进行比较的数据成员前,无法进行比较。为此,使用Array.Sort方法对自定义数据类型 数组元素进行排序时,必须明确指定按照那个或那些数据成员进行比较。对于用户自定义数据类型数组元素的比较,通过Visual Basic 2005 提供的接口 IComparer创建比较器接口,实现对用户自定义数据类型元素的比较,基本实现框架为:Public Cla ss CompareName : Implements IComparer ''实现Compare方法,实现确定的比较含义 Fu nction Compare(ByVal a As Object, ByVal b As Object) As Integer _ Implements System.Collections.IComparer.Compare 具体比较语句 End FunctionEnd ClassArray.Sort方法对用户自定义数据类型数组元素排序的基本调用格式为:A rray.Sort(ArrayName,[ LowIndex [ , HighIndex] ],New CompareName() )CompareName是用户自定义的比较器接口类,通过New CompareName()创建CompareName对象实现对A rrayName数组中用户自定义数据类型的比较。例5.5 在例5.2的基础上,实现ListBox列表框中的学生能够分别按学生的学号 、姓名和年龄排序。具体操作过程,前7步同例5.2,为了区别,把项目名称改为“学生信息管理4”,并将Form1窗体属性的Text为“ 学生信息管理(4)”。。⑻ 为窗体添加一个Panel控件,并为Panel添加三个RadioButton控件,Name分别为“rdb No”、“rdbAge”、“rdbName”, Text分别为“学号”、“年龄”、“姓名”。rdbNo的Checked为True。 ⑼ 在代码编辑器中,在Public Class frmStudents类定义代码End Class之后分别创建三个比较器类:sor tByAge比较器接口类定义:''实现接口IComparer,创建通过年龄(Age)比较两个Student类型变量值的大小Publi c Class sortByAge : Implements IComparer ''实现Compare方法,指定根据 Student 中的Age 进行比较 Function Compare(ByVal a As Object, ByV al b As Object) As Integer Implements _ Sy stem.Collections.IComparer.Compare Dim c1 As Student = C Type(a, Student) Dim c2 As Student = CType(b, Student) If (c1.Age > c2.Age) Then Return 1 End If If (c1.Age < c2.Age) Then Return -1 Else Return 0 End If End Fun ctionEnd ClasssortByNo比较器接口类定义:''实现接口IComparer,创建通过学号(No)比较两个Stude nt类型变量值的大小Public Class sortByNo : Implements IComparer ''实现Comp are方法,指定根据Student 中的No 进行比较 Function Compare(ByVal a As Object , ByVal b As Object) As Integer Implements _ System.Collections.IComparer.Compare Dim c1 As Student = C Type(a, Student) Dim c2 As Student = CType(b, Student) If (c1.No > c2.No) Then Return 1 End If If (c1.No < c2.No) Then Return -1 Else Return 0 End If End FunctionEnd ClasssortByName比 较器接口类:''实现接口IComparer,创建通过(姓名)比较两个Student类型变量值的大小Public Class sort ByName : Implements IComparer ''实现Compare方法,指定根据Student 中的Name 进行比较 Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements _ System.Collections.IComp arer.Compare Dim c1 As Student = CType(a, Student) Dim c2 As Student = CType(b, Student) If (c1.Name > c2.Nam e) Then Return 1 End If If (c1.Name < c2 .Name) Then Return -1 Else Return 0 End If End FunctionEnd Class⑽ 在代码编辑器中“导入学生信息”按钮Click事件响 应的代码中,在ListBox列表框添加内容之前,添加对数组中的内容按学号(No)排序的代码:''判断并清除列表框内容的代码''对数组中 的内容按学号(No)进行排序''New sortByNo()为按照学号排序的比较器接口对象Array.Sort(objStu, 0, intStuNum, New sortByNo()) ''把数组中元素Name、No成员的值添加到列表框中代码 ⑾ 双击rdbNo单选框按钮,在编辑器中添加对CheckedChanged 事件响应的代码: Private Sub rdbN o_CheckedChanged(ByVal sender As System.Object, _ B yVal e As System.EventArgs) Handles rdbNo.CheckedChanged '' 对数组中的内容按学号(No)进行排序 Array.Sort(objStu, 0, intStuNum, New so rtByNo()) ''更新列表框的内容 lstStuName.Items.Clear() For intC As Integer = 0 To intStuNum - 1 lstStuName.I tems.Add(objStu(intC).Name & " " & objStu(intC).No) NextEn d Sub同样,双击rdbName和rdbAge,添加对其CheckedChanged 事件响应的代码,对数组中的内容分别按姓名( Name)和年龄(Age)排序的代码分别是: ''对数组中的内容按姓名(Name)进行排序 Array.Sort (objStu, 0, intStuNum, New sortByName()) ''对数组中的内容按年龄(Age)进行 排序 Array.Sort(objStu, 0, intStuNum, New sortByAge())5.2.8用户自定义 排序算法对用户自定义数据类型一维数组元素排序如果用用户自定义的冒泡排序算法实现对objStu数组中结构体元素进行排序,则在冒泡排序 算法中需要指定按什么数据成员进行排序。代码如下: ''obj为待排序的学生结构体数组,n结构体数组中元素的个数 ''使用冒泡排序法 进行排序Private Sub BubbleSort_Structure(ByVal obj() As Student, _ By Val n As Integer, ByVal judge As String) Dim i, j As Integ er ''定义控制循环的变量 Dim objtmp As Student ''定义临时字符串变量,用于字符串 进行交换操作 Dim exchange As Boolean ''用来标示是否需要交换相邻元素 For j = 0 T o n – 1 For i = 0 To (n - 1) - j - 1 exchange = False Select Case judge.ToLower() ''把字符 串judge转换成小写字符进行比较 Case "name" ''按姓名进行比较 If obj(i).Name > obj(i + 1).Name Then exchange = True End If Case "age" ''按年龄进行比较 If obj(i).Age > obj(i + 1).Age Then ex change = True End If Ca se "no" ''按学号进行比较 If obj(i).No > obj(i + 1).No Then exchange = True End If End Select ''如果需要交换,则交换相邻元素的值 If exchange Then objtmp = obj(i) obj(i) = obj(i + 1) obj(i + 1) = objtmp End If Next i Next j End Sub把rdbName,rdbNo和rdbAge对应的CheckedChanged 事件响应代码中使用Arra y.Sort的代码分别替换成如下代码,调用用户自定义的排序算法进行排序: ''调用 BubbleSort_Struct ure对学生数组中的元素按学生结构体的姓名(Name)进行排序 BubbleSort_Structure(objStu, i ntStuNum, "Name") ''调用 BubbleSort_Structure对学生数组中的元素按学生结构体的 学号(No)进行排序 BubbleSort_Structure(objStu, intStuNum, "No") ''调用 BubbleSort_Structure对学生数组中的元素按学生结构体的年龄(Age)进行排序 BubbleSo rt_Structure(objStu, intStuNum, "Age")5.2.9 数组列表用Visual Basic 200 5提供的ArrayList类,可以创建可变长度的数组列表,这种数组的数据类型为Object,因此在数组元素中可以存放任何类型的数据 。声明数组列表的基本格式为:Dim ArrayName As New ArrayList()数组列表提供的属性有:Count:获取 数组列表中当前数组元素的个数。Item:设置或获取索引所指的数组元素的内容。数组列表提供的主要方法有:Add:将对象加入到数组列表 的最后。Insert:将对象插入到数组指定索引的位置。Remove:删除数组列表中第一个符合指定对象的数组元素。Clear:清除数 组列表中所有的数组元素。IndexOf:返回数组列表中第一个符合指定对象的数组元素的索引值,若找不到,返回一个负值。Sort:将数 组列表中的元素按递增的方式排序。Reverse:将数组列表中的元素反转。BinarySearch:在数组列表中的数组元素按递增排序 的情况下,使用二分查找法从数组列表中查找指定的对象,若找到返回该对象的索引,否则返回一个负值。CopyTo:将数组列表中的全部或部 分数组元素复制到另一个一维数组中。提示:⑴ 在调用Sort进行排序,或调用BinarySearch进行查找时,如果数组列表中保存的 内容不是基本数据类型,需要声明比较器接口。⑵ 在调用IndexOf和Remove时,需要对数组列表元素的内容进行“相等”比较,因此 需要实现数组列表元素类型对应的Equals方法。例5.6 在例5.5的基础上:⑴ 使用数组列表存储学生的信息;⑵ 通过文本框输入的 学生学号查找学生。分析:通过学生学号查找学生可以调用IndexOf方法,但必须在Student结构中实现Equals方法。具体操作 过程:前8步同例5.5,项目名称改为“学生信息管理5”。⑼ 为窗体分别添加一个TextBox控件和一个Button控件,Name分 别为“txtInputNo”、“btnFindByNo”,Button控件Text为“查找”。⑽ 在“Public Class f rmStudents”后删除数组声明,改为声明数组列表: ''声明数组列表 Private objStu As New ArrayList⑾ 数组列表中保存的是对象的引用,因此,需要修改CreateStuInfo方法: Private S ub CreateStuInfo(ByVal no As String, ByVal name As String, _ ByVal age As Byte, ByVal address As String, ByVal emai l As String) ''声明Student结构变量,并为结构变量的每个数据成员赋值 Dim obj St As Student objSt.No = no objSt.Name = name objSt.Age = age objSt.Address = address objSt.Ema il = email ''添加结构变量到数组列表 objStu.Add(objSt) End Su b⑿ 在代码编辑器中“导入学生信息”按钮Click事件响应的代码中按学号(No)排序的代码修改为: ''数组列表元素按 学号(No)进行排序 objStu.Sort(New sortByNo())同样,按姓名(Name)和年龄(Age) 排序的代码分别修改为: ''数组列表元素按姓名(Name)进行排序 objStu.Sort(New so rtByName()) ''数组列表元素按年龄(Age)进行排序 objStu.Sort(New sortB yAge())⒀ 双击“查找”按钮,在代码编辑器中添加对其Click事件相应的代码: Private Sub btnFindB yNo_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnFindByNo.Click Dim strFind As String = txtInputNo.Text ''读取文本框输入的学生的学号 Dim in tIndex As Integer = objStu.IndexOf(strFind) ''根据学生学号索引数组列表中学生信息对象 If (intIndex >= 0) Then ''如果存在学号是strFind的学生,则更新输出框中学生的信息 ''因为数组列表元素类型为Object类型,因此需要使用CType把Object类型转换为Student类型 ''显示选中的学生的信息 ShowStuInfo(objStu(intIndex)) Els e ''如果不存在学号是strFind的学生,则输出提示信息 MessageBox.Show("不存在学号是: " & strFind & " 的学生") End IfEnd Sub⒁ 在解决方案资源管理器中双击“student. vb”,在编辑器中打开student.vb,在结构Student声明语句“End Structure”前添加对Equals方法重载 的代码: ''重载 Equals 方法,根据学生的学号判断两个Student变量是否相等 Public Overrides Function Equals(ByVal obj As Object) As Boolean Dim strCmp As String = CType(obj, String) ''把Object类型转换为String类型 ''如果Equals中的参数“学号”和当前Student变量No的值相同,则认为两个Student变量的值相同 Ret urn Me.No = strCmpEnd Function5.3 集合使用数组列表可轻松创建可变长数组,但数组列表中的元素是Ob ject类型,其中可以保存任何数据类型的对象和数据,并不能保证数组列表中的元素保存的是同一数据类型,这样在一些处理中,可能出现异常 。例如,在例5.5中,在“导入学生信息”按钮Click事件响应代码中,向数组列表添加一个整数: objStu.Add(1 00) ''向数组列表中添加整数由于整数100对于数组列表的Add方法是有效数据,因此不会提示任何错误信息。但运行程序,当执行o bjStu.Sort(New sortByNo())时,出现不能比较数组中两个元素异常,如图5-16所示。为了既象数组列表元素个数 可变长,又能确保元素数据类型的一致性,可以通过Visual Basic 2005提供的System.Collections.Gen eric 命名空间的“泛型”集合,构建强类型集合。System.Collections.Generic 命名空间能够构建强类型集合 的主要类如表5-1所示。需要注意的是对于不同类型的集合,对其中元素的访问方法不同。表5-1 System.Collections. Generic 命名空间能够构建强类型集合的主要类下面主要介绍强类型列表集合。创建和数组列表等效的强类型列表集合,语句格式为:Di m ArrayName As New System.Collections.Generic.List(Of Type)其中Type 是集合中要保存的数据的类型。⑴ 在调用Sort进行排序,或调用BinarySearch进行查找时,如果列表集合中保存的内容不是基本 数据类型,需要声明比较器接口。基本语句框架为:Public Class CompareName : Implements Syst em.Collections. _ Generic.IComparer(Of Type) ''实现Compare方法,实现确定的比较 含义 Function Compare(ByVal c1 As Type, ByVal c2 As Type) As In teger Implements _ System.Collections.Generic.ICompar er(Of Type).Compare 比较语句 End FunctionEnd Class 注意:和数组列表中声明的比较器接口不同的是,在强类型列表集合中,必须明确接口中参数的具体类型,而不是Object类型!⑵ 在调用I ndexOf和Remove时,需要对列表集合元素的内容进行“相等”比较,因此需要实现数组列表元素类型对应的Equals方法。注意: 在数组列表中IndexOf和Remove参数的类型都是Object,可以为其传递任何类型的数据,而在强类型列表集合中,IndexO f和Remove参数的类型必须是强类型声明的类型!例5.7 在例5.6的基础上,使用强类型列表集合存储学生的信息。具体操作过程:前 9步同例5.6,项目名称为“学生信息管理6”。⑽ 在“Public Class frmStudents”后删除数组列表声明,改为强 类型列表集合: ''声明存储Student类型的强类型列表集合 Private objStu As New System. Collections.Generic.List(Of Student)⑾ 在代码编辑器最后分别修改三个比较器类:sortByA ge比较器接口类:''实现接口IComparer,创建通过年龄(Age)比较两个Student类型变量值的大小Public Clas s sortByAge : Implements System.Collections.Generic.IComparer(Of Student) ''实现Compare方法,指定根据Student 中的Age 进行比较 Function Compa re(ByVal c1 As Student, ByVal c2 As Student) As Integer Implement s _ System.Collections.Generic.IComparer(Of Student). Compare If (c1.Age > c2.Age) Then Return 1 End If If (c1.Age < c2.Age) Then Return -1 Else Return 0 End If End FunctionEnd C lasssortByNo比较器接口:''实现接口IComparer,创建通过学号(No)比较两个Student类型变量值的大小Pub lic Class sortByNo : Implements System.Collections.Generic.ICompa rer(Of Student) ''实现Compare方法,指定根据Student 中的No 进行比较 Functi on Compare(ByVal c1 As Student, ByVal c2 As Student) As Integer _ Implements System.Collections.Generic.ICompar er(Of Student).Compare If (c1.No > c2.No) Then Return 1 End If If (c1.No < c2.No) Then Return -1 Else Return 0 End If End Fu nctionEnd ClasssortByName比较器接口:''实现接口IComparer,创建通过(姓名)比较两个Student 类型变量值的大小Public Class sortByName : Implements System.Collections.G eneric.IComparer(Of Student) ''实现Compare方法,指定根据Student 中的Name 进 行比较 Function Compare(ByVal c1 As Student, ByVal c2 As Student) As Integer _ Implements System.Collections.Generic.IC omparer(Of Student).Compare If (c1.Name > c2.Name) Then Return 1 End If If (c1.Name < c2.Name) The n Return -1 Else Return 0 End IfEnd FunctionEnd Class 注意:上述三个比较器和在数组列表中声明的比较器的最大差别是指定了具体的数据类型S tudent!因此,如果在向强类型列表数组中添加对象时,Visual Studio 2005会实时检测,如果检测到类型不匹配,Vi sual Studio 2005 会提示相应信息,如图5-17所示。⑿ 在解决方案资源管理器中双击“student.vb”,在编辑 器中打开student.vb,修改对Equals方法重载的代码: ''重载 Equals 方法,根据学生的学号判断两个Stude nt变量是否相等 Public Overrides Function Equals(ByVal obj As Object) As Boolean Dim objCmp As Student = CType(obj, Student) ''把 Object类型转换为Student类型 ''如果两个Student变量的No值相同,则定义为两个Student变量相 同 Return Me.No = objCmp.NoEnd Function运行程序,结果同图5-15,但例5.7由 于使用强类型列表集合,在数据处理方面比例5.6更安全。5.4 枚举类型枚举类型和结构类型一样,都是用户自定义类型,包含有一组相关联 的成员。但枚举类型中的成员都是常数,其初始值可以在声明枚举类型时指定,也可以使用默认的初始值。这样在程序中只需使用枚举类型成员的名 称,而不需要使用对应的整数值。声明枚举类型的基本语句格式为:Public Enum EnumName As DataType Member1 = initExpression1 Member2 = initExpression2 ……M embern = initExpressionnEnd Enum其中EnumName是枚举类型的名称,Member1,Member 2 ,……, Membern枚举类型的成员列表,initExpression1,initExpression2,……,initEx pressionn分别是枚举类型成员的初始值。 DataType是枚举及其所有成员的数据类型,DataType只能是Byte、In teger、Long、SByte、Short、UInteger、ULong 或 UShort类型之一。 例如:''声明枚举类型Pub lic Enum SexType As Byte Male = 0 Female = 1End Enum''声明枚举类型 变量Dim Sex As SexType''使用枚举类型Dim bytSexMaleNum as Byte = Sex.MaleDim bytSexFemaleNum as Byte = Sex.Female可以看出,枚举类型SexType的成员Male和Female都是常数,其值分别是0和1,都可以用过枚举类型变量Sex进行引用。由于枚举类型的成员是常数,因此枚举类型的成员还可通过如下例的方式引用:Dim bytSexMaleNum as Byte = SexType.Male ''注意SexType是枚举类型的名字Dim bytSexFemaleNum as Byte = SexType.Female ''注意SexType是枚举类型的名字 提示:如果没有为成员指定初始值(initExpression1,initExpression2,……,initExpressionn) ,Visual Basic 将自动初始化成员列表的值:第1个成员的初始值是0,后面的成员依次比前一个成员的值大1。例5.8 在例5.3学生信息管理程序的基础上增加显示学生性别信息的功能。分析:学生的性别使用枚举类型。具体操作过程:在例5.3的基础上,需要新添、修改的内容有:⑴ 为窗体添加一个TextBox控件,Name为“txtSex”。⑵ 单击解决方案资源管理器中的文件student.vb,在声明学生信息结构的前面添加对学生性别进行描述的枚举类型。''声明枚举类型Public Enum SexType As Byte 女 = 0 男 = 1End Enum⑶ 在过程CreateStuInfo的参数列表中增加ByVal sex As SexType: Private Sub CreateStuInfo(ByVal intGrade As Integer, ByVal intC As Integer, _ ByVal no As String, ByVal name As String, ByVal sex As SexType, _ ByVal age As Byte, ByVal address As String, ByVal email As String) 同时在过程的最后(End Sub语句前)增加语句: objStu(intGrade, intC).Sex = sex⑷ 修改调用过程CreateStuInfo为结构数组元素的数据成员赋值的语句:''调用过程CreateStuInfo为结构数组元素的数据成员赋值 CreateStuInfo(0, 0, "40612011", "刘智", SexType.男, 17, "西安市长安南路号", _ "lzsnnu@gmail.com") CreateStuInfo(0, 1, "40612012", "张瑞", SexType.男, 18, "西安市长安南路号", _ "zhrsnnu@gmail.com") CreateStuInfo(0, 2, "40612013", "李欣", SexType.女, 17, "西安市长安南路号", _ "lixsnnu@gmail.com") CreateStuInfo(1, 0, "40712011", "李刚", SexType.男, 17, "西安市长安南路号", _ "cssnnu@gmail.com") CreateStuInfo(1, 1, "40712012", "王涛", SexType.男, 18, "西安市长安南路号", _"wtsnnu@gmail.com") CreateStuInfo(1, 2, "40712013", "张其", SexType.女, 17, "西安市长安南路号", _ "zhqsnnu@gmail.com") CreateStuInfo(2, 0, "40812011", "魏其", SexType.女, 17, "西安市长安南路号", _ "wqisnnu@gmail.com") CreateStuInfo(2, 1, "40812012", "古德", SexType.男, 18, "西安市长安南路号", _ "gudesnnu@gmail.com") CreateStuInfo(2, 2, "40812013", "王奇", SexType.男, 17, "西安市长安南路号", _"wangqsnnu@gmail.com")注意:CreateStuInfo的参数列表中ByVal sex As SexType中,SexType和“SexType.男”都是Byte类型,只不过“SexType.男”是常量1。⑸ 在过程ShowStuInfo中添加显示学生性别信息的语句: txtSex.Text = stu.Sex.ToString ''输出性别信息注意:stu.Sex.ToString 的含义是:把结构变量stu的数据成员Sex的值转换为String类型。由于Sex是枚举类型,因此Sex.ToString转换成的String类型的值为枚举类型成员的名字,即字符串 “男”或“女”。 |
|