C语言第八篇:数组(下)
数
组
6.2.1
二维数组的定义与初始化
1. 二维数组的定义
如果数组中每个元素有两个或两个以上的下标,称这样的数组为多维数组。多维数组元素有多个下标,以标识它在数组中的位置,也称为多下标变量。在多维数组中,最常用的是二维数组,即数组中每个元素都有两个下标,称这样的数组为二维数组。
二维数组定义的一般形式是:
类型说明符 数组名[常量表达式1] [常量表达式2];
其中,常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。数组中能存放数据的个数为常量表达式1与常量表达式2的乘积。例如,int a[3][4]说明了一个3行4列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3x4个,即:
a[0][0],a[0][1],a[0] [2],a[0][3]
a[1][0],a[1][1],a[1] [2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是像一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式: 一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。
在C语言中,二维数组元素在内存中的排列顺序为“ 按行存放”,假设有一个m*n的二维数组a即先存放a[0]行的n个元素,在排放a[1]行的n个元素,依次类推,最后存放a[m-1]行的n个元素,则第i行第j列的元素。a[i[j]在数组中的位置为: i*n+j+1。例如,一个二维数组的定义表示为: int a[3[4];它表示定义了一个3行4列的一个二维数组,数组中的所有元素都是整型数据。
2.二维数组的初始化
与一维数组一样,二维数组也存在一个初始化问题。二维数组的初始化有以下几种形式:
(1) 按行依次对二维数组元素赋初值。这种赋值方法是每行元素用一对大括号“{ }”括起来。例如:
int stuInf[3][5]={90,85,92,88, 95},{80,85,90,75,83}, {92, 88, 94,92,85};
(2) 将所有的数据写在一对大括号“{}”内, 按数组在内存中排列的顺序对各个数组元素赋初值。实际上,二维数组在机器中与一维数组的处理是一样的。例如:
int stuInf[3][5]={ 90,85,92, 88,95, 80, 85, 90,75,83,92,88,94,92,85};
(3)对二维数组的部分元素赋初值。例如:
int stuInf[3] [5]={ {90}, {80}, {92} };
这时要注意,未被赋值的数组元素系统自动将初始化为0。上面初始化相当于:
int stuInf[3][5]={ {90,0,0,0,0}, {80,0,0,0,0}, {92,0,0,0,0}};
(3) 如果对二维数组中的全部元素赋初值,则数组第一维的元素个数在说明时可以省略,但是第二维的元素个数不能省略。
int stuInf [ ][5]={ 90,85,92,88,95,80,85,90,75,83, 92,88, 94,92,85};
编译程序可以根据括弧里面的数据和第二维元素的个数计算第一维元素的个数为3,因此可以不指定。
6.2.2
二维数组的操作
对二维数组的操作主要就是对二维数组的引用。与一维数组的引用类似,二维数组元素引用的一般形式为:
数组名[下标][下标]
其中,第一个下标与定义二维数组时的[常量表达式1]对应,范围从0开始,到[常量表达式1]-1结束,第二个下标与定义二维数组时的[常量表达式2]对应,范围从0开始,到[常量表达式2]-1结束,下标的值 都应为整型表达式。
通过对二维数组元素的引用,二维数组的元素就可以像使用普通变量一样进行赋值、 算术运算或者输入输出操作。因此二维数组元索也被称为双元下标变量。
但是在对二维数组元素进行引用时应该注意以下问题:
(1)C语言中,必须先定义二维数组,再引用二维数组中的元素。
(2)C语言中,不能引用整个二维数组,只能对二维数组中的元素逐个引用,由于二维数组中的元素是双下标,因此一般情况下,往往使用两个for循环语句嵌套来逐个引用二维数组中的元素,如定义一个 int stulnf[3][5]二维数组来存放表中的数据,如果需要引用该二维数组中的每个元素,从键盘给其赋值,其般形式如下:
int stuInf[3] [5],i,j;
for (i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d", &stuInf [i] [j]);
这样在循环语句执行过程中,变量i的值从0~2取值,变量j的值从0~4取值,于是stuInf [i] [j]就可以依次引用 stulnf[0][0]~ stulnf[2][4]共15个数组元素。
同样,要把具有3行5列的二维数组中的每个元素的值输出,也要逐个引用数组元素,其形式如下:
for(i=0; i<3; i++)
{
for (j=0;j<5;j++)
printf("%d ", stuInf[i][j]);
printf("\n");
}
作业:计算多科平均成绩
任务描述:一个学习小组有5个人,每个人有三门课的考试成绩,求小组各科的平均成绩。
程序:
#include<stdio.h>
int main()
{
int stuInf[3] [5]; //定义一个三行五列的二维数组、用来存放学生成绩
float ave[3] ; //定乂一个一维数组用来存放三冂课程的平均成绩
int i, j,sum;
printf("请输入五个学生的三冂课程成绩: \n"); //输入成绩
for (i=0;i<3;i++)
for (j=0;j<5;j++)
scanf("%d",stuInf[i] [j]);
for(i=0;i<3;i++)
{
sum=0;
for (j=0;j<5;j++) //计算每门课程的总分
sum= sum+ stuInf[i] [j];
ave[i]= sum/5.0 ; //计算课程的平均分
}
for (i=0;i<3;i++) //输出平均成绩
{
printf("第%d门课程的平均分为: %.2f.\n",i+1 , ave[i]);
}
return 0;
}
长
按
关
注
南师大物科院学生会
整理:沈磊
排版:朱旭东
审核:苏泳 陈司