140 likes | 267 Views
单元 8 项目中数组的应用 ---- 二维数组. 学习目标: (1) 能力目标 ①能正确定义二维数组 ②掌握二维数组初始化的各种方法 ③能用二重循环访问二维数组元素 ( 下标访问法 ) 和二维数组名做函数参数进行二维数组访问方法。 (2) 知识目标 ①理解二维数组元素、下标和初始化 ②理解二重循环访问二维数组下标的变化规律 ③理解二维数组在内存中的存储特点(按行优先存储原则) 能力训练: 1. 能正确定义数值型二维数组、能正确进行二维数组的初始化。
E N D
单元8 项目中数组的应用----二维数组 • 学习目标: (1)能力目标 ①能正确定义二维数组 ②掌握二维数组初始化的各种方法 ③能用二重循环访问二维数组元素(下标访问法)和二维数组名做函数参数进行二维数组访问方法。 (2)知识目标 ①理解二维数组元素、下标和初始化 ②理解二重循环访问二维数组下标的变化规律 ③理解二维数组在内存中的存储特点(按行优先存储原则) • 能力训练: 1.能正确定义数值型二维数组、能正确进行二维数组的初始化。 2.能用二重循环进行下标访问法访问二维数组元素,能正确使用数组名进行数组在函数之间传递数据。
a[0] …… a00 a01 a02 a03 a[1] …… a10 a11 a12 a13 a[2] …… a20 a21 a22 a23 a[3][4] 单元8 项目中数组的应用---- 8.4 扩展知识与理论 • 8.4 扩展知识与理论 8.4.1 二维数组定义及其应用 二维数组是数组元素行和列两方面受限的数组。二维数组也用统一的数组名来标识,它有两个下标,第一个下标表示行,第二个下标表示列。 1.二维数组的定义 (1)定义 定义格式: 例:int a[3][4];a为3×4(3行4列)的数组。 float b[5][10]; b为5×10(5行10列)的数组。 二维数组a[3][4]可以理解为: 有三个一维数组元素a[0]、a[1]、a[2],而每个一维数组元素又是一个包含4个元素的一维数组。如下图所示 类型标识符 数组名[常量表达式1][常量表达式2];
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 二维数组的逻辑结构是二维的,但物理结构(存贮结构)却是一维的。二维数组元素在内存中的存放顺序: C语言规定二维数组“按行优先”的方法存放,即先顺序存放第一行的元素,再存放第二行的元素,……。(第二维下标变化较快,第一维下标变化较慢),如下图所示。 (2)说明 ①二维数组中的每个数组元素都有两个下标,且必须分别放在单独的“[ ]”内。a[3,4]是错误的。
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 ②二维数组定义中的第1个下标表示该数组具有的行数,第2个下标表示该数组具有的列数,两个下标之积是该数组具有的数组元素个数。 ③行下标的取值范围为0~常量表达式1-1,列下标的取值范围为0~常量表达式2-1。 ④二维数组中的每个数组元素的数据类型均相同。二维数组在内存中的存放规律是“按行优先”。 ⑤二维数组可以看作是数组元素为一维数组的数组。 2.二维数组的初始化 二维数组初始化有多种方法。 ①分行赋值:如: int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; ②全部数据写在一个大括号内,如: int a[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12}; ③部分元素赋值,如: int a[3][4] = {{1},{5},{9}}; 仅对a[0][0]、a[1][0]、a[2][0]赋值,其余元素均初始化0。
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 ④如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。例: int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面定义等价:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 3.二维数组元素的引用 二维数组元素的下标法引用与一维数组元素的引用相似,只是二维数组元素要同时指明行下标与列下标。 (1)下标法引用二维数组 引用格式: 例float a[3][3]; 9个二维数组元素是 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] “行下标表达式”、“列下标表达式”可以是任何非负整型数据。 数组名[行下标表达式][列下标表达式]
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 (2)说明 ①二维数组元素与相同类型的变量属性相同,它也叫下标变量。 ②用下标法访问二维数组,一般采用二重循环的方法来处理。 【例8.12】设计一个二维数组float a[3][3],并初始化,然后按矩阵方式输出。 解题思路: 依题意,输出3行3列矩阵,行列都要变化,用二重循环来实现。第一个二维数组元素是a[0][0],最后一个二维数组元素是a[2][2],任意一个二维数组元素可表示为a[i][j],其中下标i的取值范围为0≤i≤2,下标j的取值范围为0≤j≤2。为了得到矩阵结果,在一行输出结果后,应输出一个回车换行。 N-S流程如下图所示。
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 程序代码: 1 #include <stdio.h> 2 void main() 3 { 4 float a[3][3]={{1.1f,1.2f,1.3f},{2.1f,2.2f,2.3f},{3.1f,3.2f,3.3f}}; 5 int i,j; 6 for(i=0;i<3;i++) 7 { 8 for(j=0;j<3;j++) 9 printf("%6.1f",a[i][j]); 10 printf("\n"); 11 } 12 } 程序运行结果: 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3
1 2 3 4 5 6 1 4 2 5 3 6 b= a= 单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 4.二维数组应用举例 【例8.13】将一个二维数组行和列交换(转置),存到另一个二维数组中。如下图所示。 解题思路:只要将两数组的行列下标交换赋值即可,b[j][i] = a[i][j]。 程序代码: 1 #include <stdio.h> 2 void main() 3 { 4 int a[2][3] = {{1,2,3},{4,5,6}}; 5 int b[3][2], i,j; 6 printf("array a:\n"); 7 for(i=0;i<2;i++) // 0~1行 8 { 9 for(j=0;j<3;j++) // 0~2列 10 { 11 printf("%5d",a[i][j]);
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 12 b[j][i] = a[i][j]; // 行、列交换 13 } 14 printf("\n");//输出一行后换行 15 } 16 printf("array b:\n"); 17 for(i=0;i<3;i++) 18 { 19 for(j=0;j<2;j++) 20 printf("%5d",b[i][j]); 21 printf("\n"); //输出一行后换行 22 } 23 } 程序运行结果: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 【例8.14】有一个3×4的矩阵,要求编程序以求出其中值最大的那个元素的值及其所在的行号和列号。 解题思路: 首先假定第一个元素a[0][0]作为临时最大值max,然后把临时最大值max与后续每一个元素a[i][j]进行比较,若a[i][j]>max,把a[i][j]作为新的临时最大值,并记录其下标i和j。当全部元素比较完后,max便是整个矩阵全部元素中的最大值。 N-S流程如下图所示 程序代码: 1 #include <stdio.h> 2 void main()
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 3 { 4 int i,j,row=0,colum=0,max; 5 int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; 6 max = a[0][0]; 7 for(i=0;i<=2;i++) /* 用两重循环遍历全部元素 */ 8 for(j=0;j<=3;j++) 9 if(a[i][j]>max ) 10 { 11 max=a[i][j]; 12 row=i; 13 colum=j; 14 } 15 printf("max=%d, row=%d, colum=%d\n",max,row,colum); 16 } 程序运行结果: max=10,row=2,colum=1
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 二维数组的数组名也可以作为函数参数进行传递,它传递的是二维数组的首地址。 【例8.15】将例6.8中的查找最大值和行列号操作放在函数中,主函数调用该函数,并输出最大值、行、列号。 解题思路: 由于return语句只能返回一个值,因此,设计两个全局变量来得到行、列号,用return返回最大值。 程序代码: 1 #include <stdio.h> 2 int row=0,colum=0;//全局变量 3 int count(int array[][4],int n,int m); 4 void main() 5 { 6 int max; 7 int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; 8 max=count(a,3,4); 9 printf("max=%d, row=%d, colum=%d\n",max,row,colum); 10 }
单元8 项目中数组的应用---- 8.4.1 二维数组定义及其应用 11 12 int count(int array[][4],int n,int m)//行号可省,列号不能省 13 { 14 int i,j; 15 int max; 16 max = array[0][0]; 17 for(i=0;i<n;i++) /* 用两重循环遍历全部元素 */ 18 for(j=0;j<m;j++) 19 if(array[i][j]>max ) 20 { 21 max=array[i][j]; 22 row=i; 23 colum=j; 24 } 25 return max; 26 } 程序运行结果: max=10,row=2,colum=1
单元8 项目中数组的应用---- 课后作业与思考 1.填空题: (1)二维数组名为d[m][n],其中m叫,n叫。最大行下标为,最大列下标为。 (2)在C语言中,二维数组元素在内存中的存放顺序是。 (3)二维数组定义时,可以省略行下标,但必须指定。 (4)已知数组d定义为double d[4][11],则d是一个行列的二维数组,总共有个元素,最大行下标是,最大列下标是。 (5)已知数组d定义为int d[ ][3]={{1,2,3},{5,6},{7}};二维数组有行,按行列出各元素的值是。 2.判断题: (1)下面关于数据的叙述,正确的是。 A)数组元素的数据类型都相同 B)数组不经过定义也可以使用 C)同一数组,允许有不同数据类型的数组元素 D)数组名等同于数组的第一个元素 3.编程题: (1)设计一程序,它输入一个4行4列的行列式,显示这个二维数组组成的矩阵。 (2)编写一处程序判定用户输入的正整数是否“回文数”,回文数的特点是正读反读都一样的数。