2.5 使用数组
声明一个变量,只能容纳一个数据,如果有相同类型的多个数据,可以使用数组来提高编程效率。
■2.5.1 数组的声明和初始化
数组的声明与变量的声明非常相似,声明一个整型变量的语法格式为:
int i;
那么声明一个整型数组的语法格式为:
int[] arr;
可以看出声明数组时,只需要在数据类型后加一对中括号即可。
声明数组的时候,也可以像变量一样,直接赋值。
1 int[] n1 = new int[10]; 2 int[] n2 =new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 3 int[] n3 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
上述代码,声明了三个整型数组,其中数组n1只声明而没有赋给任何值;n2和n3在声明的同时,完成数组的初始化。
如果要为数组n1赋值,可以通过下标,逐个赋值,例如n1[2]=3。
■2.5.2 一维数组
下面以计算1~10之间的奇数和为例,说明一维数组的用法。
1 int[] a= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 2 int total = a[0] + a[2] + a[4] + a[6] + a[8];
上述代码中,第1行声明了一个具有10个元素的整型数组,第2行代码累加数组a的5个元素。C#数组的下标是从0开始的,因此上述代码相当于累加1+3+5+7+9,最后变量total返回25。
注意 C#数组的下标是从0开始的。
■2.5.3 数组元素的遍历
还是以上面的数字加和问题为例,说明如何使用循环处理数组。
1 public void Sum() 2 { 3 int[] n = new int[10]; 4 for (int i = 0; i < n.Length; i++) 5 { 6 n[i] = i + 1; 7 } 8 int total = 0; 9 for (int i = 0; i < n.Length; i = i + 2) 10 { 11 total += n[i]; 12 } 13 MessageBox.Show(total.ToString()); 14 }
上述代码中,第4行到第7行,使用for循环为数组n赋初值。第8行把总和变量total初始化为0,第9行到第12行这个for循环体,步长为2,访问数组n中的奇数,累加给total,最后返回25。
代码中n.Length表示数组的长度,也就是指数组中元素个数。
为了加深对数组的理解和认识,再举一个用数组处理斐波那契数列的问题。
斐波那契数列是数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子引入的有趣数列,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…,可以看出该数列前两项固定为0和1,从第三项起,每一项均等于该项前面两项之和。
在数学上,斐波纳契数列以递归的方法定义:F(0)=0, F(1)=1, F(n)=F(n1)+F(n-2)(n≥2, n∈N*)。
因此可以使用C#中的数组打印出斐波那契数列的前20项:
1 public void Fibonacci() 2 { 3 int[] F = new int[20]; 4 F[0] = 0; 5 F[1] = 1; 6 for (int i = 2; i < F.Length; i++) 7 { 8 F[i] = F[i -2] + F[i -1]; 9 } 10 string result = ""; 11 for (int i = 0; i < F.Length; i++) 12 { 13 result += F[i].ToString()+ " "; 14 } 15 this.richTextBox1.Text =result; 16 }
上述代码中,第4行到第9行为数组F赋值,第11到第14行再次使用for循环遍历斐波那契数组各个元素,并且把每一个元素追加到result之后,最后在富文本框中显示如下内容:0 1 1 2 3 5 8 13 21 34 55 89144 233377 610987 159725844181
以下代码是典型的用于处理数组的示例,读者自行调试体会。
1 public void一维数组() 2 { 3 string[] arr = { "ab", "cd" }; 4 int[] a = new int[3]; 5 a[0] = 3; a[1] = 4; a[2] = 5; 6 result = arr[0] + arr[1]; 7 foreach (var v in a)//遍历数组元素 8 { 9 result += v.ToString(); 10 } 11 }
具有同样功能的VBA代码如下:
1 Public Sub一维数组() 2 Dim arr(0 To 1) As String 3 arr(0) = "ab": arr(1) = "cd" 4 Dim a(0 To 2) As Integer 5 Dim v 6 a(0) = 3: a(1) = 4: a(2) = 5 7 result = arr(0) + arr(1) 8 For Each v In a '遍历数组元素 9 result = result & v 10 Next v 11 End Sub
■2.5.4 二维数组
二维数组用来存储二维方阵数据,比如存储中国各省的省会城市,省的简称等信息。
1 public void province() 2 { 3 string[, ] p = new string[5, 3] { { "河北省", "冀", "石家庄" }, { "河 南省", "豫", "郑州" }, { "湖北省", "鄂", "武汉" }, { "湖南省", "湘", "长沙" }, { "江苏 省", "苏", "南京" } }; 4 for (int r = 0; r < 5; r++) 5 { 6 MessageBox.Show(p[r, 0] + p[r, 2]); 7 } 8 }
上述代码中,第3行声明了一个字符串二维数组p,并且把5个省的信息作为初值赋给p。数组p的第一维长度是5,表示存储了5个省的信息;第二维的长度是3,表示存储每个省的省名称、省简称和省会城市名。
第4行到第6行遍历每一个省,并把省名称和省会城市名在对话框中显示。
多维数组元素的表示,还是使用一个中括号,里面每一维的下标用半角逗号隔开,比如代码中的p[r,0]表示第r个省的省名称。
下面再举一个利用二维数组生成九九乘法表的经典代码:
1 public void multiply() 2 { 3 string[, ] t = new string[9, 9]; 4 string result = ""; 5 int R, C; 6 for (int r = 0; r < 9; r++) 7 { 8 result += "\n"; 9 R = r + 1; 10 for (int c = r; c < 9; c++) 11 { 12 C = c + 1; 13 result += R + "*" + C + "=" + (R *C) + " "; 14 } 15 } 16 MessageBox.Show(result); 17 }
上述代码中,第3行声明一个9行9列的二维字符串数组t,该数组每一个元素存储乘法表中每一句口诀。第5行声明了两个大写字母,用来表示乘法表中的实际数字,因为数组的下标是从0开始,而乘法表是从1开始,故此要加1。
特别注意的是代码中第10行,循环变量c是从r开始的,而不是从0开始,这样产生的乘法表将是一个上三角矩阵,而不是矩形方阵。
运行效果如图2.4所示。
图2.4 使用二维数组生成九九乘法表
遍历二维数组,就需要双层for循环才能遍历到全部元素,以下是典型的处理二维数组的代码,读者自行调试体会。
1 public void二维数组() 2 { 3 int[, ] a = { { 1, 2, 3 }, { 4, 5, 6 } }; 4 result = a[0, 0] + "\t" + a[1, 2]; 5 string[, ] arr = new string[2, 4]; 6 for (int i = 0; i < 2; i++)//二维数组赋值 7 { 8 for (int j = 0; j < 4; j++) 9 { 10 arr[i, j] = (i * 10 + j).ToString(); 11 } 12 } 13 result += arr[1, 1]; 14 }
具有同样功能的VBA代码如下:
1 Public Sub二维数组() 2 Dim arr(0 To 1, 0 To 3) As String 3 Dim i As Integer, j As Integer 4 For i = 0 To 1 '二维数组赋值 5 For j = 0 To 3 6 arr(i, j) = (i * 10 + j) 7 Next j 8 Next i 9 result = arr(1, 1) 10 End Sub