内容正文:
6.2节:二维数组的定义与引用
C语言程序设计
电子工业出版社
理解二维数组的定义、引用和初始化方法,掌握其基本存储结构
能够编写程序对二维数组进行定义、赋值、访问和简单操作,解决实际问题
培养逻辑思维能力和问题解决能力,提升代码规范意识与团队协作素养
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:生活中的“表格”
思考:数据的存储与处理
生活中的二维数据结构示例
我们如何用程序来存储和处理像这样的表格数据呢?
例如:教室的座位安排、学生的各科成绩统计等。
教学导入:一维数组的局限性
图:包含多维度信息的学生成绩表
核心思考:一维数组的“短板”
我们之前学过的一维数组,逻辑上就像是一条“线”,只能线性地存储一列或一行数据。
但面对如左图所示的二维表格数据(既有行又有列),一维数组就显得“无能为力”,无法清晰表达数据间的行列关系。
由此可见:一维数组仅适用于处理线性、单一维度的数据。为了高效处理类似表格的二维结构数据,我们需要引入新的数据结构——二维数组。
教学导入:认识二维数组
为了处理这种二维结构的数据,我们需要引入一个新的工具——二维数组。它就像一个表格或矩阵,可以方便地存储和访问行和列的数据。
二维数组
计算机存储结构
表格
行与列的组织形式
矩阵
数学中的二维结构
核心思想:将现实中的二维数据映射到计算机的存储模型中
知识讲授
二维数组的定义与引用
二维数组元素的定义与引用
二维数组的初始化和程序举例
第一部分
二维数组元素的定义与引用
知识讲授
知识讲授:二维数组的定义
定义格式:
类型标识符 数组名[常量表达式1][常量表达式2];
二维数组逻辑结构示意(行 × 列)
常量表达式 1 (行数)
位于第一个方括号内,用于设置二维数组的行数,决定了数组第一维的大小。
常量表达式 2 (列数)
位于第二个方括号内,用于设置二维数组的列数,决定了数组第二维的大小。
知识讲授:二维数组定义示例
代码示例
int a[2][3];
定义一个名为 a 的二维整型数组
数据类型与命名
定义了一个整型 (int)数组,变量名为a。
维度与结构
该数组包含2 行 3 列。可以将其想象为一个小型的表格结构。
元素总数计算
总共有2 × 3 = 6个元素。每个元素都是一个独立的整型变量。
💡 记忆口诀:第一个数字代表行数,第二个数字代表列数,行数乘列数等于总元素数。
知识讲授:二维数组的结构示意图
二维数组本质上是“数组的数组”,通过行标 (Row)和列标 (Column)可精确定位任意元素。
知识讲授:二维数组元素的引用
引用格式
数组名[行下标][列下标](例如:a[i][j])
核心说明
下标规则:下标可以是整型常量或表达式,取值需在数组定义的范围内。
使用方式:数组元素可出现在表达式中参与运算,也可以被赋值。
知识讲授:二维数组元素的引用
元素引用语法
a[0][0]
// 表示数组a中第0行第0列的元素
赋值操作示例
a[1][2] = 10;
// 将数值10赋值给第1行第2列
核心注意事项
1. 数组下标从0开始计数,而非从 1 开始。
2. 引用时下标取值绝对不能超过数组定义的范围,否则会导致数组越界错误。
知识讲授:二维数组引用示例程序
程序文本【6.5】通过键盘输入数据,给2行3列的二维数组赋初值
#include "stdio.h"
main()
{
int i, j, a[2][3];
for(i=0; i<2; i++)
for(j=0; j<3; j++)
scanf("%d", &a[i][j]);
for(i=0; i<2; i++)
for(j=0; j<3; j++)
printf("
a[%d][%d]=%d",i,j,a[i][j]);
}
关键技术点
使用嵌套 for 循环遍历数组;外层循环控制行下标,内层循环控制列下标,实现对二维数组元素的逐个访问。
知识讲授:二维数组引用示例程序
背诵记忆
二维数组定义
格式:类型标识符 数组名[行数][列数];
二维数组引用
格式:数组名[行下标][列下标];
关键要点
• 下标从 0 开始 • 行数和列数必须是常量表达式 • 引用时下标不能越界
课堂问答
问题 Q2
如何引用二维数组 a 中第 2 行第 3 列的元素?
答案 A2
正确的引用方式是:a[1][2]
💡 知识点提示:在大多数编程语言中,数组的下标通常是从 0 开始计数的。
课堂问答
QUESTION 01
定义int a[3][4];表示数组 a 有多少行多少列,共多少个元素?
ANSWER 01
数组 a 是一个二维数组,包含3 行 4 列,总共有12个元素。
知识点回顾:二维数组的行和列索引通常从 0 开始,但定义时的数字代表维度大小。
例题分析
程序回顾与输入
#include "stdio.h"
main()
{ int a[2][3] = {{1,2,3}, {4,5,6}};
int i, j, row_sum;
for(i=0; i<2; i++)
{ row_sum = 0;
for(j=0; j<3; j++)
row_sum += a[i][j];
printf("第%d行的元素和为:%d
", i+1, row_sum);
} }
输出结果展示
第1行的元素和为:6
第2行的元素和为:15
核心逻辑分析:
1. 定义与初始化:定义并初始化一个2行3列的二维数组。
2. 外层循环控制行:使用 for(i=0; i<2; i++) 遍历每一行。
3. 行和变量初始化:在每行开始时将 row_sum 重置为0。
4. 内层循环控制列:使用 for(j=0; j<3; j++) 遍历每一列。
5. 元素累加:将当前元素 a[i][j] 累加到 row_sum 中。
6. 输出结果:内层循环结束后,输出当前行的元素和。
例题分析
课堂练习
练习:二维数组求和
编写程序,计算一个 3x3 二维数组所有元素的和。
请先定义并初始化一个数组,然后通过循环遍历并累加所有元素的值。
代码编写要求
请编写完整的 C 语言代码,包含:
数组的定义与初始化
双重循环结构 (嵌套 for 循环)
最终结果的输出打印
💡提示:注意数组下标从 0 开始。外层循环控制行,内层循环控制列。可以使用一个变量 sum 来存储累加的结果。
课堂练习
程序文本
#include "stdio.h"
main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int i,j,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
sum += a[i][j];
printf("数组所有元素的和为:%d
", sum);
}
课堂练习
第二部分
知识讲授
二维数组的初始化和程序举例
知识讲授
知识讲授:二维数组的初始化
方式一:分行初始化
格式:类型标识符 数组名[行][列] = {{值1,值2,...}, {值1,值2,...}, ...};
示例:int a[2][3] = {{1,2,3}, {4,5,6}};
说明:每一对内层大括号对应数组的一行。这种方式将数据按行分组,逻辑清晰,直观易读,非常适合初始化结构规整的数据。
知识讲授:二维数组的初始化
方式二:按顺序初始化
格式:
类型标识符 数组名[行][列] = {值1,值2,值3,...};
无需分行,所有数据置于一个大括号内
示例:
int a[2][3] = {1, 2, 3, 4, 5, 6};
系统自动按行优先顺序为数组元素赋值
将所有数据按行的顺序写在一个大括号内,编译系统会按照数组元素在内存中的排列顺序,依次为每个元素赋值。
核心要点:顺序初始化不强调行结构,数据按一维线性顺序填充二维数组空间。
知识讲授:二维数组的初始化
方式三:部分元素初始化
int a[2][3] = {{1}, {4}};
只对部分元素赋初值,其余未赋值的元素自动为0。
例如上述代码中,仅对第一行第一个元素和第二行第一个元素赋值,其余元素默认补0。
内存赋值示意图:
1
0
0
4
0
0
方式四:省略行长度
int a[][3] = {1,2,3,4,5,6};
如果对全部元素赋初值,定义时第一维的长度(行数)可以省略,但第二维的长度(列数)必须指定。系统会根据总元素个数和列数自动计算出行数。
知识讲授:二维数组程序举例(一)
程序文本【6.6】:有一个 3×4 的矩阵,求出所有元素中的最大值及它所在的行和列。
逻辑分析步骤
初始化:将数组首个元素 a[0][0] 赋值给 max,作为初始最大值。
遍历:通过嵌套循环遍历数组中的每一个元素进行比较。
更新:若当前元素更大,则更新 max,并记录行号 i 和列号 j。
结果:循环结束后,max 存储最大值,r 和 c 存储其位置。
核心思路总结
采用“打擂台”法,假设第一个元素为擂主,后续元素逐一挑战,胜者成为新擂主并记录位置。
知识讲授:二维数组程序举例(一)
程序文本【6.6】有一个3×4的矩阵,求出所有元素中的最大值及它所在的行和列
#include<stdio.h>
main()
{
int i,j,r=0,c=0,max;
int a[3][4]={{1,3,7,9},{2,4,6,8},{-1,10,-5,-9}};
max = a[0][0];
for(i=0; i<3; i++)
for(j=0; j<4; j++)
if(a[i][j] > max)
{ max = a[i][j];
r = i; c = j; }
printf("max=%d,r=%d,c=%d
",max,r,c); }
知识讲授:二维数组程序举例(一)
知识讲授:二维数组程序举例(二)
程序功能:将一个二维数组中行和列的元素互换(矩阵转置),并存到另一个二维数组中。
图 1:矩阵转置数学原理示意
核心逻辑
数组定义:定义原数组a和目标数组b,行列数互换。
核心赋值:遍历数组,执行b[j][i] = a[i][j]实现行列元素映射。
结果输出:分别打印原数组与转置后数组进行对比。
关键点:转置的本质是“行列下标互换”。程序通过双层循环遍历,将原数组的行索引与列索引交换后赋值给新数组,从而完成矩阵的转置操作。
知识讲授:二维数组程序举例(二)
程序文本【6.7】将一个二维数组中行和列的元素互换,并存到另一个二维数组
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++){
for(j=0;j<=2;j++){
printf("%4d",a[i][j]);
b[j][i] = a[i][j]; }// 核心:行列下标互换赋值
printf("
"); }
printf("array b:
");
for(i=0;i<=2;i++)
{ for(j=0;j<=1;j++)
printf("%4d",b[i][j]);
printf("
"); } }
知识讲授:二维数组程序举例(二)
背诵记忆
二维数组初始化的四种方式
1. 分行初始化:int a[2][3] = {{1,2,3}, {4,5,6}};
2. 按顺序初始化:int a[2][3] = {1,2,3,4,5,6};
3. 部分元素初始化:int a[2][3] = {{1}, {4}};
4. 省略行长度:int a[][3] = {1,2,3,4,5,6};
程序举例核心逻辑
求最大值
遍历数组所有元素进行比较,同时记录当前最大值及其所在的行列位置。
矩阵转置
核心公式:b[j][i] = a[i][j],将原数组的行和列进行互换。
记忆要点:掌握四种初始化语法是基础,理解遍历逻辑是解决数组问题的关键。
课堂问答
Q: 如何对一个 3x3 的二维数组进行全部元素的初始化?
A: 推荐两种方式:
方式一(按顺序初始化):
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
方式二(按行初始化,可读性更好):
int a[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
课堂问答
Q2
矩阵转置的核心操作是什么?
A2
将原数组的元素a[i][j]赋值给目标数组的b[j][i]。
💡 核心逻辑:通过双重循环遍历,实现行列索引的互换 (Row ↔ Column)
课堂练习
练习:二维数组极值查找
请初始化一个 4x4 的二维数组,并编写程序逻辑,遍历数组找出其中的最小值。
核心要求
请编写完整的 C 语言代码,包含头文件、主函数及必要的注释。
提示:回顾上节课求最大值的算法逻辑,使用双重循环嵌套遍历二维数组,注意数组下标越界问题。
课堂练习
程序文本
#include"stdio.h"
main()
{
int a[4][4]={ {1,2,3,4},{5,6,7,8},
{9,10,11,12},{13,14,15,16}};
int i,j,min=a[0][0];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j] < min)
min = a[i][j];
printf("最小值为:%d
", min);
}
课堂练习
课堂小结
课堂小结
定义
类型 数组名[行][列];
详细说明: 定义一个二维数组,指定其数据类型、名称、行数和列数。这是创建二维数组的第一步,决定了数组的存储结构和大小。
引用
数组名[行下标][列下标];
详细说明: 通过行下标和列下标访问数组中的特定元素。下标从0开始,用于精确读取或修改数组中的数据。
初始化
分行、顺序、部分、省略行长度
详细说明: 在定义数组时为其赋初值的四种方式。合理的初始化可以提高程序效率,确保数据的正确性。
应用
求极值、矩阵转置、成绩统计等
详细说明: 利用二维数组解决实际问题,如处理表格数据、进行矩阵运算、实现游戏地图等,是二维数组的核心价值所在。
课后任务
对角线求和
编写程序,计算一个 4x4 二维数组对角线元素的和。请分别实现主对角线与副对角线的和计算,并注意数组索引的边界条件。
成绩管理系统
存储3个学生的语、数、英三门课程成绩。编程实现计算每个学生的个人平均分,并输出班级的总分平均值。
温馨提示
作业请于下次课前提交至在线判题系统。编码时请注意规范命名,特别要注意处理数组下标越界问题,确保程序的健壮性。
谢谢观看
THANKS
$