本次课内容:二维数组
教学目的:掌握相关概念及其定义方法,掌握引用方法和初始化
方法,理解数组地址,了解多维数组。
重点:二维数组概念、定义方法、初始化方法和引用。
难点:理解二维数组是一个一维数组,而每一个数组元素又是一
个一维数组,如何用下标来确定二维数组中的元素值。
预习,
一维数组的定义、初始化和引用。
定义,类型标识符 数组名 [ 元素个数 ];
初始化,(1) 元素定义的初值个数不足时,用零补齐。
如 static int a[ 5]={1,2,3};
(2)元素定义时赋初值,可以不指定数组个数;
如 static int a[ ]={1,2,3,4,5];
(3)静态和外部存储类型的数组不进行初始化,隐含的初
值为零或空字符,自动类型数组未初始化,其值不确定。
static char ch1[5]; /*ch1[0]~ch1[4]中的值为空,即
‘’ */
static int m[5]; /*m[0]~m[4]中的值为零 */
float p[5]; /*p[0]~ p[4]中的值不确定 */
一维数组举例,
按学号输入 5 个学生的 C语言考试成绩,计算总成绩和平均成绩并
输出。
#include,stdio.h”
#define M 6
void pin(int s[ ],int n);
void pout(int p[ ],int m);
void paver(int v[ ],int k);
main()
{ int a[M]={0};
pin(a,M);
paver(a,M);
pout(a,M);
}
void pin(int s[ ],int n)
{ int i;
for (i=1;i<n;i++)
scanf(“%d\n”,&s[i]);
}
void pvaer(int v[ ],int n)
{ int j,vaer=0;
for ( j=1;j<n;j++)
vaer+=p[j];
printf(“aver=%d\n”,vaer/5);
}
void pout(int p[ ],itn n)
{ int j;
for ( j=1;j<n;j++)
printf(“#%d:score=%d\n”,j,p[j] );
}
一、二维数组的概念及其定义
当数组中每个元素带有两个下标时,称这样的数组为二维
数组。逻辑上可以把二维数组看成是一份具有行和列的表格或一
个矩阵。
二维数组的定义形式,
类型名 数组名 [ 常量表达式 1][常量表达式 2],… ;
如,int a[3][4] ;
说明:定义了一个名为 a 的二维数组; a 数组中每个元素都是整
型; a数组中共有 3× 4个元素; a数组的逻辑结构是一个具有 3行 4
列的矩阵(或表格)
第 0列 第 1 列 第 2列 第 3 列
第 0行 a[0][0] a[0][1] a[0][2] a[0][3]
第 1行 a[1][0] a[1][1] a[1][2] a[1][3]
第 2行 a[2][0] a[2][1] a[2][2] a[2][3]
a数组中的元素在内存中占一系列连续的存储单元。
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]
注,a 数组可以看成是由 a[0],a[1],a[2]三个元素组成的一维数组。
其中每个元素又是由四个元素组成的一维数组。
其中 a[0],a[1],a[2]作为数组名来处理。
二、二维数组元素的引用
引用二维数组元素时必须带有两个下标,
类型名 数组名 [下标表达式 1][下标表达式 2]
如,double w[4][2];
w[0][1],w[i][j],w[i+k][j+k]是合法引用形式。
下标值是整数,且不得超出上界和下界,一但超出则值不确
定,同时带来对程序代码或其它数据的破坏。
不可写成,w[0,1],w[i,j],w[i+k,j+k],w[3][2]。
a [0]
a [1]
a [2]
a [0] a [1] a[2] a [3]
a [0] a [1] a[2] a [3]
a [0] a [1] a[2] a [3]
三、二维数驵的初始化
1、所赋初值个数与数组元素个数相同
int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
2、每行所赋初值个数少于元素个数
int a[4][3]={{1,2},{4,5},{7},{9}};
对行数据不足的元素补初值 0。
3、所赋初值行数少于数组行数
int a[4][3]={{1,2},{4,5}};
对未赋值各行补初值 0。
4、赋初值时省略行花括号
int a[4][3]={1,2,3,4,5};
元素所赋初值按元素在内存中的排列顺序赋值,行列不足的
初值用 0补充。
5、通过赋初值定义二维数组的大小
int a[ ][3]={{1,2,3},{4,5},{6},{8}};
根据花括号对数决定了数组的行数,等价于 a[4][3]。
int b[ ][2]={1,2,3,4,5};
根据初值个数和数组列数决定数组的行数,等价于 b[3][2]
四、二维数组举例
1、通过键盘给 2× 3的二维数组输入数据,第一行为 1,2,3,第二
行为 10,20,30。
main()
{ int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf(“%d”,&a[i][j]);
for (i=0;i<2;i++)
{ for (j=0;j<3;j++)
printf(“%4d”,a[i][j]);
printf(“\n”);
}
}
2、有 n个学生,每个学生 m门课,已知所有学生的各门课的成绩,
分别求每门课的平均成绩和每个学生的平均成绩。设有如下成绩,
计算第一个学生的总成绩:当 i=0 时 for (j=0;j<3;j++) s+=a[i][j];
计算所有学生的平均成绩,
for (i=0;i<3;i++)
{ s=0;
for (j=0;j<3;j++)
s+=a[i][j];
printf(“#%d, aver=%d\n”,i+1,s/3);
}
a[0]
a[1]
a[2]
a
89 78 56
a [0] a [1] a[2]
89 78 56
89 78 56
a[0] a [1] a [2]
a[0] a [1] a[2]
数学 英语 语言 i j
计算某科总成绩,
当 j=0 (数学)
for(i=0;i<3;i++)
cour+=a[i][j]
所有课程的平均成绩
for(i=0;i<3;i++)
{ cour=0
for(j=0;j<3;j++)
{ cour+=a[j][i]; printf(“aver=%d\n”,cour/3); }
所以,求某科平均成绩的函数为,
void cour_ave(int a,int b,float score[3][3] ) /*a为行数,b为列数 */
{ int i,j; float cour;
for(i=0;i<a;i++)
{ cour=0 ;
for(j=0;j<b;j++)
{ cour+=a[i][j]; printf(“aver=%d\n”,cour/3); }
}
}
a[0]
a[1]
a[2]
89 78 56
a [0] a [1] a[2]
89 78 56
89 78 56
a[0] a [1] a [2]
a[0] a [1] a[2]
i j 数学 英语 语言
小结,
1、二维数组通过两个下标定义,第一个下标一般表示行,第二个
下标表示列。
2、二维数组可看作是一个一维数组,每个数组元素又是一个一维
数组。
3、二维数组初始化可用一对花括号将一行的数据括起来,也可去
掉每行的花括号,此时将所有数据按数组元素在内存的排列顺序存
放。
4、二维数组元素引用时,一般采用双重循环结构,外循环变量一
般表示行下标,内循环变量一般表示列下标。
5、二维数组一般处理表或矩阵数据。
6、二维数组作为实参时,形参也应是二维数组(目前)。
作业,P175_5.3