CH06_数组


本章目标

  • 理解数组的概念
  • 掌握一维数组的应用
  • 掌握多维数组的应用
  • 掌握冒泡排序

数组概述

定义

用于存储一组数据的容器。

特点

数组从字面上理解就是存放一组数,但在 C# 语言中数组存放的并不一定是数字,也可以是其他数据类型。

在一个数组中存放的值都是同一数据类型的,并且可以通过循环以及数据操作的方法对数组的值进行运算或操作。

数组中某个指定的元素是通过索引来访问的。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

C# 中数组从零开始建立索引,即数组索引从零开始。

C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。

声明数组时,方括号[]必须跟在类型后面,而不是标识符后面。

一维数组

使用步骤

1.定义数组

1
2
//定义数组
数据类型[] nums;

2.初始化数据

1
2
3
4
//初始化数组中的元素
数据类型[] nums = new 数据类型[长度];
数据类型[] nums = {值 1, 值 2, ...}
数据类型[] nums = new 数据类型[长度]{值 1,值 2,...}

3.使用数据

1
Console.WriteLine("第一个数据:"+nums[0]);

案例1:输出数组中的最后一个元素

1
2
3
4
5
6
7
8
9
10
11
class Program
{
static void Main(string[] args)
{
int[] nums = { 89,78,56,38,99};

Console.WriteLine(nums[nums.Length-1]);

Console.ReadLine();
}
}

案例2: 在 Main 方法中创建 int 类型数组,并从控制台输入 5 个值存入该数组中,最后将数组中的最大数输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program
{
static void Main(string[] args)
{
int[] a = new int[5];
Console.WriteLine("请输入5个整数:");
for(int i = 0; i < a.Length; i++)
{
a[i] = int.Parse(Console.ReadLine());//将字符串类型转换成整型
}
int max = a[0];//这里假设a[0]是最大的
for(int i = 1; i < a.Length; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
Console.WriteLine("数组中最大值为:" + max);
}
}

多维数组

使用步骤

1.定义数组

1
2
//定义多维数组
数据类型[ , , ...] 数组名;

2.定义数组并初始化

1
2
//创建多维数组并初始化
数据类型[ , , ...] 数组名 = new 数据类型[m,n,...] {{ , , ...},{ , , ...}};

从上面定义的语法可以看出,它与一维数组的定义非常类似,每多一个维度则在定义时的[]中增加一个“,”。 存取数组中的值也是将下标用“,”隔开。

案例3: 定义一个存放学生成绩的二维数组,并将该数组中每个学生的成绩输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program
{
static void Main(string[] args)
{
double[,] points = { { 90, 80 }, { 100, 89 }, { 88.5, 86 } };
for(int i = 0; i < points.GetLength(0); i++)
{
Console.WriteLine("第" + (i + 1) + "个学生成绩:");
for(int j = 0; j < points.GetLength(1); j++)
{
Console.Write(points[i, j] + " ");
}
Console.WriteLine();
}
}
}

在遍历多维数组元素时使用 GetLength(维度) 方法能获取多维数组中每一维的元素,维度也是从 0 开始的,因此在该实例中获取数组中第一维的值时使用的是 points.GetLength(0)。

在 C# 语言中不仅支持上面给出的多维数组,也支持锯齿型数组,即在多维数组中的每一维中所存放值的个数不同。

锯齿型数组也被称为数组中的数组。定义锯齿型数组的语法形式如下。

1
2
数据类型[][]  数组名 = new 数据类型[数组长度][];
数组名[0] = new 数据类型[数组长度];

在这里,数据类型指的是整个数组中元素的类型,在定义锯齿型数组时必须要指定维度。

案例4: 创建一个锯齿型数组,第一维数组的长度是 2、第二维数组的长度是 3、第三维数组的长度是 4,并直接向数组中赋值,最后输出数组中的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Program
{
static void Main(string[] args)
{
int[][] arrays = new int[3][];
arrays[0] = new int[] { 1, 2 };
arrays[1] = new int[] { 3, 4, 5 };
arrays[2] = new int[] { 6, 7, 8, 9 };
for(int i = 0; i < arrays.Length; i++)
{
Console.WriteLine("输出数组中第" + (i + 1) + "行的元素:");
for(int j=0;j<arrays[i].Length; j++)
{
Console.Write(arrays[i][j] + " ");
}
Console.WriteLine();
}
}
}

锯齿型数组中的值也可以通过循环语句来赋值,与输岀语句类似。

在上面的实例中, arrays 数组中的元素从控制台输入的具体语句如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[][] arrays = new int[3][];
arrays[0] = new int[2];
arrays[1] = new int[3];
arrays[2] = new int[4];
for(int i = 0; i < arrays.Length; i++)
{
Console.WriteLine("输入数组中第" + (i + 1) + "行的元素:");
for(int j=0;j<arrays[i].Length; j++)
{
arrays[i][j] = int.Parse(Console.ReadLine());
}
Console.WriteLine();
}

冒泡排序

冒泡排序的原理是将数组元素中相邻两个元素的值进行比较,将较小的数放到前面,每一次交换都将最大的数放到最后,依次交换后最终将数组中的元素从小到大排序。

案例5:实现冒泡排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Program
{
static void Main(string[] args)
{
int[] a = { 5, 1, 7, 2, 3 };
for(int i = 0; i < a.Length; i++)
{
for(int j = 0; j < a.Length - i - 1; j++)
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
Console.WriteLine("升序排序后的结果为:");
foreach(int b in a)
{
Console.Write(b + "");
}
Console.WriteLine();
}
}

数组常用操作

查找

查找数组中是否包含指定的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static void Main(string[] args)
{
int[] nums = { 89,78,56,38,99};

Console.WriteLine("请输入要查找的数字:");
int num = int.Parse(Console.ReadLine());

bool isFind = false;//是否找到

foreach (var item in nums)
{
if (item==num)
{
isFind = true;
break;
}
}

if (isFind)
{
Console.WriteLine("找到了");
}
else
{
Console.WriteLine("没找到");
}


Console.ReadLine();
}

修改

输入要修改的数字和修改后的数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Program
{
static void Main(string[] args)
{
int[] nums = { 89,78,56,38,99};

Console.WriteLine("请输入要修改的数字:");
int oldNum = int.Parse(Console.ReadLine());
Console.WriteLine("请输入修改后的数字:");
int newNum = int.Parse(Console.ReadLine());

int index = -1;//对应索引

for (int i = 0; i < nums.Length; i++)
{
if (nums[i]==oldNum)
{
index = i;
break;
}
}

if (index!=-1)
{
nums[index] = newNum;
Console.WriteLine("修改成功");
}
else
{
Console.WriteLine("修改失败");
}


Console.ReadLine();
}
}

插入

有一组已排序的数组,然后插入一个新的数据,要求插入后仍然是有序的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Program
{
static void Main(string[] args)
{
int[] nums = {99, 89,78,56,38};

Console.WriteLine("请输入要插入的数字:");
int insertNum = int.Parse(Console.ReadLine());


//准备新数组
int[] newNums = new int[nums.Length + 1];
for (int i = 0; i < nums.Length; i++)
{
newNums[i] = nums[i];
}


int index = nums.Length; //插入索引,默认为末尾

//1.找到插入位置
for (int i = 0; i < nums.Length; i++)
{
if (insertNum > nums[i])
{
index = i;
break;
}
}

//2.将插入位置后的数据向后平移(且从右边开始)
for (int i = nums.Length; i >index; i--)
{
newNums[i] = newNums[i-1];
}

//3.将要插入的数字插入到指定位置
newNums[index] = insertNum;


//4.查看数据
Console.WriteLine("-------------------------------------------");
foreach (var item in newNums)
{
Console.WriteLine(item);
}

Console.ReadLine();
}
}

删除

请输入要删除的数字,如果没有就删除失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Program
{
static void Main(string[] args)
{
int[] nums = {99, 89,78,56,38};

Console.WriteLine("请输入要删除的数字:");
int delNum = int.Parse(Console.ReadLine());

int index = -1;//对应索引

for (int i = 0; i < nums.Length; i++)
{
if (nums[i] == delNum)
{
index = i;
break;
}
}

if (index == -1)
{
Console.WriteLine("删除失败,没找到要删除的数据。");
return;
}

//从指定位置后到倒数第一个位置的所有数据都向前平移1位(从左边开始)
for (int i = index; i < nums.Length-1; i++)
{
nums[i] = nums[i+1];
}

//末尾清空
nums[nums.Length - 1] = 0;

//查看结果
Console.WriteLine("---------------------------------------------");
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}



Console.ReadLine();
}
}

课后作业

1.录入5个同学的成绩,然后按照从高到低排序。

2.录入5名同学的身高,然后计算平均身高。

3.录入3个班的学生成绩,1班5个人,2班6个人,3班4个人,分别求出每个班的最高分(二维数组实现)

4.录入3个班的学生成绩,1班5个人,2班6个人,3班4个人,分别求出每个班的最高分(二维数组实现)

5.录入3个班的学生成绩,1班5个人,2班6个人,3班4个人,分别求出每个班的平均分(二维数组实现)