数组用于存储若干相同类型的数据。在本章将介绍什么是数组以及数组的使用方法。了解数组之
后,将学习 foreach 循环以及数组的应用。
数组是一种数据结构,包含同一种类型的多个元素。也就是说,数组是用于存储多个相同类型数
据的集合。
假设现在有这样的需求,接收 10 位学生的计算机成绩,最后输出每个学生的成绩以及计算平均
分。按照我们学习过的知识,可以写出如下的代码来存储每个学生的成绩:
int n1,n2,n3,…,n10; //定义10个变量
其实从这句代码中,我们可以看出这样的缺点:所需要的变量太多,如果人数是 100 个,那么这
种写法更加不切实际。我们就需要使用数组来存储这样的同种类型的多个数据。
C#支持一维数组、多维数组等。在实际应用中,一维数组被广泛使用。
2.1. 数组的声明
一维数组声明的语法如下:
数据类型 [] 数组名称;
数据类型就是 int、char、float、double、string 等,代表了整个数组存放的元素的类型。数组
名称由用户自定义,不过跟变量名的取名一样,也要遵循命名规则,如下代码:
char[] chs; //定义了一个字符类型数组chs int[] nums; //定义了一个int类型数组nums
2.2. 数组的初始化
C#中的数组只有定义是不够的,数组必须初始化后才能使用。数组的初始化有几种常见的方式:
(1)指定数组存储的元素序列,语法格式如下:
数据类型 [] 数组名称 ={ 值 1, 值 2, 值 3, …, , 值 n};
(2)指定数组的长度,使用 new 关键字初始化数组,语法格式如下:
数据类型 [] 数组名称 =new 数据类型[ [ 长度 ];
数组的长度,代表数组存储元素的个数,可以是常量或变量,但如果是变量,变量必须先赋值。
在使用数组过程中,下面的写法都是正确的。
int[] a1={1,2,3}; //第一种方式,长度为3(因为初始化了3个值) int[] a2=new int[4]; //第二种方式,长度为4 int[] a3=new int[4]{1,3,5,7}; //两种形式的结合,数组长度必须和元素个数匹配 int[] a4=new int[]{1,2,3,4,5}; //初始化了元素,长度可以省略
下面列举了一些可能出现的错误写法。
int arr1[]=new int[5]; // []的位置不对 int[] arr2=new int[5]{1,2,3}; //数组长度和元素个数不匹配 int[] arr3=new string[5]; //左右的数据类型不一致
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //定义长度为5的数组并赋初值 int[] a1 = {8,9,7,6,8 }; //定义长度为10的int类型数组 int[] a2=new int[10]; //定义长度为3的String类型数组,并赋初值 String[] a3 = new String[3] {"Hello","World","!" }; //定义数组并赋初值 double[] a4=new double[]{1.5,2.3,3.6}; double[] a5 = { 1.5, 2.3, 3.6 }; //获取元素,赋值 a1[4] = 99; Console.WriteLine(a1[4]); //取得数组长度 Console.WriteLine(a3.Length); //遍历数组 for (int i = 0; i < a4.Length; i++) { Console.WriteLine(a4[i]); } } } }
2.3. 数组元素的访问
在 C#中,对数组的访问即是对其元素的访问。比如有这样的一个数组:
int[] array={10,20,30,40,50};
我们如何去访问里面的元素呢?在内存中,一维数组的元素是按照顺序来存储的,如图所示:
每个数组元素在数组中都有一个顺序号,称为 索引或 下标。对数组元素的访问,我们只要知道数
组的名字以及元素在数组中的索引即可。访问数组元素的格式如下:
数组名称[ 索引 ];
对于这个 array 数组,array[0]就是第一个数 10,array[1]就是第二个数 20,依次类推,
array[4]就是最后一个数 50。
小贴士:索引的范围是从 0 到“长度-1”之间。索引是不能自定义的。
知道了数组元素的访问方式,我们可以对数组元素进行依次赋值,如下代码:
int[] arr=new int[3]; arr[0]=10; arr[1]=20; arr[2]=30;
当然,这种写法进行大量的赋值时,显得较麻烦,不如初始化方便。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { //定义长度为5的数组,循环向数组中输入5个数字,遍历数组并输出 //使用2个循环,第1个控制输入,第2个控制输出,并列关系,不要嵌套 static void Main(string[] args) { int[] a = new int[5]; //定义长度为5的数组 for (int i = 0; i < a.Length; i++) { Console.Write("请输入第{0}个数字:",i+1); a[i] = Convert.ToInt32(Console.ReadLine()); } for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } } } }
定义一个字符串数组保存 4 个影片,影片信息由用户输入,最后输出全部影片信息。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { //定义一个字符串数组保存 4 个影片,影片信息由用户输入, //最后输出全部影片信息。 String[] a = new String[4]; for (int i = 0; i < a.Length; i++) { Console.Write("请输入第{0}部影片名称:", i + 1); a[i] = Console.ReadLine(); } Console.WriteLine("影片信息如下:"); for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } } } }三、算法及其实现
算法是解决问题的步骤,代表着用系统的方法描述解决问题的策略机制。在计算机科学中,算法
使用计算机语言来描述,代表用计算机解决某一特定类型问题的精确而有效的方法。常见的算法有最
大(小)值、求和、求平均、查找、排序等,数组在这些算法的实现中经常使用。
3.1. 求最大值/ 最小值
我们有一串随机数列,我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成
是一颗豆子的大小,可以将这问题的算法形象地称为“捡豆子”,详细描述如下:
(1)首先将第一颗豆子放入口袋中。
(2)从第二颗豆子开始检查,如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时
丢掉原先口袋中的豆子。反之则继续下一颗豆子,直到最后一颗豆子。
(3)最后口袋中的豆子就是所有的豆子中最大的一颗。
如果是求最小值,则是类似的过程,只要把小的豆子留下即可。那么,使用 C#来实现这个算法,
这个随机的数列就可以使用数组来存放,算法的实现如下面的例子。
例 5.3 输入 5 本书籍的价钱,求出最高价钱。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //定义长度为5的双精度数组 double[] books=new double[5]; //输入书的价格 for (int i = 0; i < books.Length; i++) { Console.Write("请输入第{0}本书的价格:",i+1); books[i] = Convert.ToDouble(Console.ReadLine()); } //假定第1本书为最高价格 double max = books[0]; //从第2本找出最高价格的图书 for (int i = 1; i < books.Length; i++) { //如果当前图书的价格比最高价格的图书价格还要高 if (books[i] > max) { max = books[i]; } } Console.WriteLine("最高价格是:"+max); } } }
课堂作业: 举一反三:输入 5 本书籍的价钱,然后找出最便宜的书的价格。
3.2. 求和/ 求平均值
求和算法非常简单,给定一串随机的序列,只要把所有数一个一个的累加起来就可以了。计算出
了序列的和,那么平均值就是:总和/个数。
例 5.4 输入 5 名员工的年龄,求出总年龄和平均年龄。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //定义长度为5的双精度数组 double[] books=new double[5]; //输入书的价格 for (int i = 0; i < books.Length; i++) { Console.Write("请输入第{0}本书的价格:",i+1); books[i] = Convert.ToDouble(Console.ReadLine()); } //假定第1本书为最高价格 double min = books[0]; //从第2本找出最高价格的图书 for (int i = 1; i < books.Length; i++) { //如果当前图书的价格比最高价格的图书价格还要高 if (books[i] < min) { min = books[i]; } } Console.WriteLine("最高价格是:"+min); } } }View Code
3.3. 数据搜索
搜索是许多程序中都会使用的一项重要操作,为了有效的进行搜索,有各种查找算法,本节介绍
线性查找算法。线性查找也称为顺序查找,在给定的随机序列中按照顺序查找某个值是否存在。它通
常从第一个元素开始,逐一检查每个元素,直至找到所需元素。
例 5.5 在含有 5 首音乐的列表中查找某首音乐。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { //所有歌曲数组 String[] music = {"泡沫","酒醉的蝴蝶","洗澡歌","在南方","好日子"}; //提示用户输入 Console.Write("请输入要查找的歌曲:"); String m = Console.ReadLine(); //查找 bool flag = false; //设置一个是否找到的变量,默认为没找到 for (int i = 0; i < music.Length; i++) { if (music[i] == m) { Console.WriteLine("您要找到歌曲在第{0}位。",i); flag = true; //找到了,修改标签 break; //结束,不再找 } } if (flag==false) { Console.WriteLine("您要找的歌曲不存在。"); } } } }View Code
3.4. 数据排序
小 到 大 升序
大 到 小 降序
排序是编程中最常用的操作之一,排序的方法很多,可以使用 Array 类的 Sort()方法和
Reverse()方法进行排序。Sort()方法用于将序列升序排序,Reverse()方法用于将序列反转。
例 5.6 对给定的随机数列表进行排序。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { int[] s = {98,89,99,100,50,0,60,1,2,3,4,5,100,200}; //排序,升序 Array.Sort(s); //反转 Array.Reverse(s); //查看排序后的结果 for (int i = 0; i < s.Length; i++) { Console.Write(s[i]+" "); } } } }四、内部测试
1、定义一个长度为8的整型数组,在数组中存放数字9、9、5、1、0、3、0、9,遍历数组循环输出这些数字。
2、定义一个长度为8的整型数组,在数组中存放数字9、9、5、1、0、3、0、9(与上题相同),将数组中小于6的数字加1,排序后显示修改后的数组。
3、实现一个汽车管理系统,实现汽车添加、汽车查询功能。要求有菜单(添加汽车、汽车查询、退出系统);汽车包含(编号、名称、速度);添加汽车时向数组中增加编号、名称与速度;汽车查询时显示所有汽车;退出系统则不再显示菜单,不再有选择功能。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication7 { /// <summary> /// 汽车类 /// </summary> class Car { public int bh; //编号 public string mc; //名称 public int sd; //速度 } class Program { static void Main(string[] args) { Car[] cars = new Car[10]; int i = 0; do { Console.WriteLine("*****************************************************"); Console.WriteLine("1、添加汽车"); Console.WriteLine("2、汽车查询"); Console.WriteLine("3、退出系统"); Console.WriteLine("*****************************************************"); Console.Write("请选择(1-3):"); int n = Convert.ToInt32(Console.ReadLine()); if (n == 1) { Console.WriteLine("添加汽车:"); Car car = new Car(); Console.Write("编号:"); car.bh=Convert.ToInt32(Console.ReadLine()); Console.Write("名称:"); car.mc =Console.ReadLine(); Console.Write("速度:"); car.sd = Convert.ToInt32(Console.ReadLine()); cars[i] = car; i++; } else if (n == 2) { Console.WriteLine("汽车查询:"); Console.WriteLine("编号\t名称\t速度"); foreach (var item in cars) { if (item != null) { Console.WriteLine("{0}\t{1}\t{2}", item.bh, item.mc, item.sd); } } } else { break; } } while (true); } } }View Code
五、控制台
Console.BackgroundColor = ConsoleColor.Green;//背景色绿色
Console.ForegroundColor = ConsoleColor.Red;//字体色红色
Console.Beep(3000, 1000); //通过控制台扬声器播放提示音。
Clear 清除控制台缓冲区和相应的控制台窗口的显示信息。
【文章出处:香港服务器 https://www.68idc.cn欢迎留下您的宝贵建议】