


Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,第,5,章 数组和指针,一维数组的声明、实例化、初始化和访问,多维数组的声明、实例化、初始化和访问,数组的根本操作和排序,System.Array类的使用,C#语言中不平安代码的根本概念,C#语言中指针的使用,1956,1960,1978,1982,1990,1998,a0,a1,a2,a3,a4,a5,数组是一些具有,相同类型,的数据按一定顺序组成的序列,初步认识数组,问题:,输入,100,个学生的成绩,,计算,100,个学生的平均分,以及,统计,超过平均分的人数分析:,1,循环,,求出平均分,2,循环,,求出超过平均分的人数,一种算法,sum=0.0;int count2=0;,for(i=1;i=100;i+),输入,x;,sum=sum+x;,avg=sum/N;,for(i=1;i avg)count2+;,输出,avg,count2;,第一次循环计算平均值,第二次循环计算超出平均分人数,你让我输入两次成绩?,更好的解决方法:先把所有数据暂存起来,定义,100,个变量?,定义变量,x1,x2,x100;,输入,x1,x2,x100,sum=sum+x1;,sum=sum+x2;,sum=sum+x100;,avg=sum/100;,count2=0;,if(x1avg)count2+;,if(x2avg)count2+;,.,if(x100avg)count2+;,输出,count2,变量名看起来很有规律,,却无法利用循环的好处,for(i=1;i=100;i+),sum=sum+xi;,X,需要使用“数组,5.1,数组,具有,相同类型,的数据按,一定顺序,组成的序列,数组中的每一个数据都可以,通过数组名及下标来存取,a0,a1,a2,a3,a4,a5,a6,a7,数组的所有元素按顺序分配在连续的空间,注意,:,可用下标范围,:,0,数组长度,-1,int a=new int8;,每一个数组元素可以当作独立的变量使用,数组用于存储和表示既与取值有关,,又与位置顺序有关的数据。
数组的类型,在C#中,数组属于引用类型1 数组元素在内存中是连续存放的,这是数组元素用下标表示其在数组中位置的根据2 C#中的数组类型可以对应任何数据类型,即数组可以是根本数据类型,也可以是类类型,例如,可以声明一个文本框TextBox类型的数组3 C#通过.NET框架中的System.Array类来支持数组,因此,可以使用该类的属性与方法操作数组5.1.1,一维数组,声明、实例化和初始化一维数组的各种形式参见表5-1,一般通过数组下标来访问数组中的数据元素C#语言还可以通过foreach语句来枚举数组的各个元素,【例5.1】一维数组的使用例如:随机产生100个学生的成绩,计算学生的平均成绩,并统计高于平均成绩的学生人数,【例5.2】利用一维数组显示Fibonacii数列:1、1、2、3、5、8、的前20项要求每行显示5项,声明一维数组,例:,char CharArr;/,字符型一维数组,int intArr;/,整型一维数组,string StringArray;/,字符串一维数组,数据类型,数组名,;,表示数组每个元素的类型,现在还不能使用数组元素,必须经过实例化才可以使用,动态实例化,-,使用,new,运算符,int a;/,声明,a=new int5;/,实例化,int IntArr=new int5;,int IntArr=new int53,6,9,2,18;,数组名,=new,数据类型,数组长度,可以将数组定义和实例化合写在一起,例:定义并初始化一个,100,个元素的浮点数数组,score,float score;,score=,new,float100;,float score=,new,float100;,两种方式都正确,数组长度可以是,无符号整型表达式,,即非负整数,也可以是一个,常量表达式,,或者,变量表达式,。
int Size=5;,int A=new intSize;,C#,允许声明元素个数为,0,的数组,例如:,int A=new int0;,静态初始化实例化,例子:,int IntArr=3,6,9,2,18;,string StringArr=English,Computer,Maths,Chinese;,数据类型,数组名,=,元素,1,元素,2,.,静态初始化数组必须与数组定义结合在一条语句中,数组在实例化时,可以为元素指定初始化值如果为数组指定初始化值,可以省略对元素个数的说明:,int A=new int 1,2,3,4,5;,可以将声明数组的语句,“int A=new int51,2,3,4,5;,简化为:int A=1,2,3,4,5;,为数组指定初始化的值可以是,变量表达式,,,例如:,int x=1,y=2;,int A=new int5x,y,x+y,y+y,y*y+1;,一旦要为数组指定初始化值,就必须为数组的所有元素指定初始化值,指定值的个数既不能多于数组的元素个数,也不能少于数组的元素个数,访问一维数组,使用数组名与下标索引可以唯一确定数组中的某个元素,从而实现对该元素的访问。
数组名,下标,可以是任何整型表达式,例如:,int x=4,y=5;,int A=new int31,2,3;,/,使用数组第,1,个元素的值为其他变量赋值,x=A 0;,A 1=y;,/,为数组第,2,个元素赋值,在访问数组元素时,要注意不要使下标越界,例如:,int A=new int5;,A5=15;,/,下标越界,可以在实例化数组时为数组的所有元素初始化指定的值,但不能在赋值语句中使用一个赋值运算符为整个数组赋值,例如:,int A=new int31,2,3;,/,正确,A=4,5,6;,/,错误,试图为整个数组赋值,int a=new int8;,a2=10;,int i=5;,Console.Write(ai-3);,for(i=0;i8;i+),ai=i*i;,这样用当然没有问题,下标可以是表达式,便于使用循环变量控制下标,这样的,for,循环变量最适合做数组下标,for(i=0;i,N,;i+),例:数组声明与访问,using System;,class ArrayTest,static void Main(string args),int numbers;,/,定义一个一维数组,numbers=new int6;,/,动态初始化数组,for(int i=0;i,numbers.Length,;i+),numbersi=i*i;,Console.WriteLine(numbers0=1,i,numbersi);,例:定义一个数组,使其元素值为对应下标值的平方,并输出数组中的元素,使用,数组名,.Length,可以获取数组的长度,练习题:,定义一个长度为,10,的,浮点,数数组,x,进行动态或者静态初始化,将每个元素赋值为下标的开方,Math.Sqrt(),foreach循环语句,C#专门提供了一种用于遍历数组的foreach循环语句。
foreach循环语句的格式为:,foreach(类型名称 变量名称 in 数组名称)循环体,语句中的“变量名称是一个循环变量,在循环中,该变量依次获取数组中各元素的值因此,对于依次获取数组中各元素值的操作,使用这种循环语句就很方便要注意,“变量名称的类型必须与数组的类型一致例如,假定有一个整型数组A,那么用foreach语句获取数组中和元素的值并输出到label1控件的Text属性中的代码为:,foreach(int i in A),label1.Text=label1.Text+i+;,foreach语句遍历数组虽然很方便,但其功能受一定的限制,例如,如果想为数组各元素依次有规律赋值,foreach循环将无能为力5.1.2,多维数组,多维数组的声明、实例化和初始化与一维数组的声明、实例化和初始化相类似声明多维数组时,用逗号表示维数,一个逗号表示两维数组,两个逗号表示三维数组,以此类推注意:在声明数组声明中即使没有指定维数的实际大小,也必须使用逗号分隔各个维,例,1,例,5,C#,支持两种类型的多维数组第一种是矩形数组,也称等长数组,【,例,5.3,】,二维数组的使用,声明多维数组,在多维数组中,比较常用的是二维数组,二维数组可以保存二行二列的同类型数据,6,行,4,列的同类数据,可以使用,64,的二维数组保存,int,data=,new,int6,4;,data0,0=98;,.,定义数组和分配空间,访问数组元素,使用两个下标指定行和列,声明二维数组与声明一维数组格式类似,例如:,char,CharArr;,int,A;,数据类型,数组名,数组元素类型,声明多维数组时,用逗号表示维数,一个逗号表示二维数组,两个逗号表示三维数组,依次类推,。
二维数组的初始化,数组名,=new,数据类型,长度,1,长度,2;,例:,int,IntArr=new int3,2;,int,A=new int2,21,2,3,4;,注意:,上面定义的数组,IntArr,中包含,3X2=6,个元素,下标分别为,0,0,0,1,1,0,1,1,2,0,2,1,访问多维数组需要用多个下标唯一确定数组中某个元素,例如:,/声明一个4行4列的二维数组,int,Ar=new int4,4;,Ar1,2=15;/为第2行第3列的元素赋值,int a=Ar1,2;/用第2行第3列的元素为其他变量赋值,也可以行基准给二维数组静态赋值,但一般不用静态赋值给超过二维的多维数组.要访问二维数组中的所有元素可以使用双重循环来实现,通常外循环控制行,内循环控制列例:通过二重循环,将,1-12,赋值给一个二维数组,并显示数组内容,static void Main(string args),int t,i;,int,table=new int3,4;,for(t=0;t 3;t+)/给二维数组赋值,for(i=0;i 4;i+),tablet,i=(t*4)+i+1;/填数,for(t=0;t 3;t+)/显示二维数组的值,for(i=0;i 4;i+),Console.Write(tablet,i+“t);/横向跳格,Console.WriteLine();,练习:,定义一个,4,行,4,列的,double,型数组,将数组所有元素按图设置:,输出该数组在对角线上的元素值,多维数组介绍,C#,可以使用多维数组,3,维数组的下标有三个整数,,4,维数组的下标有,4,个整数,依次类推,多维数组的使用和二维数组的使用方法类似,根据数组的维数确定方括号中的逗号的个数,例:,定义一个三维数组:,string,StringArr=new string3,2,4;,数组总结,数组array是一种数据结构,它包含相同类型的一组数据,数组有一个“秩rank,它确定和每个数组元素element关联的索引个数,其值是数组类型的方括号之间逗号个数加上1。
数组的秩又称为数组的维度秩为 1 的数组称为一维数组single-dimensional array,“秩大于 1 的数组称为多维数组multi-dimensional array维度大小确定的多维数组通常称为两维数组、三维数组等,数组的每个维度都有一个关联的长度length,它是一个大于或等于零的整数创立数组实例时,将确定维度和各维度的长度,它们在该实例的整个生存期内保持不变换而言之,对于一个已存在的数组实例,既不能更改它的维度,也不可能调整它的维度大小,数组属性,1数组使用类型声明,通过数组下标或称索引来访问数组中的数据元素2数组可以是一维数组、多维数组3数组元素可。