资源简介 (共29张PPT)C 语言程序设计2023翻转课堂实用教程7.2 二维数组1234导入二维数组导入案例二维数组的定义引用初始化存储方式知识点二维数组的使用案例案例分析练习二维数组的使用练习题导入案例案例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字母的一部分,值为1for(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行 1232、二维数组的引用二维数组中各个元素的引用方式:数组名[元素的行下标][元素的列下标];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 45 6 7 89 10 11 120 1 2 30123、二维数组的初始化(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 45 6 7 89 10 11 120 1 2 3012在定义数组时如果对所有元素赋值,可以省略行长度。3、二维数组的初始化(1)在定义数组时初始化数据类型名 数组名[行长度][列长度]={元素初值表};7.2.1二维数组知识点② 元素初值表给部分元素赋值若按行连续赋值,则将初始表中给出的初值先按行再按列依次赋值给数组元素,其余元素自动赋值为0。举例: int rect[3][4] = {1,2,3,4,5,6};1 2 3 45 6 0 00 0 0 00 1 2 30123、二维数组的初始化(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}; // 所有元素赋值为01 2 3 45 6 0 00 0 0 00 1 2 30123、二维数组的初始化(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行 123案例分析二维数组的编程方法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二维数组案例分析#includeint 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 46 810 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 10int 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!");elseprintf("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 10int 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运行结果//有错误的源程序#includeint main(){int array[10][10] = {0};int flag; //标记是否存在kint 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 103 4 5 10 78 9 10 3 1输出:0 3课堂练习题7.2.3:矩阵循环左移输入两个正整数n和m,其中n表示方阵的行列数,m表示矩阵中每个元素左移的位数,随后输入n行n列的数据。请输出左移m位后的方阵。举例:输入:4 21 2 3 45 6 7 88 3 7 25 1 2 7输出:3 4 1 27 8 5 67 2 8 32 7 5 17.2.3二维数组练习题课堂练习题7.2.2:找矩阵中的是否存在某个元素,该元素是所在行最大值、所在列最大值。输入两个正整数,m和n分别表示矩阵的行数和列数,随后输入m行n列的数据,请找出该矩阵中是否存某个元素:既是其所在行的最大值,又是其所在列的最大值),如果有鞍点,则输出其所在的行列号。(本练习题基于案例7.2.3来解决)谢谢观看程序设计基础 展开更多...... 收起↑ 资源预览