内容正文:
5.2节:二维数组的定义和使用
编程语言基础——C语言
同步精品课堂
高教版(第5版)
掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。
教学目标
一
03
能够正确引用二维数组元素,并实现其访问与赋值操作
熟悉二维数组的多种初始化方法,并能结合应用实例编程实现简单矩阵转换(如行列互换)
04
理解二维数组在内存中按行顺序存储的元素排列方式
02
掌握二维数组定义的一般形式及语法规则
01
教学重难点
二
03
二维数组多种初始化方法(分行初始化与按顺序初始化)
理解二维数组在内存中的线性存储形式及其对编程逻辑的影响,并能运用双重循环实现矩阵行列互换等简单算法
04
二维数组元素的正确引用格式(双下标访问)
02
二维数组定义的一般形式与内存中的元素排列方式
01
导入新课
三
《数字迷宫挑战赛——二维数组探秘》
【数字迷宫】 【挑战任务】
[7][4][2][3]
[1][8][5][9]
[6][0][4][2]
[3][5][1][7] 坐标寻宝:请找出第2行第3列的数字密码是多少?
路径规划:如果我们想记录从起点(1,1)到终点(4,4)的最短路径经过的所有数字,该如何存储这些坐标和数值?
镜像迷宫:如果我要创建一个与原迷宫完全对称的新迷宫(行列互换),该如何高效完成?
“在C语言中,二维数组就是处理这类表格数据的完美工具!它就像这个数字迷宫的‘地图存储器’,可以用maze[行][列]的精确定位任何位置。今天,我们就来学习如何定义、使用这个强大的工具,并一起完成迷宫镜像挑战!”
新知讲授
四
我们之前学习的一维数组,能很好地表示一排数据。但当数据像成绩单、棋盘或像素图片那样,以行和列的形式呈现时,一维数组就显得不够直观了。
这时,我们需要二维数组。它就像一个表格,通过a[i][j]这样的方式,用行下标和列下标来精确定位每一个数据。掌握二维数组,意味着我们获得了处理更复杂、更结构化数据的能力。
今天,就让我们一起来学习如何定义和使用二维数组。
概述
新知讲授
四
知识点1:二维数组的定义
1、定义二维数组的一般形式
(1)一般形式:
(2)举例:
类型说明符 数组名[常量表达式1][常量表达式2]
int a[10][5];
int型二维数组
数组名为a
数组第二维有5个元素
数组第一维有10个元素
定义a为10×5(10行5列)的数组。
新知讲授
四
知识点1:二维数组的定义
1、定义二维数组的一般形式
(1)一般形式:
(2)举例:
类型说明符 数组名[常量表达式1][常量表达式2]
float scores[5][3]
float型二维数组
数组名为scores
数组第二维有3个元素
数组第一维有5个元素
定义scores为5×3(5行3列)的数组。
新知讲授
四
知识点1:二维数组的定义
1、定义二维数组的一般形式
(3)注意:
类型说明符 数组名[常量表达式1][常量表达式2]
float a[3][4], b[5][10];
//定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组
float a[3, 4], b[5, 10]; //在一对方括号内不能写两个下标
新知讲授
四
知识点1:二维数组的定义
1、定义二维数组的一般形式
(4)可以使用宏定义作为常量表达式
例如: #define M 3
#define N 5
int c[M][N];
定义了二维数组c,它是一个具有M行N列的二维数组,共有M×N个元素。
相当于定义:int c[3][5];,这样做的好处是当需要改变行数和列数时只要改变M或N所代表的值即可。
【注意】可以使用宏定义作为常量表达式并不代表可以对数组进行动态定义,宏定义又称为“符号常量”所以,无论是一维数组的定义,还是二维数组的定义,均不允许对数组进行动态定义。
新知讲授
四
知识点1:二维数组的定义
2、二维数组的元素排列
C语言对二维数组采用这样的定义方式,使得二维数组可被看作是一种特殊的一维数组:它的元素又是一个一维数组。例如:int a[3][4];,可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组
a[0] ……
a[1] ……
a[2] ……
【注意】数组下标从0开始,因此行标和列标的范围均要减1。
在C语言中,二维数组中的元素排列是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
新知讲授
四
知识点2:二维数组的引用
引用二维数组元素
(1)二维数组元素的表现形式为:
例如:
数组名[下标][下标]
① a[2][3]
②a[2-1][2*2-1]
①a[2,3]
②a[2-1,2*2-1]
下标必须为整型表达式,不能为小数。
(2)数组元素可以出现在表达式中,也可以被赋值。
例如:b[1][2]=a[2][3]/2
(3)在使用数组元素时,下标值应在已定义的数组大小的范围内。
新知讲授
四
知识点2:二维数组的引用
引用二维数组元素
(4)因为二维数组有两个下标,所以在二维数组的应用中常常结合双重循环使用。
例如:
【行优先存储】
int a[3][4];
……
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf(“%d”,&a[i][j]);
……
【列优先存储】
int a[3][4];
……
for(i=0;i<4;i++)
for(j=0;j<3;j++)
scanf(“%d”,&a[j][i]);
……
新知讲授
四
知识点3:二维数组的初始化
1、二维数组初始化的方法
(1)分行全部赋值
例如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
赋值后二维数组各元素中的值为:
a[0] …… a[0][0] 1 a[0][1] 2 a[0][2] 3 a[0][3] 4
a[1] …… a[1][0] 5 a[1][1] 6 a[1][2] 7 a[1][3] 8
a[2] …… a[2][0] 9 a[2][1] 10 a[2][2] 11 a[2][3] 12
新知讲授
四
知识点3:二维数组的初始化
1、二维数组初始化的方法
(2)分行部分赋值
①例如:int a[3][4]={{1,2},{5},{9,10,11}};
②例如:int a[3][4]={{1,2},{9,10,11}};
1 2
5
9 10 11
1 2
9 10 11
③例如:int a[3][4]={{1,2},{},{9,10,11}};
1 2
9 10 11
新知讲授
四
知识点3:二维数组的初始化
1、二维数组初始化的方法
(3)按一维数组的形式赋值
例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
缺点:虽然书写方便,但缺乏直观性,尤其是在数组元素较多的时候容易遗漏。
(4)如果为全部元素赋值(无论是一维形式还是分行形式),则定义数组时可以省略第1维的长度,但第2维长度不能省略。
例如:int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
例如:int a[ ][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
例如:int a[ ][4]={{1,2},{},{9,10,11}};
系统将根据数据的总数分配内存,即可确定该数组为3行4列。
新知讲授
四
知识点3:二维数组的初始化
2、二维数组初始化的应用
例5-3:输入一个3×4的矩阵,找出矩阵中负数的个数并输出。
#include<stdio.h>
main( ){
int a[3][4];
int i,j,count=0;
printf("输入一个3×4矩阵:
");
for(i=0;i<3;i++) //变量i控制二维数组的行
for(j=0;j<4;j++) //变量j控制二维数组的列
{ scanf(“%d”,&a[i][j]);//从键盘得到的值存入a[i][j]元素内
if(a[i][j]<0) //判断a[i][j]中存入的数值是否小于0(若小于0即为负数)
count++; } //若小于0,则count计算加1
printf("负数的个数=%d",count); }
新知讲授
四
知识点4:二维数组应用程序举例
1、将一个二维数组a的行和列的元素互换,存到另一个二维数组b中。
a数组 a[0][0] 1 a[0][1] 2 a[0][2] 3
a[1][0] 4 a[1][1] 5 a[1][2] 6
b数组 a[0][0] 1 a[0][1] 4
a[1][0] 2 a[1][1] 5
a[2][0] 3 a[2][1] 6
新知讲授
四
知识点4:二维数组应用程序举例
1、将一个二维数组a的行和列的元素互换,存到另一个二维数组b中。
#include <stdio.h>
int main()
{int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:
");
for(i=0;i<=1;i++) //处理a数组中的一行中各元素
{ for (j=0;j<=2;j++) //处理a数组中某一列中各元素
{ printf("%5d",a[i][j]); //输出a数组的一个元素
b[j][i]=a[i][j]; } //将a数组元素的值赋给b数组相应元素
printf("
"); }
printf("array b:
"); //输出b数组各元素
for(i=0;i<=2;i++) //处理b数组中一行中各元素
{ for(j=0;j<=1;j++) //处理b数组中一列中各元素
printf("%5d",b[i][j]); //输出b数组的一个元素
printf("
"); } }
师生互动
五
《二维数组“排兵布阵”挑战赛》
布阵:请用按行初始化的方法,将这个“军队”初始化为以下阵容:
第一行(前锋):士兵编号 101, 102, 103
第二行(中军):士兵编号 201, 202, 203
第三行(后卫):士兵编号 301, 302, 303 【代码】:
点将:战事激烈,现需抽调中军(第2行)的左翼(第1列)士兵上前线。请问这个士兵的编号是多少?在代码中如何表示他? 【代码】
变阵(进阶任务):敌方从侧翼来袭,指挥官下令,全军需立即变换为“以列为单位”的新队形,即将原行变成列,原列变成行。请问如何用代码实现,将这个army方阵的行列互换,存入一个新的数组 int newArmy[3][3]中? 【代码】
随堂练习
六
1.下列关于二维数组定义正确的是( )
A. int a[2,3];
B. int a(2)(3);
C. int a[2][3];
D. int a{2}{3};
答案:C
解析:C语言定义二维数组必须用方括号[行数][列数]。
随堂练习
六
2.对二维数组int a[3][4];的正确描述是( )
A. 这是一个3行4列的数组,共有7个元素
B. 数组元素a[3][4]是合法的
C. 数组元素a[0][0]的地址最小
D. 数组在内存中按列优先存储
答案:C
解析:C语言数组下标从0开始,a[0][0]是第一个元素,地址最小。
随堂练习
六
3.对于int a[2][3] = {1,2,3,4,5,6};,a[1][2]的值是( )
A. 3
B. 6
C. 0
D. 编译错误
答案:B
解析:按行初始化,a[1][2]对应第2行第3列,即第6个元素。
随堂练习
六
4.以下能正确定义并初始化二维数组的是( )
A. int a[2][ ] = {{1,2},{3,4}};
B. int a[ ][3] = {{1,2,3},{4,5}};
C. int a[2][3] = {{1,2},{3,4},{5,6}};
D. int a[ ][ ] = {{1,2,3},{4,5,6}};
答案:B
解析:定义时可以省略第一维大小,但第二维必须指定。
随堂练习
六
5.定义int a[3][4];后,数组a最多可用的元素是( )
A. 7个
B. 12个
C. 3个
D. 4个
答案:B
解析:3行×4列=12个元素。
随堂练习
六
6.对于数组int a[2][2] = {{1}};,a[1][1]的值是( )
A. 1
B. 0
C. 随机值
D. 语法错误
答案:B
解析:只初始化了a[0][0]=1,其余元素自动补0。
随堂练习
六
7.数组int b[2][3] = {1,2,3,4,5};中,b[1][1]的值是( )
A. 2
B. 4
C. 5
D. 0
答案:C
解析:按顺序初始化,b[1][1]对应第5个元素5。
随堂练习
六
8.要引用二维数组a中第i行第j列的元素,应使用( )
A. a(i,j)
B. a[i,j]
C. a[i][j]
D. a.i.j
答案:C
解析:C语言用a[i][j]引用二维数组元素。
随堂练习
六
9.对于int a[2][3];,不正确的元素引用是( )
A. a[0][1]
B. a[1][2]
C. a[2][3]
D. a[1][0]
答案:C
解析:下标从0开始,最大有效下标是a[1][2]。
课堂小结
七
谢谢
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
$