第08课 二维数组

二维数组

创建

类型 数组[数组长度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");
           }
           
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值