7.2 二维数组 课件(共29张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源下载
  1. 二一教育资源

7.2 二维数组 课件(共29张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源简介

(共29张PPT)
C 语言程序设计
2023
翻转课堂实用教程
7.2 二维数组
1
2
3
4
导入二维数组
导入案例
二维数组的定义
引用
初始化
存储方式
知识点
二维数组的
使用案例
案例分析
练习二维数组
的使用
练习题
导入案例
案例7.2.1:将C字母保存到矩阵中,并将该矩阵输出到屏幕上。
现有一个C字母的黑白像素图片,下图,在该图片中,C字母的像素点使用黑色表示,其他地方用白色显示。试用矩阵的形式将该图片输出出来。
导入案例
案例7.2.1:将C字母保存到矩阵中,并将该矩阵输出到屏幕上。
为了方便输出,黑色的像素点的矩阵值用1来表示,白色像素点的矩阵值用0来表示。
C字母对应的矩阵
如何保存矩阵中各个元素的值?
9行8列
二维数组
导入案例
#include
#define M 9 //宏定义,M表示行数,9行
#define N 8 //N为列数,8列
int main(){
/*9行8列的矩阵,需要9行8列的二维数组来存放,初值为0*/
int pic[M][N] = {0};
int i,j;
//1行3、4、5、6列为C字母的一部分,值为1
for(i=3;i<=6;i++)
pic[1][i] = 1;
/*同样,2行2列、3行1列、4行1列、5行1列、6行 2列为C字母一部分,值为1*/
pic[2][2]=1,pic[3][1]=1,pic[4][1]=1,pic[5][1]=1;
pic[6][2]=1;
for(i=3;i<=6;i++)
pic[7][i] = 1;
/*以上代码将C字母的矩阵保存到了二维数组中,下面将该二维数组输出即可。*/
for(i=0;ifor(j=0;jprintf("%2d",pic[i][j]);
printf("\n");
}
return 0;
}
运行结果
案例7.2.1程序代码
对矩阵的操作可以用对二维数组的操作来实现。
1、二维数组的定义
二维数组的定义方式为:
数据类型名 数组名[行长度][列长度];
举例:
//定义一个10行10列的二维整型数组rect,共10*10=100个元素。
int rect[10][10] ;
//定义一个10行20列的二维字符数组names,共有10*20=200个字符元素。
char names[10][20];
7.2.1二维数组知识点
二维数组可被看作一个矩阵,有行也有列。定义时,第一个[]内指出的是二维数组的总行数,第二个[]内指出的是该二维数组的总列数,均为整型常量。
每个元素的类型
合法标识符
2、二维数组的引用
二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];
7.2.1二维数组知识点
(1) 先定义,再引用。
(2) 二维数组中的元素,需要通过其所在的行和列来唯一确定。
(3) 行、列下标均为整型表达式,行下标取值范围:0~行长度-1;列下标取值范围:0~列长度-1,不在这个范围内的下标值为越界,越界会导致溢出。上溢或者下溢会导致程序出现不可预料的错误。
(4) 只能逐个引用数组元素,不能一次性引用整个数组。对数组元素的引用是自由的,通过数组名和元素的行下标、列下标可唯一确定一个数组元素。
在引用,需要给定该元素的行下标和列下标。
第一个[]中的数值为元素的行下标。
第二个[]中数值为元素的列下标。
2、二维数组的引用
二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];
7.2.1二维数组知识点
举例:
int rect[4][3] ; //定义了一个4行3列的二维数组rect,共4*3=12个元素。
一维数组rect[0]
一维数组rect[1]
一维数组rect[2]
一维数组rect[3]
二维数组逻辑存储方式
0
行 1
2
3
2、二维数组的引用
二维数组中各个元素的引用方式:
数组名[元素的行下标][元素的列下标];
7.2.1二维数组知识点
举例:
int rect[4][3] ; //定义了一个4行3列的二维数组rect,共4*3=12个元素。
二维数组按行存储示意图
rect[0][0] rect[0][1] rect[0][2] rect[1][0] rect[1][1] rect[1][2] rect[2][0] rect[2][1] rect[2][2] rect[3][0] rect[3][1] rect[3][2]
rect[0] rect[1] rect[2] rect[3]
在实际内存中的存放方式是按行存储
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
根据元素初值表中给出的元素的个数,分三种情况为数组进行初始化:
①元素初值表给所有元素赋值
② 元素初值表给部分元素赋值
③没有元素初值表
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
①元素初值表给所有元素赋值
举例1:
int rect[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
该行代码采用按行分段赋值的方法对rect数组进行初始化。
1 2 3 4
5 6 7 8
9 10 11 12
0 1 2 3
0
1
2
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
①元素初值表给所有元素赋值
举例2:
int rect[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
第0行所有元素 第1行所有元素 第2行所有元素
该行代码采用先按行再按列连续赋值的方法对rect数组进行初始化。
1 2 3 4
5 6 7 8
9 10 11 12
0 1 2 3
0
1
2
在定义数组时如果对所有元素赋值,可以省略行长度。
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
② 元素初值表给部分元素赋值
若按行连续赋值,则将初始表中给出的初值先按行再按列依次赋值给数组元素,其余元素自动赋值为0。
举例: int rect[3][4] = {1,2,3,4,5,6};
1 2 3 4
5 6 0 0
0 0 0 0
0 1 2 3
0
1
2
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
② 元素初值表给部分元素赋值
按行分段赋值,举例:
int rect[3][4] = {{1,2,3,4},{5,6}};
第0行元素 第1行的元素
int rect[10][10] = {8};
int rect[3][4] = {0}; // 所有元素赋值为0
1 2 3 4
5 6 0 0
0 0 0 0
0 1 2 3
0
1
2
3、二维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[行长度][列长度]={元素初值表};
7.2.1二维数组知识点
③没有元素初值表
分两种情况:
普通数组
int arr[2][3]; //动态数组,所有元素的值是一个随机值。
定义时加上static关键字的静态数组
static int arr[2][3]; //若没有对静态数组元素赋初值,所有元素自动被赋初值0。
3、二维数组的初始化
(2)在定义数组后,单独对数组元素赋值
7.2.1二维数组知识点
此时需要挨个为数组元素赋值,可以一个一个元素赋值,也可以用双重循环赋值。
举例:
int arr[2][3];
arr[0][0]=80,arr[0][1]=90, arr[0][2]=85,arr[1][0]=78,arr[1][1]=94, arr[1][2]=75;
4、多维数组
7.2.1二维数组知识点
在前面讲解二维数组的引用时,我们讲到二维数组可以理解为多个一维数组,C语言允许这样解释。
同样的,多维数组可以由二维数组类推而得到,此书不再讲解多维数组的问题。
一维数组rect[0]
一维数组rect[1]
一维数组rect[2]
一维数组rect[3]
二维数组逻辑存储方式
0
行 1
2
3
案例分析
二维数组的编程方法
7.2.3判断下三角矩阵
7.2.4求矩阵每行的最大值,以及每列的最小值
演示遍历二维数组中每个元素的方法
分别用行下标、列下标作为外层循环对矩阵的不同访问。
行列下表作为循环变量,双层循环,遍历数组
演示矩阵的下三角位置行列下标的关系。
7.2.2二维数组案例分析
7.2.2数据a与矩阵相乘
二维数组的编程:
二维数组涉及到两个下标,将数组行下标和列下标分别作为循环变量,双重循环,遍历数组。
行下标作为外循环变量、列下标作为内循环变量,就会按照行来遍历数组;相反的,就会按照列来遍历数组。
C语言中二维数组是按行存储的,按行遍历数组,程序执行效率最高。
7.2.2二维数组案例分析
案例7.2.2:将一个数a与矩阵相乘,并将结果保存到二维数组中,然后输出。
要求:输入第一行为三个整数a、m和n,中间用空格隔开,m和n分别为矩阵的行和列(1≤m,n≤10)。随后的m行,每行输入n个整数,每个整数间用空格隔开。输出a与该矩阵相乘后的矩阵,并保存到二维数组中,然后输出。
问题分析:在输入时,矩阵中的元素值是按行给出的,所以在读取矩阵中的元素值,也是要按行存放在二维数组中,按行存放时,行下标作为外循环变量,列下标作为内循环变量。
7.2.2二维数组案例分析
#include
int main(){
int rect[10][10] = {0};
int a,m,n,i,j,value;
scanf("%d",&a);
scanf("%d %d",&m,&n);
for(i=0;ifor(j=0;jscanf("%d",&value);
/*将矩阵中的所有元素*a后存在相应位置的二维数组中*/
rect[i][j] = a*value;
}
}
for(i=0;ifor(j=0;jprintf("%d ",rect[i][j]);
//当第i行的所有元素输出后,需要换行,准备下一次循环输出第i+1行的元素
printf("\n");
}
return 0;
}
运行结果:
输入:
2 3 2↙
1 2↙
3 4↙
5 6↙
输出:
2 4
6 8
10 12
运行结果
案例7.2.2程序代码
7.2.2二维数组案例分析
案例7.2.3:判断下三角矩阵
要求:输入第一行为一个整数m(1≤m≤10),表示方阵的行数和列数。随后m行数据,每一行都有m个整数,用空格隔开,试判断该方阵是否为下三角矩阵:如果一个方阵的主对角线上方的元素全部为0,这个矩阵就成为下三角矩阵。
7.2.2二维数组案例分析
用二维数组a表示m*m方阵时,对应关系:
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
主对角线:i == j
副对角线:i+j == m-1
上三角: i <= j
下三角: i >= j
#include
#define MAX 10
int main(){
int rect[MAX][MAX] = {0};
int m,i,j;
int flag = 1; //flag为1:为下三角矩阵,flag为0:不为下三角矩阵。
scanf("%d",&m);
for(i=0;ifor(j=0;jscanf("%d",&rect[i][j]);
}
for(i=0;ifor(j=i+1;jif(rect[i][j] != 0){
flag = 0;
break;
}
}
}
if(flag == 1)
printf("lower triangular matrix!");
else
printf("not lower triangular matrix!");
return 0;
}
运行结果1:
5↙
1 0 0 0 0↙
1 0 0 0 0↙
1 2 0 0 0↙
1 2 3 0 0↙
1 2 3 4 0↙
lower triangular matrix!
运行结果2:
5↙
1 0 0 1 0↙
1 0 0 1 0↙
1 2 0 0 0↙
1 2 3 0 0↙
1 2 3 4 0↙
not lower triangular matrix!
运行结果
案例7.2.3程序代码
7.2.2二维数组案例分析
若删除break,结果如何?
案例7.2.4:求矩阵每行的最大值,以及每列的最小值
要求:输入第一行为两个整数m和n(1≤m,n≤10),表示矩阵的行数和列数。随后m行数据,每一行都有n个整数,用空格隔开,试输出该矩阵每行的最大值,以及每列的最小值。
问题分析:用二维数组来保存此矩阵,该矩阵有m行n列,那么共有m个最大值,n个最小值,所以可以定义两个数组max 和min来保存所有的最大值和最小值。其中求每行最大值时,需要先按行遍历二维数组,求每列最小值时,需要按列遍历二维数组。
7.2.2二维数组案例分析
#include
#define MAX 10
int main(){
int rect[MAX][MAX];
//max保存每行最大值,min保存每列最小值
int i,j,m,n,max[MAX]={0},min[MAX]={0};
scanf("%d %d",&m,&n);
for(i=0;ifor(j=0;jscanf("%d",&rect[i][j]);
}
/*求每一行的最大值存到max数组中,共m行,所以max数组中有m个值*/
for(i=0;i//先假设第i行的第0列元素最大,再和后面列的数据进行比较
max[i] = rect[i][0];
for(j=1;jif(max[i]max[i] = rect[i][j];
}
}
案例7.2.4程序代码
7.2.2二维数组案例分析
/*求每一列的最小值存到min数组中,共n列,mim数组中有n个值*/
for(j=0;jmin[j] = rect[0][j];
for(i=1;iif(min[j]>rect[i][j])
min[j] = rect[i][j];
}
printf("每行最大值如下:");
for(i=0;iprintf("%d ",max[i]);
printf("\n每列最小值如下:");
for(i=0;iprintf("%d ",min[i]);
return 0;
}
运行结果1:
4 5↙
3 4 5 3 9↙
10 20 4 8 7↙
24 5 4 9 13↙
6 34 5 4 7↙
每行最大值如下:9 20 24 34
每列最小值如下:3 4 4 3 7
运行结果
//有错误的源程序
#include
int main(){
int array[10][10] = {0};
int flag; //标记是否存在k
int m,n,k,i,j;
scanf("%d %d %d",&m,&n,&k);
for(i=0;ifor(j=0;jscanf("%d",&array[i][j]);
if(array[i][j] == k){
flag = 1;
printf("%d %d\n",i,j);
}
}
}
if(flag == 0)
printf("不存在%d这个数",k);
return 0;
}
7.2.3二维数组练习题
课堂练习题7.2.1:程序调试题,请查找下面程序中的逻辑错误。
输入三个整数m,n,k,其中m表示二维数组的行数,n表示二维数组的列数,k表示要查找的数据;随后输入m行n列数据,请输出m行n列的数据中是否存在k这个数据,如果存在输出第一次出现k时的行列号(从0开始计数)。
输入:
2 5 10
3 4 5 10 7
8 9 10 3 1
输出:
0 3
课堂练习题7.2.3:矩阵循环左移
输入两个正整数n和m,其中n表示方阵的行列数,m表示矩阵中每个元素左移的位数,随后输入n行n列的数据。请输出左移m位后的方阵。举例:
输入:
4 2
1 2 3 4
5 6 7 8
8 3 7 2
5 1 2 7
输出:
3 4 1 2
7 8 5 6
7 2 8 3
2 7 5 1
7.2.3二维数组练习题
课堂练习题7.2.2:找矩阵中的是否存在某个元素,该元素是所在行最大值、所在列最大值。
输入两个正整数,m和n分别表示矩阵的行数和列数,随后输入m行n列的数据,请找出该矩阵中是否存某个元素:既是其所在行的最大值,又是其所在列的最大值),如果有鞍点,则输出其所在的行列号。(本练习题基于案例7.2.3来解决)
谢谢观看
程序设计基础

展开更多......

收起↑

资源预览