内容正文:
(清华大学出版)
同步教学
《C语言程序设计》
C 语言程序设计
第六章 数 组
2
第六章 数 组
6.2 二维数组
二维数组定义:
1. 是一个一维数组,但是
2. 其每个数组元素本身,又是一个一维数组
即是:一维数组的数组
相应地,一个n维数组:
1. 是一个一维数组,但是
2. 其每个数组元素本身,又是一个n-1维数组
3
二维数组的形式
int sz[5][4];
数组的类型
数组名
第1维
具有5个元素
的一维数组
必须是常量
也必须是 常量
第2维
每个元素又是一个
具有4个元素
的一维数组
二维数组 可以看作是 一个由变量构成的矩阵
int sz[5][4];
0
1
2
3
0
1
2
3
4
列的编号
行的编号
变量的行数
变量的列数
二维数组中变量的编号
0
1
2
3
0
1
2
3
4
二维数组中
变量 的 编号,由:
行的编号,和
列的编号
两部分组成。
int sz[5][4];
如何访问二维数组中的变量
0
1
2
3
0
1
2
3
4
int sz[5][4];
…sz[2][3]…;
数组名
行的编号
列的编号
二维数组变量赋值的一种特殊方式
声明时赋值
0
1
2
3
0
1
2
3
4
int sz[5][4];
int sz[5][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 0, 1},
{2, 3, 4, 5},
{6, 7, 8, 9}
} ;
声明时赋值
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
0
1
2
3
4
int sz[5][4];
int sz[5][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 0, 1},
{2, 3, 4, 5},
{6, 7, 8, 9}
} ;
第0行变量的值
第1行变量的值
第2行变量的值
第3行变量的值
第4行变量的值
二维数组变量赋值的一种特殊方式
a00
a01
…….
a0n-1
a10
a11
……..
a1n-1
……….
am-10
am-11
……..
am-1n-1
二维数组:按行的顺序存放。
2000
2002
2004
……….
am-10 am-11 ……am-1n-1
a00 a01 …….. a0n-1
a10 a11 …….. a1n-1
………………….
按行优先顺序存放
A[m][n]=
注:在这里,amn 代表 a[m][n]。
则存放情况如下:
若有数组b[2][3]; 其中数据为: 11 12 13
21 22 23
11
12
13
21
22
23
b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2]
2000 2002 2004 ……
二维数组的输入和输出
数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)
int b[2][3], i, j;
输入方法:
输入第i行第j列元素:
scanf("%d",&a[i][j]);
输入整个数组元素:
for (i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
输出方法:
输出第i行第j列元素:
printf("%d",a[i][j]);
输出整个数组元素:
for (i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d",a[i][j]);
二维数组 应用举例
问题描述
某个年级有180名学生;
某个学期,这个年级开了8门必修课;
期末考试结束后,每个学生每门课程的成绩出来了;
请编写一段程序:
计算每个学生的平均成绩;
计算每门课程的平均成绩。
编程的基本思路
step1: 定义一个180行×8列的二维数组
用于存放学生的课程成绩
step2: 录入学生的课程成绩
step3: 计算每个学生的平均成绩,并输出
step4: 计算每门课程的平均成绩,并输出
…
…
…
…
…
…
…
…
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
8
…
179
课程编号
学生编号
double scores[180][8]
#define STUDENT_NUM 180 /*学生人数*/
#define COURSE_NUM 8 /*课程门数*/
int main( ) {
double scores[STUDENT_NUM][COURSE_NUM];/*成绩数组*/
int i, k; /*循环变量*/
/*录入学生成绩*/
for (i=0; i<STUDENT_NUM; i++)
{
for (k=0; k<COURSE_NUM; k++)
{
scanf("%lf", &(scores[i][k]));
}
}
/*计算学生平均成绩*/
for (i=0; i<STUDENT_NUM; i++)
{ double sum = 0; /*学生总成绩*
for (k=0; k<COURSE_NUM; k++)
{
sum += scores[i][k];
}
printf("Student %d: %.1f
", i, sum/COURSE_NUM);
}
/*计算课程平均成绩/
for (k=0; k<COURSE_NUM; k++)
{
/*课程总成绩*/
double sum = 0;
for (i=0; i<STUDENT_NUM; i++)
{
sum += scores[i][k];
}
printf("Course %d : %.1f
", k, sum/STUDENT_NUM);
}
#define STUDENT_NUM 180 //学生人数
#define COURSE_NUM 8 //课程门数
int main( ) {
double scores[STUDENT_NUM][COURSE_NUM]; //成绩数组
int i, k; //循环变量
for (i=0; i<STUDENT_NUM; i++) { //录入学生成绩
for (k=0; k<COURSE_NUM; k++) {
scanf("%lf", &(scores[i][k]));
}
}
for (i=0; i<STUDENT_NUM; i++) { //计算学生平均成绩
double sum = 0; //学生总成绩
for (k=0; k<COURSE_NUM; k++) {
sum += scores[i][k];
}
printf("Student %d: %.1f
", i, sum/COURSE_NUM);
}
for (k=0; k<COURSE_NUM; k++) { //计算课程平均成绩
double sum = 0; //课程总成绩
for (i=0; i<STUDENT_NUM; i++) {
sum += scores[i][k];
}
printf("Course %d : %.1f
", k, sum/STUDENT_NUM);
}
return 0;
}
6.2.5 二维数组应用举例
【例6.4】 输入一个4×4的整数矩阵,分别求两对角线上元素之和。
m[0][0] m[0][1] m[0][2] m[0][3]
m[1][0] m[1][1] m[1][2] m[1][3]
m[2][0] m[2][1] m[2][2] m[2][3]
m[3][0] m[3][1] m[3][2] m[3][3]
分析:当 i==j 时,
m[i][j]在主对角线上
当 i+j==3 时,
m[i][j]在次对角线上
第六章 数 组
#define N 4
#include<stdio.h>
void main()
{ int m[N][N];
int i, j, r1=0, r2=0;
for( i=0;i<N;i++)
{ printf("%d line:",i);
for(j=0;j<N;j++)
{ scanf("%d",&m[i][j]);
if(i==j) r1+=m[i][j];
if(i+j==N-1) r2+=m[i][j];
} }
printf("the result: %d, %d
",r1,r2);
}
第六章 数 组
6.2.5 二维数组应用举例
【例6.6】将1个 3*2 矩阵存入1个 3*2 的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。
row 记录 最大值的行下标
col 记录 最大值的列下标
a[row][col] 就是最大值
第六章 数 组
#include<stdio.h>
int main( )
{ int i, j, row, col;
int a[3][2];
printf("Enter 6
integers:
") ;
for(i = 0; i < 3; i++)
for(j = 0; j < 2; j++)
scanf("%d",
&a[i][j]);
for(i = 0; i < 3; i++){
for(j = 0; j < 2; j++)
printf("%4d",
a[i][j]);
printf("
");
}
row = col = 0;
for(i = 0; i < 3; i++)
for(j = 0; j < 2; j++)
if(a[i][j] > a[row][col]){
row = i; col = j;
}
printf("max = a[%d][%d] = %d
", row, col, a[row][col]);
return 0;
}
第六章 数 组
二维数组应用举例
【课外练习】一个专业有M个同学,某个学期共选修了N门课程,编程求每个同学的平均成绩和每门课程的平均成绩。要求建立二维数组,将每个同学的平均成绩及每门课程的平均成绩都反映到数组当中。
第六章 数 组
#include<stdio.h>
#define M 2
#define N 3
void main()
{ float s[M+1][N+1];
int i,j;
printf("输入学生成绩:
");
/* 求学生的平均分 */
for(i=0;i<M;i++)
{ s[i][N]=0;
printf("输入第%d个学生
的成绩:",i);
for(j=0;j<N;j++)
{ scanf("%f",&s[i][j]);
s[i][N]+=s[i][j];
}
s[i][N]/=N;
}
/* 求课程的平均分 */
for(j=0;j<N+1;j++)
{ s[M][j]=0;
for(i=0;i<M;i++) s[M][j]+=s[i][j];
s[M][j]/=M;
}
printf("
学生的成绩及平均分:
");
for(i=0;i<M;i++)
{ printf("第%d个学生的成绩:",i);
for(j=0;j<=N;j++)
printf("%8.1f",s[i][j]);
printf("
"); }
printf("
平均分分别为:
");
for(j=0;j<N;j++)
printf("%8.1f",s[M][j]);
printf("
");
}
第六章 数 组
感谢观看
20XX
$$