数组
1.什么是数组
在程序中,经常需要对一批数据进行操作,例如,统计某个公司100个员工的平均工资。如果使用变量来存放这些数据,就需要定义100个变量,显然这样做很麻烦,而且很容易出错。这时,可以使用x[0]、x[1]、x[2]……x[99]表示这100个变量,并通过方括号中的数字来对这100个变量进行区分。
在程序设计中,使用x[0]、x[1]、x[2]……x[n]表示的一组具有相同数据类型的变量集合称为数组x,数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,该下标是从0开始的。
为了大家更好地理解数组,接下来,通过一张图来描述数组x[10]的元素分配情况,如图5-1所示。
图5-1 数组x[10]
从图5-1中可以看出,数组x包含10个元素,并且这些元素是按照下标的顺序进行排列的。由于数组元素的下标是从0开始的,因此,数组x的最后一个元素为x[9]。
需要注意的是,根据数据的复杂度,数组下标的个数是不确定的。通常情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将二维及以上的数组称为多维数组。
2一维数组
一维数组指的是只有一个下标的数组,它用来表示一组具有相同类型的数据。在C语言中,一维数组的定义方式如下所示:
类型说明符 数组名[常量表达式];
在上述语法格式中,类型说明符表示数组中所有元素的类型,常量表达式指的是数组的长度,也就是数组中存放元素的个数。
例如:
int array[5];
上述代码定义了一个数组,其中,int是数组的类型,array是数组的名称,方括号中的5是数组的长度。
完成数组的定义后,只是对数组中的元素开辟了一块内存空间。这时,如果想使用数组操作数据,还需要对数组进行初始化。数组初始化的常见的方式有三种,具体如下:
1、直接对数组中的所有元素赋值,示例代码如下:
int i[5]={1,2,3,4,5};
上述代码定义了一个长度为5的数组i,并且数组中元素的值依次为1、2、3、4、5。
2、只对数组中的一部分元素赋值,示例代码如下:
int i[5]={1,2,3};
在上述代码中,定义了一个int类型的数组,但在初始化时,只对数组中的前三个元素进行了赋值,其它元素的值会被默认设置为0。
3、对数组全部元素赋值,但不指定长度,示例代码如下:
int i[]={1,2,3,4};
在上述代码中,数组i中的元素有4个,系统会根据给定初始化元素的个数定义数组的长度,因此,数组i的长度为4。
1 #include <stdio.h>
2 void main(int argc, char ** argv[])
3 {
4 int x[5] = { 9, 8, 3, 5, 2 };
5 int m = 0, n = 0;
6 int nTemp = 0;
7 int i = 0;
8 printf("冒泡排序前:\n");
9 for (i = 0; i < 5; i++)
10 {
11 printf("%d ", x[i]);
12 }
13 printf("\n");
14 for (m = 0; m < 5 - 1; m++)
15 {
16 for (n = 0; n < 5 - 1 - m; n++)
17 {
18 if (x[n] > x[n + 1])
19 {
20 nTemp = x[n];
21 x[n] = x[n + 1];
22 x[n + 1] = nTemp;
23 }
24 }
25 }
26 printf("冒泡排序后:\n");
27 for (i = 0; i < 5; i++)
28 {
29 printf("%d ", x[i]);
30 }
31 printf("\n");
32 }
3.二维数组
在实际的工作中,仅仅使用一维数组是远远不够的,例如,一个学习小组有5个人,每个人有三门课的考试成绩,如果使用一维数组解决是很麻烦的。这时,可以使用二维数组,二维数组的定义方式与一维数组类似,其语法格式如下:
类型说明符 数组名[常量表达式1][常量表达式2];
在上述语法格式中,“常量表达式1”被称为行下标,“常量表达式2”被称为列下标。
例如,定义一个3行4列的二维数组,具体如下:
int a[3][4];
在上述定义的二维数组中,共包含3*4个元素,即12个元素。接下来,通过一张图来描述二维数组a的元素分布情况,如图5-8所示。
图5-8 二维数组
从图5-8中可以看出,二维数组a是按行进行存放的,先存放a[0]行,再存放a[1]行、a[2]行,并且每行有四个元素,也是依次存放的。
完成二维数组的定义后,需要对二维数组进行初始化,初始化二维数组的方式有四种,具体如下:
1、按行给二维数组赋初值。例如:
int a[2][3] = {{1,2,3},{4,5,6}};
在上述代码中,等号后面有一对大括号,大括号中的第一对括号代表的是第一行的数组元素,第二对括号代表的是第二行的数组元素。
2、将所有的数组元素按行顺序写在一个大括号内。例如:
int a[2][3] = {1,2,3,4,5,6};
在上述代码中,二维数组a共有两行,每行有三个元素,其中,第一行的元素依次为1、2、3,第二行元素依次为4、5、6。
3、对部分数组元素赋初值。例如:
int b[3][4] = {{1},{4,3},{2,1,2}};
在上述代码中,只为数组b中的部分元素进行了赋值,对于没有赋值的元素,系统会自动赋值为0,数组b中元素的存储方式如图5-9所示。
图5-9 二维数组b
4、如果对全部数组元素置初值,则二维数组的第一个下标可省略,但第二个下标不能省略。例如:
int a[2][3] = {1,2,3,4,5,6};
可以写为
int a[][3] = {1,2,3,4,5,6};
系统会根据固定的列数,将后边的数值进行划分,自动将行数定位2。
1 #include<stdio.h>
2 void main()
3 {
4 //声明并初始化数组
5 int array[3][4] = { {1,2,3,4 }, {5,6,7,8}, {9,10,11,12} };
6 for (int i = 0; i < 3; i++) //循环遍历行
7 {
8 for (int j = 0; j < 4; j++) //循环遍历列
9 {
10 printf("[%d][%d]: %d ", i, j, array[i][j]);
11 }
12 printf("\n");//每一行的末尾添加换行符
13 }
14 }
二维数组的应用
熟悉了二维数组的定义和引用,接下来定义一个二维数组StuScore[5][3],用来存放5名同学3门课程的成绩,并定义变量m表示学生,n表示第几门成绩,aver表示每名同学3门课程的平均成绩,sum表示每名同学3门课的总成绩,具体如例5-6所示。
例5-6
1 #include <stdio.h>
2 void main(int argc, char * argv[])
3 {
4 int StuScore[5][3] = {
5 //张同学
6 { 88, 70, 90 },
7 //王同学
8 { 80, 80, 60 },
9 //李同学
10 { 89, 60, 85 },
11 //赵同学
12 { 80, 75, 78 },
13 //周同学
14 { 70, 80, 80 }
15 };
16 int m = 0, n = 0;
17 int nStuTotalScore;
18 int nMathTotalScore = 0;
19 int nChineseTotalScore = 0;
20 int nEnglishTotalScore = 0;
21 printf("个人总成绩:\n");
22 for (m = 0; m < 5; m++)
23 {
24 nStuTotalScore = 0;
25 for (n = 0; n < 3; n++)
26 {
27 nStuTotalScore += StuScore[m][n];
28 switch (n)
29 {
30 case 0:
31 {
32 nMathTotalScore += StuScore[m][0];
33 break;
34 }
35 case 1:
36 {
37 nChineseTotalScore += StuScore[m][1];
38 break;
39 }
40 case 2:
41 {
42 nEnglishTotalScore += StuScore[m][2];
43 }
44 }
45 }
46 switch (m)
47 {
48 case 0:
49 {
50 printf("张同学:%d\n", nStuTotalScore);
51 break;
52 }
53 case 1:
54 {
55 printf("王同学:%d\n", nStuTotalScore);
56 break;
57 }
58 case 2:
59 {
60 printf("李同学:%d\n", nStuTotalScore);
61 break;
62 }
63 case 3:
64 {
65 printf("赵同学:%d\n", nStuTotalScore);
66 break;
67 }
68 case 4:
69 {
70 printf("周同学:%d\n", nStuTotalScore);
71 break;
72 }
73 }
74 }
75 printf("小组数学总分:%d 小组数学平均分:%.2f\n",
76 nMathTotalScore, (double)nMathTotalScore / 5);
77 printf("小组语文总分:%d 小组语文平均分:%.2f\n",
78 nChineseTotalScore, (double)nChineseTotalScore / 5);
79 printf("小组英语总分:%d 小组英语平均分:%.2f\n",
80 nEnglishTotalScore, (double)nEnglishTotalScore / 5);
81 }
运行结果如图5-11所示。
图5-11 运行结果
例5-6中实现了计算小组各科平均分的功能。其中,第415行代码定义了一个二维数组,用来存储小组中每个成员的各科成绩。第2545行代码通过遍历列下标获取每个小组不同学科的总分,第46~74行代码通过遍历行下标获取每个小组成员的总分,最后将小组不同学科的总分和平均分输出。
浙公网安备 33010602011771号