
第8章数组
第 8 章 数 组

本章知识点8.1一维数组的定义、引用与初始化“数组名+一维下标”---表示数据8.2一维数组的应用8.3二维数组数组名+二维下标”--表示数据8.4数组与函数
本章知识点 8.1 一维数组的定义、引用与初始化 “数组名+一维下标”-表示数据 8.2 一维数组的应用 8.3 二维数组 “数组名+二维下标”-表示数据 8.4 数组与函数

8.3二维数组8.3.1 二维数组的定义8.3.2二维数组元素的引用8.3.3 二维数组的初始化8.3.4 二维数组程序举例3
8.3 二维数组 3 Ø 8.3.1 二维数组的定义 Ø 8.3.2 二维数组元素的引用 Ø 8.3.3 二维数组的初始化 Ø 8.3.4 二维数组程序举例

8.3二维数组及多维数组---P167学生成绩表赵四张三李四周正王五8064508576Mathc75877765637140788592Javaint sc[3][5]=[0][1][2][4][3]sc80,64,50,85,768064508576[0]75,65,63,87,77[1]756563877792714085[2]78(92,71,40,78,85))二维数组依赖于两个下标数组赵四的C课程成绩为87元素是sc[1[3]。才能唯一地确定每个元素。4
8.3 二维数组及多维数组-P167 4 张三 王五 李四 赵四 周正 Math 80 64 50 85 76 C 75 65 63 87 77 Java 92 71 40 78 85 学 生 成 绩 表 int sc[3][5]= {{80,64,50,85,76}, {75,65,63,87,77}, {92,71,40,78,85}} n 二维数组依赖于两个下标 才能唯一地确定每个元素。 sc [0] [1] [2] [3] [4] [0] 80 64 50 85 76 [1] 75 65 63 87 77 [2] 92 71 40 78 85 赵四的C课程成绩为87,数组 元素是sc[1][3]

8.3.1 二维数组的定义一P166行数列数定义方式:数据类型数组名[常量表达式1常量表达式2]:√二维数组理解:元素个数=行数*列数二维数组a是由例inta|31/4];3个元素组成a[0]a[0][0]|a[0][1]|a[0][2]|a[0][3]a[1]:a11/oa[1]1] a[1][2]a1113行名a[2] a[2][0] :a[2113a[2]1]a[2][2]例如元素ai是一维数组名,a[2]是一维数组的名字,它又有4个int类型的元素
二维数组a是由 3个元素组成 元素a[i]是一维数组名,例如 a[2]是一维数组的名字,它又 有4个 int 类型的元素 行数 列数 元素个数= 行数*列数

二维数组的存储:按行存放int a[3][3];》二维数组中元素存放顺序:先在内存中存放第2000a[0][0]按行存放。一行元素,再存放第二行元素2004a[0][1]>例l:int a[3][3];int型-4个字节2008a[0][2]数组a的首地址是a,则:2012a[1][0]◆a[i[jl的地址是:a+(i*3+j)*sizeof(int)2016a[1][1]2020a[1][2]a「i的首地址每行3个元素2024a[2][0]是:a+i*3*4aooaoldo22028a[2][1]2032a[2][2]若a的首地址是2000a1oajla122012a[1]的首地址?12020a[1][2]的首地址?2a20a21a226
二维数组的存储:按行存放 6 Ø 二维数组中元素存放顺序:先在内存中存放第 一行元素,再存放第二行元素.-按行存放。 Ø例1:int a[3][3]; 数组a的首地址是 a,则: ua[i][j]的地址是:a+(i*3+j)*sizeof(int) int a[3][3]; 2000 a[0][0] 2004 a[0][1] 2008 a[0][2] 2012 a[1][0] 2016 a[1][1] 2020 a[1][2] 2024 a[2][0] 2028 a[2][1] 2032 a[2][2] int型- 4个字节 ua[i]的首地址 每行3个元素 是:a+i*3*4 若a的首地址是2000 ① a[1]的首地址? ② a[1][2]的首地址? 2020 2012

int a[2][3][4];a[0][0][0]扩展:多维数组的存储a[0][0][1]a[0][0]a[0][0][2]a[0][0][3]用和二维数组相同的角度看待多维数组a[0][1][0]a[0][1][1]例: int a[2][3][4]:a[0]a[0][1]a[0][1][2]a[0][1][3]int型三维数组a,有2*3*4=24个元素a[0][2][0]a[o]、a[1]是二维数组a[0][2][1]a[0][2]a[0][2][2]a[o][o]、a[o][1]是一维数组a[0][2][3]a[1][0][0]多维数组元素在内存中的排列顺序仍是按行a[1][0][1]a[1][0]a[1][0][2]存放::第一维的下标变化最慢,最右边的下标家a[1][0][3]a[1][1][0]变化最快。a[1][1][]a[1]a[1][1]a[1][1][2]a[1][1][3]a[1][2][0]a[1][2][1]a[1][2]a[1][2][2]a[1][2][3]
扩展:多维数组的存储 7/115 Ø 用和二维数组相同的角度看待多维数组 Ø 例:int a[2][3][4]; uint 型三维数组a,有2*3*4=24个元素 ua[0]、a[1]是二维数组 ua[0][0]、a[0][1]是一维数组 u多维数组元素在内存中的排列顺序仍是按行 存放:第一维的下标变化最慢,最右边的下标 变化最快。 int a[2][3][4]; a[0] a[0][0] a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][1] a[0][1][0] a[0][1][1] a[0][1][2] a[0][1][3] a[0][2] a[0][2][0] a[0][2][1] a[0][2][2] a[0][2][3] a[1] a[1][0] a[1][0][0] a[1][0][1] a[1][0][2] a[1][0][3] a[1][1] a[1][1][0] a[1][1][1] a[1][1][2] a[1][1][3] a[1][2] a[1][2][0] a[1][2][1] a[1][2][2] a[1][2][3]

8.3.1二维数组的引用一变换下标数组名[行下标列下标例如:int a[2][3];可以引用元素:a[o][o]、a[o][1]、a[o][2]a[1][0]、a[1][1]、a[1][2]注意:下标必须是整型值。每个二维数组元素是一个变量,能参加它的类型规定的所有操作。例1:a[0][0]=100;scanf(%d",&aLllLlD)不能“越界引用数组”例2:a[2][3]=10;//错,最多可以用到a[1][2]8
8 例如:int a[2][3]; ① 可以引用元素:a[0][0]、a[0][1]、a[0][2]、 a[1][0]、a[1][1]、a[1][2] 注意:下标必须是整型值。 ② 每个二维数组元素是一个变量,能参加它的类型规定的所 有操作。 例1:a[0][0]=100; scanf( %d ,&a[1][1]); ③ 不能“越界引用数组” 例2:a[2][3]=10; //错,最多可以用到a[1][2]

【例8.14】成绩统计:有三门考试课,每门课有5人参加考试,成绩如下表。求各门课的平均成绩和每人的平均成绩。要求:用定义二维数组存放3个课程5个学生成绩并显示张三王五李四赵四周正课程平均?8064508576Math?c7565638777?9271407885Java?????每人平均???9
9 【例8.14】成绩统计: 有三门考试课,每门课有5人参加考 试,成绩如下表。求各门课的平均成绩和每人的平均成绩。 要求:用定义二维数组存放3个课程5个学生成绩并显示。 张三 王五 李四 赵四 周正 Math 80 64 50 85 76 C 75 65 63 87 77 Java 92 71 40 78 85 张三 王五 李四 赵四 周正 课程平均 Math 80 64 50 85 76 ? C 75 65 63 87 77 ? Java 92 71 40 78 85 ? 每人平均 ? ? ? ? ? ???

【例8.14】成绩统计:使用一个二维数组存放每门课程成绩求:各门课的平均成绩和每人的平均成绩,1for(j=0;j2a[3]j]=a[3]]/3;1/每人平均成绩③int main()for(i=0;i<4;i++)//输出④13doublea[4][6]={0];//全部元素?for(j=0;j<6;j++)int i,j;?printf("%if",a[]]);?printf("\n");?for(i=o;i<3;i++)I/一行是一门i??9return ;?for(j=0;j<5;j++)//输入+计算10子?(scanf("%if",&a[iji]);?a[[5]=a[[5]+a[]];/每门课成绩和a[3]i]=a[3]i]+a[ijj];//每人成绩和①1?a[[5]/=5;/求每门课平均成绩10
① #include ② int main() ③ { double a[4][6]={0}; ④ int i,j; ⑤ for (i=0;i<3;i++) //一行是一门课 ⑥ { ⑦ for(j=0;j<5;j++) //输入+计算 ⑧ { scanf("%lf" ,&a[i][j]); ⑨ a[i][5]=a[i][5]+a[i][j]; //每门课成绩和 ⑩ a[3][j]=a[3][j]+a[i][j]; //每人成绩和 ⑪ } ⑫ a[i][5]/=5;//求每门课平均成绩 ⑬ } 10 【例8.14】成绩统计:使用一个二维数组存放每门课程成绩, 求:各门课的平均成绩 和 每人的平均成绩。 ① for (j=0;j<5;j++) ② a[3][j]=a[3][j]/3; //每人平均成绩 ③ for (i=0;i<4;i++)//输出 ④ { ⑤ for(j=0;j<6;j++) ⑥ printf("%lf " ,a[i][j]); ⑦ printf("\n"); ⑧ } ⑨ return 0; ⑩ }