第5章数组、枚举与结构本章讲述的主要内容5.1数组概述5.2声明与访问数组5.3控件数组5.4数组的属性与方法5.5自定义数据类型5.1数组概述5.1.1数组与数组元素在C#2005中,把一组具有同一名字、不同下标的下标变量称为数组。例如,A[6]中的A称为数组名,6是下标。一个数组可以含有若干个下标变量(或称数组元素),下标也叫索引(Index),用来指出某个数组元素在数组中的位置。数组中第一个元素的下标默认为0,第二个元素的下标为1,依次类推。所以数组元素的最大下标比数组元素个数少1,即如果某一数组有n个元素,则其最大下标为n-1。例如,一个含有10个元素的数组A,其第一个元素为A[0],最后一个元素为A[9]。数组的下标必须是非负值的整型数据。5.1数组概述5.1.2数组的类型在C#2005中,数组属于引用类型,也就是说在数组变量中存放的是对数组的引用,真正的数组元素数据存放在另一块内存区域中。数组元素在内存中是连续存放的,这是数组元素用下标表示其在数组中位置的根据。C#2005中的数组类型可以对应任何数据类型,即数组可以是基本数据类型,也可以是类类型,例如,可以声明一个文本框(TextBox)类型的数组。C#2005通过.NET框架中的System.Array类来支持数组,因此,可以使用该类的属性与方法操作数组。5.2声明与访问数组5.2.1声明和访问一维数组因为数组是引用类型的变量,所以声明数组的过程与声明类对象相同,包含两个环节,即声明数组变量与数组变量的实例化。1.声明一维数组声明一维数组的一般格式为:类型名称[]数组名;例如:int[]A;上述语句声明了一个名为A的整型数组。数组在声明后必须实例化才可以使用。实例化数组的格式为:数组名称=new类型名称[无符号整型表达式];5.2声明与访问数组5.2.1声明和访问一维数组2.访问数组访问数组就是对数组中的元素进行读写操作,对数组中元素的访问分为,对单个元素的访问与对所有元素的访问两种情况。对数组元素的访问最常见的两种形式是为数组元素赋值和用数组元素的值为其他变量赋值,即对数组元素的读写操作。使用数组名与下标(索引)可以唯一确定数组中的某个元素,从而实现对该元素的访问。例如:intx=4,y=5;int[]A=newint[3]{1,2,3};x=A[0];//使用数组A的第1个元素的值为其他变量赋值A[1]=y;//为数组A的第2个元素赋值5.2声明与访问数组5.2.1声明和访问一维数组2.访问数组访问数组就是对数组中的元素进行读写操作,对数组中元素的访问分为,对单个元素的访问与对所有元素的访问两种情况。对数组元素的访问最常见的两种形式是为数组元素赋值和用数组元素的值为其他变量赋值,即对数组元素的读写操作。使用数组名与下标(索引)可以唯一确定数组中的某个元素,从而实现对该元素的访问。例如:intx=4,y=5;int[]A=newint[3]{1,2,3};x=A[0];//使用数组A的第1个元素的值为其他变量赋值A[1]=y;//为数组A的第2个元素赋值例5-15.2声明与访问数组5.2.1声明和访问一维数组3.foreach循环语句C#2005专门提供了一种用于遍历数组的foreach循环语句。所谓“遍历”是指依次访问数组中所有元素。foreach循环语句的格式为:foreach(类型名称变量名称in数组名称){循环体语句序列}例1.产生6个随机整数,借助于数组对这一组数字进行从小到大排序。2.产生6个随机整数存放于数组中,然后将数组倒序排列并显示在网页上。课堂练习:产生10个1到50之间的随机整数放在数组中,然后求这个数组的最大值与最小值5.2声明与访问数组5.2.2声明和访问多维数组在多维数组中,比较常用的是二维数组,声明二维数组与声明一维数组格式类似。例如:int[,]A=newint[2,2]{{1,2},{3,4}};声明多维数组时,用逗号表示维数,一个逗号表示二维数组,两个逗号表示三维数组,依次类推。上例中的“int[,]A”表示声明一个二维数组;“newint[2,2]”表示实例化数组时,该数组为一个两行两列的数组,其中逗号左边的值为行数,逗号右边的值为列数;为多维数组指定初始化值时,每一行的值须用大括号括起来,行与行之间用逗号分隔。例5-2例利用二维数组制作通讯录,通讯录中保存姓名、电话、QQ等信息,在网页中可以通过姓名查找对应的通讯信息。课堂练习:随机产生一个4行4列的二维数组,计算二维数组各元素的和并显示在网页上。5.3控件数组5.3.1创建控件数组在VS2005中无法使用可视化的方法直接创建控件数组,只能在设计视图中添加独立的同类控件,而后通过代码创建需要的控件数组。1.声明控件数组声明控件数组的语法格式如下:控件类名[]数组名=new控件类名[n];其中,控件类名为各控件在工具箱中的名称,如Label、Button、TextBox等等;数组名为用户指定的数组名称;n为数组包含的元素个数5.3控件数组5.3.1创建控件数组2.为控件数组赋值为控件数组赋值的方法与为普通数组赋值的方法类似,可以在声明数组时赋值,也可以在声明后单独赋值。例如:TextBox[]txtArray=newTextBox[4]{TextBox1,TextBox2,TextBox3,TextBox4,};或:TextBox[]txtArray=newTextBox[4];txtArray[0]=TextBox1;txtArray[1]=TextBox2;txtArray[2]=TextBox3;txtArray[3]=TextBox4;5.3控件数组5.3.2使用控件数组控件数组创建并赋值后,可以象对普通数组那样通过循环操作数组元素,这对简化代码编写是十分有意义的。例5-35.3控件数组5.3.3多控件共享单一事件在程序设计过程中常会遇到页面中同类控件的同类事件问题。例如,在【例4-1】中设计的“简单算术计算器”中有表示+、-、×、÷的4个按钮控件,用户单击按钮采用相应的计算方法。认真阅读程序代码后,可以看到计算方法实际上只有一个运算符不同,其他部分完全相同。此时,若使用多控件共享单一事件的方法,可大幅度减少代码的编写量,使程序更明了易读。1.在源视图中统一事件名称2.编写共享事件过程例5-45.4数组的属性与方法5.4.1数组的常用属性1.数组的Length属性数组的Length属性是数组对象的一个只读属性,该属性的值在数组实例化时被初始化,表示数组包含多少个元素。2.IsReadOnly属性数组具有IsReadOnly属性,该属性可以设置数组或数组列表中的元素是否为只读的。在创建数组时,IsReadOnly属性值默认为false(假),即数组中的元素值允许被读取和修改。如欲保护元素值不被修改,则可以设置该属性值为true(真)。一旦将数组设置为只读的,则任何对数组元素进行修改的操作都将产生错误。5.4数组的属性与方法5.4.2数组的常用方法1.Clone与CopyTo方法克隆(Clone)与拷贝(CopyTo)方法均可以实现数组之间的数据复制。Clone方法的语法格式为:目标数组名称=(数组类型名称)源数组名称.Clone();2.Array.Sort(排序)方法使用数组的Sort方法可以将数组中的元素按升序重新排列。Sort方法的语法格式为:Array.Sort(数组名称);5.4数组的属性与方法5.4.2数组的常用方法3.Array.Reverse(反转)方法数组的Reverse(反转)方法,顾名思义是用于数组元素排列顺序反转的方法。将该方法与Sort方法结合,可以实现降序排序。Reverse方法的语法格式为:Array.Reverse(数组名称,起始位置,反转范围);其中,“起始位置”是指从第几个数组元素开始进行反转;“反转范围”是指有多少数组元素参与反转操作。5.5自定义数据类型5.5.1结构类型1.定义结构结构的定义需要使用struct关键字,定义格式如下:struct结构类型名称{public类型名称1结构成员名称1;public类型名称2结构成员名称2;……}5.5自定义数据类型5.5.1结构类型2.声明结构变量定义结构后,一个新的数据类型就产生了,可以像使用基本数据类型那样,用结构来声明变量。例如:employeetom;//声明一个结构变量tom也可以在声明结构变量的同时,为结构变量赋值,为结构变量赋值实质上是为结构变量中的成员赋值,但由于结构变量常常包含不止一个结构成员,所以在声明时为结构变量赋值需要使用大括号,各项值之间用逗号分隔。例如:employeetom={汤姆,true,{1980,5,26},13868782069,3500};5.5自定义数据类型5.5.1结构类型3.访问结构变量一般对结构变量的访问都转化为对结构中的成员的访问,由于结构中的成员都依赖于一个结构变量,因此使用结构中的成员必须指出访问的结构变量。方法是在结构变量和成员之间通过运算符“.”连接在一起。即:结构变量名.成员名例5-55.5自定义数据类型5.5.2枚举类型1.定义枚举类型定义枚举类型使用关键字enum,定义枚举类型的一般格式为:enum枚举类型名称{符号常量1,符号常量2,…}5.5自定义数据类型5.5.2枚举类型2.声明与访问枚举变量声明枚举变量与声明基本类型变量的格式相同,例如:SolarSystemS;//声明一个枚举变量S可以在声明枚举变量的同时为变量赋值,枚举变量的值,必须是枚举成员,枚举成员需要用枚举类型引导,例如:SolarSystemS=SolarSystem.Sun;对枚举变量的访问如同对基本类型变量的访问,例如:SolarSystemS=SolarSystem.Sun;intiNum=S;//将S的值赋给整型变量iNum课后作业:1.数组中包含有10个数组元素,其值为1~20之间的随机整数,要求编程实现数组进行升序和降序排列;2.某数组有20个元素,元素值为1~20范围内的随机整数,要求将前10个元素与后10个元素互换。即第1个元素与第20个元素互换,第2个元素与第19个元素交换,……,第10个元素与第11个元素互换。程序启动后首先显示原数组各元素的值,单击“交换”按钮显示互换后各元素的值。