资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章 数 组,7.1,声明和创建数组,7.2,多维数组,7.3,交错数组,7.4,foreach语句,7.5,数组与方法,7.6,Array,类,7.7,习题,7.1,声明和创建数组,数组是数据类型相同、数目一定的变量的有序集合,组成数组的变量称为该数组的元素。,内存分配时,数组对应着一组顺序排放的存储单元,数组中的每个元素按照创建时的次序在其中存放。,C#,语言中,数组是一种,引用类型,。使用前需要声明和创建。,7.1.1,声明数组,一维数组的声明形式:,数据类型,数组名,例:,int,a;,string,str,;,数据类型:,可以是,C#,中任意的数据类型,:表明后面的变量是一个数组类型,必须放在数组名之前,数组名:遵循标识符的命名规则,7.1.1,声明数组(续),数组是一种引用类型。声明数组只是声明了一个用来操作该数组的引用,并不会为数组元素实际分配内存空间。因此,声明数组时,不能指定数组元素个数。例如:,int5 a;,/,错误,int,b;,/,错误,7.1.2,创建数组,声明数组后,在访问其元素前必须为数组的元素分配相应内存,即创建数组。创建一维数组形式如下:,数组名,new,数据类型,数组元素个数,指定数组元素个数的表达式的值必须是一个大于或等于,0,的整数,.,例:,a=new int5;,数组的声明和创建可以出现在同一条语句中。,int,a=new int5;,7.1.2,创建数组(续),访问数组中的元素:,数组名,索引表达式,注意:索引表达式的最大值是数组元素个数减,1,,,如果指定的索引表达式的值大于最大值或小于,0,,程序运行时,将会引发异常。,例,7-1,创建数组,源代码,运 行,例,7-1,创建数组,using,System;,public,class,CreateArray,public,static,void,Main(),int,a=,new,int,4;,double,d=,new,double,3;,bool,b=,new,bool,2;,object,o=,new,object,3;,Console,.Write(,int,);,for,(,int,i=0;ia.Length;i+),Console,.Write(,ta0=1,i,ai);,例,7-1,创建数组(续),Console,.Write(,ndouble,);,for,(,int,i=0;i d.Length;i+),Console,.Write(,td0=1,i,di);,Console,.Write(,nbool,);,for,(,int,i=0;i b.Length;i+),Console,.Write(,tb0=1,i,bi);,Console,.Write(,nobject,);,for,(,int,i=0;i,o.Length,;i+),Console,.Write(,to0=1,i,oi);,Console,.WriteLine,();,7.1.2,创建数组(续),C#,语言中,所有数组类型都是从,System.Array,抽象类派生出来的。例,7-1,中使用的属性,Length,就是,Array,类定义的,它返回的是当前数组中元素的个数。,从例,7-1,中可知,数组的元素一定有初值,默认值与类中字段的值一致。,7.1.2,创建数组(续),引用类型数组中保存的只是对象引用。在访问这些对象的成员前,必须使用,new,运算符创建实际的对象。,例,7-2,引用类型数组,源代码,运 行,例,7-2,引用类型数组,using,System;,public,class,A,private,int,i;,public,A(,int,a),i=a;,public,int,I,get,return,i;,例,7-2,引用类型数组(续),public,class,ObjectArray,public,static,void,Main(),A,a=,new,A,3;,Console,.WriteLine(,ta.Length,=0,a.Length,);,for,(,int,i=0;i a.Length;i+),Console,.Write(,ta0=1,i,ai);,Console,.WriteLine,();,for,(,int,i=0;i,a.Length,;i+),ai,=,new,A,(2*i);,for,(,int,i=0;i a.Length;i+),Console,.Write(,ta0.I=1,i,ai.I);,Console,.WriteLine();,7.1.2,创建数组(续),由例,7-2,可知,创建引用类型数组后,可以通过其属性,Length,查询数组中对象引用的个数。,因为这些引用并不一定引用了某个实际对象,因此,,Length,返回的只是数组中可能存在的实际对象的最大值,而非实际对象个数。,如果要判断数组中某个位置的引用是否引用了实际对象,可以通过检查该引用的值是否为,null,来实现。,7.1.2,创建数组(续),创建数组时可以给数组元素指定初始值,要求初始值的个数与数组创建的元素的个数一致。例如:,int,b=new int31,2,3,;,int,c=new int41,2,3,;/,错误,最后一个初值后的逗号可以不写,注意:在这种初始化形式中,方括号内用于指定数组元素个数的表达式必须是一个常量表达式。例如:,int,i=3;,int,c=new inti1,2,3,;/,错误,int,d=new int2+11,2,3,;/,正确,7.1.2,创建数组(续),用于初始化的值的个数必须与数组中元素的个数相同,因此,上述初始化表达式中完全可以不用显式给出元素的个数。,int,b=new int1,2,3;,/,有,3,个元素,更简洁的初始化方式:,int,b=1,2,3,;,/,只能与数组声明出现在同一条语句中,int,b;,b=1,2,3;,/,错误,而:,int,b;,b=new int1,2,3;/,正确,例7-3,初始化数组,using,System;,public,class,A,private,int,i;,public,A(,int,a),i=a;,public,int,I,get,return,i;,例7-3,初始化数组,(续),public,class,InitArray,public,static,void,Main(),int,b=1,2,3;,double,d=,new,double,1.2,2.4;,A,a1=,new,A,(1),new,A,(2);,A,a2;,a2=,new,A,3,new,A,(2),new,A,(4),new,A,(6),;,for,(,int,i=0;ib.Length;i+),Console,.Write(,tb0=1t,i,bi);,Console,.WriteLine();,例7-3,初始化数组,(续),for,(,int,i=0;i d.Length;i+),Console,.Write(,td0=1,i,di);,Console,.WriteLine();,for,(,int,i=0;i a1.Length;i+),Console,.Write(,ta1,+i+,.I=,+a1i.I);,Console,.WriteLine,();,for,(,int,i=0;i a2.Length;i+),Console,.Write(,ta2,+i+,.I=,+a2i.I);,Console,.WriteLine,();,7.2,多维数组,多维数组声明语法形式,数据类型,数组名,;,多维数组就是指能用多个下标访问的数组。在声明时方括号内加逗号,就表明是多维数组,有,n,个逗号,就是,n+1,维数组。,例:,int,array;,array=new int3,2;,int,array=new int2,3,4;,7.2,多维数组(续),创建多维数组时,可以同时初始化,:,int,array1=new int4,2,1,2,3,4,5,6,7,8 ;,int,array2=new int,2,1,3,1,2,3 ,4,5,6 ;,int,array2=new int,1,2,3 ,4,5,6 ;,7.2,多维数组(续),也可以采用如下形式声明并创建一个多维数组:,int,array4=1,2,3,4,5,6,7,8 ;,注意:这种简洁方式只能与数组声明出现在同一条语句中。,7.2,多维数组(续),创建一个多维数组后,就可以通过下述表达式访问其中的元素:,数组名,索引表达式,1,,索引表达式,2,,,其中,每个索引表达式的值都必须在,0,到它指定的维度的大小减,1,之间。,例,7-4,多维数组,源代码,运 行,using,System;,public,class,DimArray,public,static,void,Main(),int,array=1,2,3,4,5,6 ;,for,(,int,i=0;i array.GetLength(0);i+),for,(,int,j=0;j array.GetLength(1);j+),Console,.WriteLine(,array01=2,i,j,arrayi,j);,Console,.WriteLine();,Console,.WriteLine(,array.GetLength(0)=0,array.GetLength(0);,Console,.WriteLine(,array.GetLength(1)=0,array.GetLength(1);,Console,.WriteLine(,array.Length,=0,array.Length,);,Console,.WriteLine(,array.Rank,=0,array.Rank,);,Length:,返回当前数组中元素的个数,Rand:,返回当前数组维数,GetLength,:,返回当前数组中指定维的长度,课堂练习,定义一个数组,存放一组数据(,10,个整型),找出这组数中最大数和最小数。,using,System;,class,MaxMin,public,static,void,Main(),int,max,min;,int,queue=,new,int,10 89,78,65,52,90,92,73,85,91,95;,max=min=queue0;,for,(,int,i=1;i max)max=queuei;,if,(queuei min)min=queuei;,Console,.WriteLine(,最大数是,0,,最小数是,1,max,min);,7.3,交错数组,数组元素是数组对象的数组通常被称作,交错数组,。它的内部每个数组的长度可以不同,就像一个锯齿形状。交错数组声明:,数组类型,数组名,;,方括号,的个数与数组的维数相关。,例:,int,jaggedArray,=new int3;,从本质上说,它是一个由,3,个元素组成的一维数组,其中每个元素都是一个一维,int,型数组。,7.3,交错数组(续),交错数组是数组的数组,因此,从本质上说它是一种引用类型的一维数组,元素默认值为,null,。在访问其元素前,必须使用,new,运算符初始化:,jaggedArray0=new int5;,jaggedArray1=new int4;,jaggedArray2=new int2;,交错数组元素中所包含元素的个数可以不同。因此交错数组亦称为不规则数组。,7.3,交错数组(续),可以使用初始值列表来初始化交错数组元素:,jaggedArray0=new,int,1,3,5,7,9;,jaggedArray1=new,int,0,2,4,6;,jaggedArray2=new,int,11,22;,7.3,交错数组(续),可以在声明交错数组时直接初始化:,int,jaggedArray,=new,int,new,int,1,3,5,7,9,new,int,0,2,4,6,new,int,11,22;,可以使用下面简介方式:,int,jaggedArray3=,new,int,1,3,5,7,9,new,int,0,2,4,6,new,int,11,22;,7.3,交错数组(续),对于上述定义,可以使用如下例所示形式访问交错数组中的个别元素:,jaggedArray301=77;,jaggedArray321=88;,7.3,交错数组(续),可以混合使用交错数组和多维数组:,int,jaggedArray4=new int3,new,int,1,3,5,7,new,int,0,2,4,6,8,10,new,int,11,22,99,88,0,9,;,对于上述定义,可以使用如下例所示形式访问个别元素:,System.Console.Write(0,jaggedArray401,1);,/,值为,7,System.Console.Write(0,jaggedArray412,1);,/,值为,10,7.3,交错数组(续),与多维数组不同,对于交错数组,属性,Length,返回的是包含在当前交错数组中的数组元素的数目。,例:,System.Console.WriteLine,(,jaggedArray4.Length);,/,输出值,3,7.3,交错数组(续),必须注意,即使某个交错数组是“矩形”或“长方体”等形状,也不能使用下述方法创建:,int,array=new int34;,例,7-5,交错数组,源代码,运 行,using,System;,class,JaggedArray,static,void,Main(),int,arr,=,new,int,2;,arr0=,new,int,5 1,3,5,7,9;,arr1=,new,int,4 2,4,6,8;,for,(,int,i=0;i,arr.Length,;i+),Console,.Write(,Element(0):,i);,for,(,int,j=0;j=60,的数据显示,并统计,=60,的元素个数。使用,foreach,语句实现。,using,System;,class,ForExam,public,static,void,Main(),int,count;,int,arrayNum,=,new,int,3,4 98,76,87,65,55,68,57,84,91,100,58,76 ;,count=0;,foreach,(,int,x,in,arrayNum,),if,(x=60),count+;,Console,.Write(,0,4:d,x);,7.5,数组与方法,7.5.1,将数组传递给方法,7.5.2,参数数组,7.5.3 Main,方法和命令行参数,7.5.4,返回数组,7.5.1,将数组传递给方法,数组是一种引用类型,其对象可以用作参数传递给方法。这种传递属于引用传递。,例,7-7,将数组传递给方法,源代码,运 行,例,7-7,将数组传递给方法,using,System;,public,class,PassByArray,public,static,void,Main(),int,array1=1,2,3;,int,array2=array1;,int,array3;,例,7-7,将数组传递给方法(续),Console,.WriteLine,(,以值参数传递一维数组:,);,Console,.Write,(,调用前:,);,foreach,(,int,i,in,array1),Console,.Write,(,0,i);,Console,.WriteLine,();,FirstDouble(array1);,Console,.Write,(,调用后:,);,foreach,(,int,i,in,array1),Console,.Write(,0,i);,Console,.WriteLine(,n,);,例,7-7,将数组传递给方法(续),Console,.WriteLine,(,以引用参数传递数组:,);,Console,.Write,(,调用前:,);,foreach,(,int,i,in,array2),Console,.Write(,0,i);,Console,.WriteLine();,SecondDouble(,ref,array2);,Console,.Write(,调用后:,);,foreach,(,int,i,in,array2),Console,.Write(,0,i);,Console,.WriteLine(,n,);,例,7-7,将数组传递给方法(续),Console,.WriteLine(,以输出参数传递数组:,);,Console,.WriteLine(,调用前没有初始化,);,FillArray(,out,array3);,Console,.Write(,调用后:,);,foreach,(,int,i,in,array3),Console,.Write(,0,i);,Console,.WriteLine(,n,);,Console,.WriteLine(,以值参数传递多维数组:,);,PrintArray(,new,int,1,2,3,4,5,6,7,8 );,例,7-7,将数组传递给方法(续),public,static,void,FirstDouble(,int,array),for,(,int,i=0;iarray.Length;i+),arrayi,*=2;,array=,new,int,11,22,33;,public,static,void,SecondDouble(,ref,int,array),for,(,int,i=0;iarray.Length;i+),arrayi,*=2;,array=,new,int,11,22,33;,例,7-7,将数组传递给方法(续),public,static,void,FillArray(,out,int,arr,),arr,=,new,int,5 1,2,3,4,5;,public,static,void,PrintArray(,int,arr,),for,(,int,i=0;i arr.GetLength(0);i+),for,(,int,j=0;j arr.GetLength(1);j+),Console,.WriteLine(,tElement(0,1)=2,i,j,arri,j);,7.5.2,参数数组,所谓参数数组是指用关键字,params,修饰的数组类型的,形式参数,。,使用参数数组,可以直接传递同一类型的数目可变的参数,从而简化了编程。例:,class A,public static void,Method(params,int,array),7.5.2,参数数组(续),对于上述方法,完全可以使用下述语句调用:,A.Method(1,2),编译器会将上述调用语句转换成类似如下的代码:,int,array=new int1,2;,A.Method(array,);,当然也可以使用下述语句调用:,A.Method(1,2,3),7.5.2,参数数组(续),向参数数组传递多个参数时,实际上,编译器会将这些参数写入一个数组,然后传递给它。因此,参数数组除了可以用多个与参数数组元素类型相容的参数初始化外,还可以用一个元素类型与参数数组的元素类型相同的数组初始化。,例,7-8,使用参数数组,源代码,运 行,例,7-8,使用参数数组,using,System;,public,class,UseParams,public,static,void,ParamsMethod1(,params,int,array),for,(,int,i=0;i array.Length;i+),Console,.Write(,t0,arrayi);,Console,.WriteLine(,n,);,例,7-8,使用参数数组(续),public,static,void,ParamsMethod2(,params,object,array),for,(,int,i=0;i array.Length;i+),Console,.Write(,t0,arrayi);,Console,.WriteLine(,n,);,例,7-8,使用参数数组(续),static,void,Main(),ParamsMethod1(1,2,3),/,传递多个不同类型的参数,但它们都可以隐式转换成,object,型,ParamsMethod2(11,a,bbb,44,);,int,array=,new,int,3 111,222,333;,ParamsMethod1(array);,/,传递数组参数,7.5.2,参数数组(续),使用关键字,params,修饰的数组只能是一维数组。,一个方法只能有一个参数数组,而且此参数数组必须是方法定义中的最后一个参数。,参数数组必须是值参数,不能使用关键字,ref,或,out,修饰。,参数数组是自动可选的,即可以不给参数数组传递任何参数。,关键字,params,不能用于区分重载方法。,7.5.2,参数数组(续),1.,int,Method(params,int,array)/,错误,int,Method(params,int,array)/,正确,交错数组是一维数组,2.,int,Method(params,int,array,int,a)/,错误,int,Method(int,a,params,int,array)/,正确,3.,int,Method(ref,params,int,array)/,错误,int,Method(out,params,int,array)/,错误,5.,int,Method(params,int,array),int,Method(int,array)/,错误,7.5.3 Main,方法和命令行参数,Main,方法是,C#,应用程序的入口点。运行程序时可以从命令行给它传递参数。,Main,方法的方法头可以是下列,4,种形式之一:,static void Main(),static,int,Main(),static void,Main(string,args,),static,int,Main(string,args,),2.,与,4.,返回,0,表示正常终止,非,0,表示非正常终止,3.,与,4.,的参数数组,args,,可以接受命令行中的参数,7.5.3 Main,方法和命令行参数(续),命令行中的参数传递给,Main,方法后,保存在,Main,方法的字符串数组参数,args,中。其中,命令行中的第,1,个参数保存在,args,0,中;命令行中的第,2,个参数保存在,args,1,中;,.,;依此类推。,例,7-9,使用命令行参数,源代码,运 行,例,7-9,使用命令行参数,using,System;,public,class,CommandLine,public,static,void,Main(,string,args,),Console,.WriteLine(,parameter,count=0,args.Length,);,foreach,(,string,s,in,args,),Console,.WriteLine(s,);,例,7-9,在命令行运行,例,7-9,在,.Net,环境的运行,例,7-9,在,.Net,环境的运行,7.5.4,返回数组,数组也可以用作方法的返回值。从某一方法返回数组,实际返回的只是一个引用数组的引用。通过这个引用就可以操作相应的数组。,例,7-10,返回数组,源代码,运 行,using,System;,public,class,ReturnArray,public,static,void,Main(),int,a1=10,4,2;,int,a2;,for,(,int,i=0;i a1.Length;i+),Console,.Write,(,a10=1,i,a1i);,Console,.WriteLine,();,a2=CopyArray(a1);,for,(,int,i=0;i a2.Length;i+),Console,.Write,(,a20=1,i,a2i);,Console,.WriteLine,();,public,static,int,CopyArray(,int,la),int,a=,new,int,la.Length,;,for,(,int,i=0;i i),return,-1;,else,if,(k j),return,-1;,else,if,(k 0),Console,.WriteLine(,01,a1,a2);,else,if,(a1.CompareTo(a2)0),Console,.WriteLine(,0 i),return,-1;,else,if,(k=0),Console,.WriteLine(,a1,+loc+,=,+i);,else,Console,.WriteLine,(,没有在数组中找到,+i);,loc=,Array,.BinarySearch(a1,j);,if,(loc=0),Console,.WriteLine(,a1,+loc+,=,+j);,else,Console,.WriteLine,(,没有在数组中找到,+j);,A,a2=,new,A,(5,2),new,A,(2,3),new,A,(3,1);,Array,.Sort(a2);,PrintArray(a2);,A,aobj1=,new,A,(3,1);,A,aobj2=,new,A,(4,2);,loc=,Array,.BinarySearch(a2,aobj1);,if,(loc=0),Console,.WriteLine(,a2,+loc+,=,+aobj1);,else,Console,.WriteLine,(,没有在数组中找到,+aobj1);,loc=,Array,.BinarySearch(a2,aobj2);,if,(loc=0),Console,.WriteLine(,a2,+loc+,=,+aobj2);,else,Console,.WriteLine,(,没有在数组中找到,+aobj2);,public,static,void,PrintArray(,Array,myArr,),foreach,(,object,i,in,myArr,),Console,.Write(,0t,i);,Console,.WriteLine,();,7.7,习 题,1.,声明和创建数组的意义分别是什么?,数组是一种引用类型。声明数组只是声明了一个用来操作该数组的引用,并不会为数组元素实际分配内存空间。因此,声明数组时,不能指定数组元素个数。,声明数组后,在访问其元素前必须为数组的元素分配相应内存,即创建数组。,2.,引用类型数组和值类型数组中实际顺序存储的元素有什么不同?,引用类型数组中保存的只是对象引用。在访问这些对象的成员前,必须使用,new,运算符创建实际的对象。,值类型数组实际存储的是元素的值,3.C#,语言中,通过数组的什么属性可以获知其中的元素数目?,使用所有数组的基类,Array,类定义的的属性,Length,5.,多维数组和交错数组中,属性,Length,的意义有什么不同?,多维数组中,Length,返回当前数组中所有元素的个数,对于交错数组,属性,Length,返回的是包含在当前交错数组中的数组元素的数目。而不是数组中所有元素的数目。,作业,P190,4.,创建一个,int,型数组,其元素值分别为,2,、,10,、,4,、,12,、,20,、,24,,编程求出其中元素值的总和及平均值。,7.,编写一个程序。程序中定义一个类,Circle,,其中有数据成员,radius,;创建一个有,5,个,Circle,型元素的数组,其,radius,值分别为,2,、,10,、,8,、,4,、,12,;最后调用方法,Array.Sort,(),给这个数组排序。,
展开阅读全文