CH06_数组
本章目标
理解数组的概念
掌握一维数组的应用
掌握多维数组的应用
掌握冒泡排序
数组概述 定义 用于存储一组数据的容器。
特点 数组从字面上理解就是存放一组数,但在 C# 语言中数组存放的并不一定是数字,也可以是其他数据类型。
在一个数组中存放的值都是同一数据类型的,并且可以通过循环以及数据操作的方法对数组的值进行运算或操作。
数组中某个指定的元素是通过索引来访问的。
所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。
C# 中数组从零开始建立索引,即数组索引从零开始。
C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。
声明数组时,方括号[]必须跟在类型后面,而不是标识符后面。
一维数组 使用步骤 1.定义数组
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 ]; 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; for (int i = 0 ; i < nums.Length; i++) { if (insertNum > nums[i]) { index = i; break ; } } for (int i = nums.Length; i >index; i--) { newNums[i] = newNums[i-1 ]; } newNums[index] = insertNum; 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 ; } 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个人,分别求出每个班的平均分(二维数组实现)