admin 管理员组文章数量: 887021
2024年2月18日发(作者:include头文件有哪些)
C语言知识点总结8【二维数组】
一、 二维数组的定义
一个3行,4列的二维数组。其行号:0,1,2;其列号:0,1,2,3
最大下标的元素为a[2][3],没有a[3][4]这个元素
数组共有3行,每一行都是:4个元素的一维数组,每一行的数组名分别为:a[0],a[1],a[2]
从整体看,任何一个二维数组都可以看成是一个一维数组,只不过其数组元素又是一个一维数组。
二维数组定义同时若有初始化,可以省略行号不写:如int a[][3]={1,2,3,4,5,6};系统会按照数据的个数,和规定的列数,来确定数据分几行?
二维数组定义同时若有初始化,可以省略行号不写,但列号不能省略:如int a[3][ ]={1,2,3,4,5};系统无法按照数据的个数,和规定的行数,来确定数据分几列。
二、 二维数组的存储及地址关系
二维数组在计算机中的存储是按行连续存储。先保存第一行,在第一行末尾开始存第二行,依此类推。
二维数组的地址关系:若有二维数组定义:int a[3][4];
纵向看,该二维数组,可以看成是有三个元素构成的一维数组
数组名
a
a是数组首地址
数组名
a[0]
a[0]是第1行的首地址
a[1]
a[1]是第2行的首地址
a[2]
a[2] 是第3行的首地址
a[0][0]
a[0] 等价于&a[0][0]
a[1] [0]
a[1] 等价于& a[1] [0]
a[2][0]
a[2] 等价于& a[2][0]
a[0][1]
a[0]+1等价于&a[0][1]
a[1] [1]
a[1] +1等价于& a[1] [1]
a[2][1]
a[2] +1等价于& a[2][1]
数组元素
a[0]
a等价于&a[0]
a[1]
a+1等价于&a[1]
a[2]
a+2等价于&a[2]
另外对于该二维数组的每一行,均可看成是一个一维数组
数组元素
a[0][2]
a[0]+2等价于&a[0][2]
a[1] [2]
a[1] +2等价于& a[1] [2]
a[2][2]
a[2] +2等价于& a[2][2]
a[0][3]
a[0]+3等价于&a[0][3]
a[1] [3]
a[1]+3等价于& a[1] [3]
a[2][3]
a[2] +3等价于& a[2][3]
这里,a是a[0]的地址,a[0]是数组元素a[0][0]的地址,则a是地址的地址,即二级地址
三、 二维数组的初始化
1、 分行赋值:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2、 不分行赋值:全部数据写在一个大括号内:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
3、 部分元素赋值
4、如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。
int a[3][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};
四、 二维数组的输出
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) printf("%d ",a[i][j]);
printf(“n”);
}
//外层控制数组的行
//内层控制数组的列,遍历该行所有列的元素,并输出
//完成一行所有列的输出后,输出一个换行
五、 二维数组的输入
for(i=0;i<3;i++)
for(j=0;j<4;j++) scanf("%d ",&a[i][j]);
//外层控制数组的行
//内层控制数组的列,遍历该行所有列的元素,并接收
//此处无须换行,因为这是数组的输入,只要将数据接收,并存入内存即可,换行是用于输出,控制屏幕的显示效果,给用户看的
六、 二维数组的应用
案例1:计算一个二维数组的主对角线元素之和
主对角线元素的特点:行号与列号相同。选择性求和。
反对角线元素的特点:?
#include
void main()
{
int a[4][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3},{4,4,4,4}};
int i,j;
int s=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j)s=s+a[i][j];
printf("%4dn",s);
}
案例2:一共有5名同学,参加了3门课程的考试。输入所有学生的各科的成绩,并打印输出。
#include
void main()
{int a[5][3];
int i,j;
for(i=0;i<5;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("C语言t高数t英语n");
for(i=0;i<5;i++)
{for(j=0;j<3;j++)
printf("%dt",a[i][j]);
printf("n" );
}
}
案例3:找出上述表格中每门课程的最高得分。
#include
void main() void main()
{ {
int a[5][3]; int a[5][3];
int i,j,m; int i,t;
for(i=0;i<5;i++) int max;
for(j=0;j<3;j++) for(t=0;t<5;t++)
scanf("%d",&a[i][j]); for(i=0;i<3;i++)
scanf("%d",&a[t][i]);
printf("C语言t高数t英语n");
for(i=0;i<5;i++) for(t=0;t<5;t++)
{for(j=0;j<3;j++) {
printf("%dt",a[i][j]); for(i=0;i<3;i++)
printf("n" );} printf("%6d",a[t][i]);
for(j=0;j<3;j++) putchar('n');
{m=a[0][j]; }
for(i=0;i<5;i++)
if(m switch(j) { {case 0:printf("C语言成绩最高分max=a[0][i]; for(t=1;t<5;t++) 为:%dn",m);break; case 1:printf("高数成绩最高分if(max 为:%dn",m);break; printf("第%d列的最大值为:%dn",i+1,max); case 2:printf("英语成绩最高分 } 为:%dn",m);break; } } } } 【案例4】设计一个3*5的二维数组,用来存储三名同学(每行为一名同学信息)三门课的成绩,并计算三门课的总分,放在第4列,平均分放在第5列。 语文 数学 英语 总分 #include void main() { int a[3][5]; int i,j; int s=0; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); //接收三行中的前3列,用于存放三门课的成绩 for(i=0;i<3;i++) //对每行完成下面计算 { s=0; //每一行,计算之前,先将s变量清0 for(j=0;j<3;j++) s+=a[i][j]; //用循环,计算每行三门课的和 a[i][3]=s; //将和存入第4列 a[i][4]=s/3; //将平均值存入第5列 } printf("语文t英语t数学t总分t平均分n"); for(i=0;i<3;i++) {for(j=0;j<5;j++) printf("%dt",a[i][j]); putchar('n'); } } 平均分 【案例5】找一个二维数组中,每行的最大值,并输出 第0行:m=a[0][0],m和a[0][1]到a[0][3]比较,遇到更大的,就给m,并记录下标 第1行:m=a[1][0],m和a[1][1]到a[1][3]比较,遇到更大的,就给m,并记录下标 第2行:m=a[2][0],m和a[2][1]到a[2][3]比较,遇到更大的,就给m,并记录下标 因此得规律:第i行,m=a[i][0] 案例分析:分别对每一行数据进行下面操作: 12 36 69 2 1 25 3 1 5 58 6 17 参考代码如下: #include void main() { int a[3][4]; int i,j; int m,hang,lie; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); for(i=0;i<3;i++) { m=a[i][0];hang=i;lie=0; //给m赋值 for(j=1;j<4;j++) if(m printf("第%d行的最大值为:%d,它所在的数组元素为:a[%d][%d]n",i,m,hang,lie); //比较结束后,输出该行的最大值及其下标 } }
版权声明:本文标题:C语言知识点总结8【二维数组】 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1708258609h517863.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论