二维数组
创建
类型 数组[数组长度1][数组长度2]
int a[8][9];
初始化
二维数组 通过 两个下标定位一个数据的位置
一般来讲 方便理解
将第一个 下标 当成 行 第二个下标 当成 列
int a[2][2] ={1,2,3,4}; //先分行,再分列 则 a[0][1]=4
int a[][2]={1,2,3,4}; //自动识别第一个长度为 2
// 按照已有条件 推导——①必有4列 ②按照数据数量推导 可以省略行数但是不可以省略列数
int a[3][4]={{3,7,8},{3,4},{0,0,3}};
//按照每个大括号分行,不足补0
int a[3][4]={1}; //即表示,只有a[0][0]=1 其他数据都是0
输入——打印
循环嵌套
二维数组的操作
表格求和
//求行和
int Num[2][3]={{1,5,3},{8,6,5}}; //求和目标
int sumRow[2]={0}; //创建一个 行数相同的 数组,存储
for(int i = 0; i<2;i++)
{
for(int j = 0;j<3;j++)
{
sumRow[i] += Num[i][j];
}
}
//求列和
int Num[2][3]={{1,5,3},{8,6,5}};
int sumLine[3]={0};
for(int j = 0; j<2; j++) //先遍历列 再遍历行
{
for(int i = 0;i<3; i++)
{
sumLine[j] += Num[i][j];
}
}
//在每一行后面带求和数据
//形成新的表格
for(int i = 0; i<2;i++)
{
for(int j = 0;j<3;j++)
{
printf("%d\t",Num[i][j]); //打印出原始表格后在后面 打印行和
}
printf("%d\t",sumRow[i]);
printf("\n");
}
for(int i = 0; i < 3; i++)
{
printf("%d\t",sumLine[i]); //打印列和
}
描述地图 用特定数字表示 (推箱子)
#define empty 0; //空地
#define man 5; //玩家
#define wall 1; //墙体
#define target 3; //目的地
#define box 4; //箱子
#define boxtarget 7; //箱子到了目的地
#define mantarget 8; //人到了目的地
int map[3][8][8] = //地图模板
{
{
{1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1},
{1,0,4,0,5,0,0,1},
{1,4,4,1,1,4,0,1},
{1,0,4,3,1,0,0,1},
{1,3,3,3,0,3,1,1},
{1,1,1,1,1,1,1,0},
},
{
{0,0,1,1,1,0,0,0},
{0,0,1,3,1,0,0,0},
{0,0,1,0,1,1,1,1},
{1,1,1,4,5,4,3,1},
{1,3,0,4,0,1,1,1},
{1,1,1,1,4,1,0,0},
{0,0,0,1,3,1,0,0},
{0,0,0,1,1,1,0,0}
},
{
{1,1,1,1,1,1,1,1},
{1,0,3,0,4,0,1,1},
{1,1,0,4,3,4,0,1},
{1,3,3,3,1,0,3,1},
{1,0,1,4,0,4,0,1},
{1,0,4,0,1,3,4,1},
{1,0,5,0,0,0,0,1},
{1,1,1,1,1,1,1,1},
},
};
switch (map[level][i][j])
{
case 5:printf("♀");
break;
case 1:printf("▓ ");
break;
case 3:printf("☆");
break;
case 4:printf("□");
break;
case 0:printf(" ");
break;
case 7:printf("★");
break;
case 8:printf("♂");
break;
}
“降维打击”
打印二维数组时
通过固定一个下标,手动改变。来实现二维数组的打印
//二维数组的降维打击
ine num[2][3]={1,2,3,4,5,6};
int pos=0;
for(int i = 0;i < 3; i++)
{
printf("%d\t",num[pos][i]);
}
printf("\n");
pos++; //通过改变pos的值实现对二维数组的遍历,使遍历方式只用1个for循环——一维数组遍历方 式
for(int i = 0;i < 3; i++)
{
printf("%d\t",num[pos][i]);
}
//三维数组
int map[3][8][8] = //地图模板
{
{
{1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,1,1},
{1,0,4,0,5,0,0,1},
{1,4,4,1,1,4,0,1},
{1,0,4,3,1,0,0,1},
{1,3,3,3,0,3,1,1},
{1,1,1,1,1,1,1,0},
},
{
{0,0,1,1,1,0,0,0},
{0,0,1,3,1,0,0,0},
{0,0,1,0,1,1,1,1},
{1,1,1,4,5,4,3,1},
{1,3,0,4,0,1,1,1},
{1,1,1,1,4,1,0,0},
{0,0,0,1,3,1,0,0},
{0,0,0,1,1,1,0,0}
},
{
{1,1,1,1,1,1,1,1},
{1,0,3,0,4,0,1,1},
{1,1,0,4,3,4,0,1},
{1,3,3,3,1,0,3,1},
{1,0,1,4,0,4,0,1},
{1,0,4,0,1,3,4,1},
{1,0,5,0,0,0,0,1},
{1,1,1,1,1,1,1,1},
},
};
int pos2=0;
for(int i = 0;i<8; i++)
{
for(int j = 0; j<8; j++)
{
switch(map[pos2][i]]j)
{case 5:printf("♀");
break;
case 1:printf("▓ ");
break;
case 3:printf("☆");
break;
case 4:printf("□");
break;
case 0:printf(" ");
break;
case 7:printf("★");
break;
case 8:printf("♂");
break;
}
if(_getch() == ' ') //实现按空格切换关卡
{
pos2++;
}
}
}
字符类二维数组
char str[3][20] //每一行存储一个字符串 [3][20] 3个字符串 , 20个字节存储大小
//遍历 只需要访问行
for(int i = 0; i< 3 ; i++)
{
printf("%s\n",str[i]); //只需要一个下标
}
//字符串排序
int temp = 0;
for(int i = 0 ;i<3;i++)
{
for(int j = 0; j < 3 - i -1;j++)
{
if( strcmp(str[ j ],str[ j + 1 ] )
{strcpy_s(temp,20,str[j]);
strcpy_s(str[j].20,str[j+1]);
strcpy_s(str[j+1],20,temp);
}
}
}
//字符数组与数字数组共同制表
int score[100][3] ;
char name[100][20] ;
int count = 0;
printf("请输入多少个学生数");
scanf_s("%d",&count);
//数据的录入
for(int i = 0 ; i < count; i++)
{
printf("请输入第%d位信息:",i+1);
scanf_s("%s",name[i],20); //二维数组字符串仅一个下标表示每一行首地址——输 入获取时可省略 取地址符
for(int j = 0;j < 3;j++)
{
scanf_s("%d",&score[i][j] );
}
}
//制表需要保证数字数组下标与字符串数组下标的一致性
for(int i = 0 ; i < 4 ; i++)
{
for(int j = 0 ; j < 4-1-i ; j++)
{
for(int k = 0; k < 3 ; k++)
{
int temp = score[j][k];
score[j][k] = score[j+1][k];
score[j+1][k] = temp;
}
}
}
//制表
printf("姓名\t语文\t数学\t英语");
for(int i = 0;i < count;i++)
{
printf("%s\t",name[i]);
for(int j = 0; j < 3;j++)
{
printf("%d\t",score[i][j]);
}
printf("\n");
}