5.1 数组的概念
1.数组与数组元素
-
数组
是相同类型的对象的集合
。 -
一个数组可以含有若干个下标变量(或称数组元素),下标也叫索引(Index),用来指出某个数组元素在数组中的位置。
-
数组中第一个元素的下标默认为0,第二个元素的下标为1,依次类推。数组元素的最大下标比数组元素个数少1,即如果某一数组有n个元素,则其最大下标为n-1。
-
由具有一个下标的下标变量所组成的数组称为一维数组,如数组A[2]就是一维数组。
-
由具有两个或多个下标的下标变量所组成的数组称为二维数组或多维数组,多维数组元素的下标之间用逗号分隔,如A[2,3]表示是一个二维数组。
2.数组的类型
-
数组属于引用类型。
-
数组元素用下标表示其在数组中位置
-
数组元素在内存中是连续存放的。
-
C#中的数组类型可以对应任何数据类型。
5.2 数组声明与初始化
5.2.1 数组声明
1.一维数组的声明
一维数组是有一个下标的数组,其声明格式如下:
(1)声明一维数组的语法格式1为:
数据类型[ ] 数组名;
说明:
数组的长度不是声明的一部分。数组的类型可以是基本数据类型,也可是枚举或其他类型。声明中的方括号([ ])必须跟在元素类型后面,而不是数组名后面。
(2)声明一维数组的语法格式2为:
元素类型[] 数组名=new 元素类型[元素个数];
说明:
①数组元素个数可以是一个常量表达式,也可以是一个变量表达式。例如:
int Size=5;
int[] A=new int[Size];
②C#允许声明元素个数为0的数组,例如:
int[] A=new int[0];
5.2.2 数组的初始化
数组必须在访问前初始化,初始化的格式有多种。
格式1:元素类型[] 数组名={初始值列表};
格式2:元素类型[] 数组名=new类型名称[]{初始值列表};
格式3:元素类型[] 数组名=new类型名称[元素个数]{初始值列表};
说明:
(1)声明数组并将其初始化,例如: int[] arr = { 1,2,3,4,5 };
其中花括号被称为数组初始化器,数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。
(2)可以通过new运算符创建数组并将数组元素初始化为它们的默认值。例如:int[] arr =new int[5];//arr数组中的每个元素都初始化为0
注意:数值数组元素的默认值为零,引用元素的默认值为null。
(3)可以在声明数组时将其初始化,并且初始化的值为用户自定义的值。例如:
int[] arr=new int[5]{
1,2,3,4,5};
(4)声明一个数组变量时可以不对其初始化,但在对数组初始化时必须使用 new 运算符。例如:
string[] arrStr;
arrStr=new string[7]{
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
(5)初始化数组时可以省略new运算符和数组的长度。编译器将根据初始值的数量来计算数组长度,并创建数组。例如:
string[] arrStr={
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
(6)为数组指定初始化的值可以是变量表达式,例如:
int x=1,y=2;
int[] A= new int[5]{
x,y,x+y,y+y,y*y+1};
【例5-1】 数组的初始化例。
using System;
namespace P5_1
{
class TestArray
{
static void Main(string[] args)
{
string[] days = {
"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };//定义一个数组
System.Console.WriteLine(days[0]); //输出索引为0的值
}
}
}
【例5-2】 指向同一个对象的多个数组元素例。
当数组元素的类型为值类型时,数据直接存放在数组中,整个数组的大小等于数组的长度乘以单个元素的大小。而当数组元素的类型为引用类型时,数组中存放的只是各个引用对象的地址。这时,在对数组进行初始化之后,还要记住对各种数组元素进行初始化。此外,不排除多个数组元素指向同一个对象的可能,此时修改一个数组元素可能会影响到其他的数组元素。
【例5-2】指向同一个对象的多个数组元素案例。
using System;
namespace P5_2
{
class RefArray
{
public static void Main()
{
Contact[] ca = new Contact[3];
ca[0] = new Contact();
ca[1] = new Contact();
ca[2] = new Contact();
ca[0].m_name = "李明";
ca[0].m_telephone = "010-60010800";
ca[1].m_name = "张鹏";
ca[1].m_telephone = "010-60020300";
//两个数组元素指向同一对象
ca[2] = ca[0];
ca[2].m_telephone = "010-50050500";
foreach (Contact c in ca) //遍访数组ca中的每个成员
Console.WriteLine(c.m_name + ":" + c.m_telephone);
}
}
class Contact
{
public string m_name;
public string m_telephone;
}
}
5.2.3 数组元素的访问
1.一维数组元素的引用
使用数组名与下标(索引)可以唯一确定数组中的某个元素,从而实现对该元素的访问。例如:
int x=4,y=5;
int[] Array=new int[3]{
1,2,3};
x=Array[0]; // 使用数组第1个元素的值,以便为其它变量赋值
Array[1]=y; // 为数组第2个元素赋值
在访问数组元素时,要注意不要使下标越界,例如:
int[] Array=new int[5];
Array[5]=15; // 下标越界
2.一维数组的访问
通过foreach语句或数组的下标将一维数组元素值读出。foreach 语句通常用来访问数组中存储的每个元素,格式如下:
foreach( 元素类型 元素变量 in 元素变量集合)
{
循环语句
}
说明:使用foreach语句时,首先输入foreach关键字,然后是括号。括号内必须包含以下信息:集合中元素的类型、集合中元素的标识符名称、关键字in和集合的标识符,嵌套语句在括号之后。foreach只能对集合进行读取操作,不能通过元素变量修改数组中元素的值。
【例5-3】foreach语句的使用。
using System;
namespace P5_3
{
class Program
{
static void Main(string[] args)
{
int[] members = new int[] {
0, 1, 2, 3, 5, 8, 13 }; //定义了一个数组
foreach (int member in members) //进行foreach循环
{
System.Console.WriteLine(member); //输出结果
}
}
}
}
5.2.4 应用实例
【例5-4】 编写C#控制台程序,要求用户输入月份号码,然后显示该月的英文名称,如用户输入2,程序显示“February”。
5.3 数组的基本操作与排序
5.3.1 数组对象的赋值
在C#中,对数组的赋值有两种:
一种是定义数组的同时进行赋值,即数组的初始化;
另一种是通过for循环语句对数组赋值,即在遍历数组时对数组中的每个元素进行赋值。
【例5-5】 通过循环给一维数组赋值。
【例5-6】 通过键盘输入给数组赋值。
5.3.2 数组对象的输出
在C#中,数组对象的输出通常采用循环控制语句实现,其中foreach用来逐个遍历输出数组元素。
【例5-7】 不同类型数组的输出。
5.3.3求数组中的最大(小)元素值
数组含有许多元素,这些元素如果是可以比较大小的,那就常常需要计算,如求出这些元素中的最大值或最小值。下面通过一个简单的例子学习求数组中的极值。
【例5-8】 编写一个控制台应用程序,求数组中5个整数的最大值和最小值。
5.3.4 数组排序
1.使用Array类排序
Sort方法可以将数组中的元素按升序排列。数组的Sort方法使用格式为:
Array.Sort(数组名称);
数组与数组列表中还有一个Reverse(反转)方法,将该方法与Sort方法结合,可以实现降序排序。数组反转方法的使用格式为:
Array.Reverse(数组名称,起始位置,反转范围);
【例5-9】 定义一个含有元素{2,5,4,1,3}的数组,然后使用Sort方法对其排序。
static void Main(string[] args)
{
int[] a = {
2, 5, 4, 1, 3 };
Console.Write("当前排序: ");
foreach (int i in a)
Console.Write(i.ToString());
Console.Write("\n");//另起一行
Array.Sort(a);//完成排序
Console.Write("排序后顺序: ");
foreach (int i in a)
Console.Write(i.ToString());
Console.Write("\n");
}
2.冒泡排序
冒泡排序的算法思想:
(1)从第1个元素开始,对数组中两两相邻的元素进行比较,即R[0]与R[1]比较,若R[0]>R[1],则R[0]与R[1]交换;然后R[1]与R[2]比较,若R[1]>R[2],则R[1]与R[2]交换;…,直到最后R[n-2]与R[n-1] 比较,若R[n-2]>R[n-1],则R[n-2]与R[n-1]交换。如此扫描完成第一趟排序,一个最大的元素被移到R[n-1]位置上,成为数组中的最后一个元素,不再参与下一趟排序。
(2)用与上面同样的方法,对R[0]到R[n-2]的n个元素进行第二趟排序,“次大”元素被移到R[n-2]位置上,这时得到有序区R[n-1 …n]。
(3)依此类推,进行n-1趟排序后,可得到有序区R[0 …n-1],实现所有元素由小到大的排列。
设原始数组: 21 54 12 34 44 12 15 28 3 10 68 76
冒泡排序的过程如下:
【例5-10】 设计一个控制台应用程序,采用冒泡法对于已知的数组进行升序排序。
3.选择排序
选择排序算法思想:
(1)将第一个元素R[0]与第2个元素(即R[1])到第n个元素(R[n-1])中最小者R[p]交换(假如R[p]小于R[0]的话),这时n个数中最小的数巳调到最前面的R[0]位置,这是第一轮的处理结果。
(2)第二轮要处理的是剩下的(n-1)个元素的排序。同理,将R[1]与R[2]到R[n-1]中最小者交换(假如该数小于R[1]的话)。这是R[1]中存放的已是第二小的数。…
(3)依次类推,进行n-1轮处理后,可得到有序区R[0 …n-1,实现所有元素由小到大的排列。
【例5-11】 设计一个控制台应用程序,采用选择法对已知数组进行升序排序。
5.4 多维数组
5.4.1 二维数组
1.声明
声明二维数组的格式如下:
元素类型[,] 数组名;
例如声明一个名为arr1的2行3列的整型二维数组:
int[,] arr1=new int[2,3];
2.初始化
可以在创建数组的过程中可以实现初始化,例如:
int[,] arr2=new int[3,2]{
{
1,2},{
3,4},{
5,6}};
也可以写为:
int[,] arr2=new int[,]{
{
1,2},{
3,4},{
5,6}};
【例5-12】 设计一个控制台应用程序,读取二维数组中的值。
5.4.2 多维数组
三维及三维以上的数组称为多维数组。多维数组的数组元素本身也是数组,它又可分为规则多维数组和不规则多维数组。
1.声眀
声明三维数组的格式如下:
元素类型[ , , ] 数组名;
例如声明一个名为arr3的三维数组:
int[, ,] arr3;
2.初始化
以三维数组为例,代码如下:
int[, ,] arr3 = new int[2, 1, 3] {
{
{
1, 2, 3 } }, {
{
4, 5, 6 } } };
代码也可以为:
int[, ,] arr3 = new int[, , ] {
{
{
1, 2, 3 } }, {
{
4, 5, 6 } } };
2.初始化
注意:大括号中的子数之间也要用逗号分割开来。对于规则多维数组取数组元素也是通过同一个括号中的多个索引进行的,例如:
arr3[0,0,0] = 10;
Console.WriteLine(arr3[1,0,2]);
3. 多维数组的使用
多维数组中最常用的是三维数组,例如定义一个三维数组,可使用foreach语句将该数组输出
5.4.3 应用实例
【例5-13】 设计一个控制台应用程序,分别从键盘输入两个二维数组,进行相加后输出。
【例5-14】 生成并输出杨辉三角(又称Pascal三角)
小结
- 数组是C#中用得较多的一种引用类型,由于数组可以存放许多数据元素,它常用来作为存放有相同类型的多个变量。
- 数组可根据所具有的维数分为一维数组、二维数组和多维数组。
- 数组必须先声明后使用。
- 数组中元素的类型可以是任何类型,包括数组类型。
转载:https://blog.csdn.net/lucky51222/article/details/116035552