C语言轻松学习-9

我们接下来学习“二维数组的对称交换”,

我们先不写交换,我们先考虑怎么让它们对称,

1 2 3                              1 4 7

4 5 6          转换为          2 5 8

7 8 9                              3 6 9

这样我们可能并不明显的发现出核心规律,那么我们将他们用数组来代表出来如下:

a[0][0]   a[0][1]   a[0][2]                             a[0][0]   a[1][0]   a[2][0]

a[1][0]   a[1][1]   a[1][2]          转换为        a[0][1]   a[1][1]   a[2][1]

a[2][0]   a[]2[1]   a[3][2]                            a[0][2]   a[1][2]   a[3][2]

那么我们发现了对称后的他们的“行”与“列”的数值相互交换了

代码如下:

#include<stdio.h>
int main()
{
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[i][j]);
    printf("\n"); 
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[j][i]);
    printf("\n");
  }
  return 0;
}

代码调试截图如下:

那么我们交换“第一行”与“第一列”的数值其实就是在循环体之中添加个交换的代码就行,

代码如下:

#include<stdio.h>
int main()
{
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  int m;
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[i][j]);
    printf("\n"); 
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[j][i]);
    printf("\n");
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
    {
      m=a[i][j];
      a[i][j]=a[j][i];
      a[j][i]=m;
      printf("%d ",a[i][j]);
    }
  printf("\n");
  } 
  return 0;
}

代码调试截图如下:根据调试截图,我们发现,添加了交换代码之后“第一行”和“第一列”竟然都相等,这是为什么呢?我们在脑子里自己运行一下代码,思考一下,

经过思考之后,我们发现,我们外层循环让我们的这段交换代码执行了很多次,相当于本来我们执行第一次外层大循环时已经完成了所有的交换,然后第二次执行外层大循环时又进行了交换,第三次也是重复了,我们用代码和调试截图来解释,

1.当执行一次外层大循环时:

代码:

#include<stdio.h>
int main()
{
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  int m;
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[i][j]);
    printf("\n"); 
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[j][i]);
    printf("\n");
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
    {
      if(i<1)
      {
        m=a[i][j];
        a[i][j]=a[j][i];
        a[j][i]=m;
      }
      printf("%d ",a[i][j]);
    }
  printf("\n");
  } 
  return 0;
}

代码调试截图:

2.当执行二次外层大循环时:

代码:

#include<stdio.h>
int main()
{
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  int m;
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[i][j]);
    printf("\n"); 
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[j][i]);
    printf("\n");
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
    {
      if(i<2)
      {
        m=a[i][j];
        a[i][j]=a[j][i];
        a[j][i]=m;
      }
      printf("%d ",a[i][j]);
    }
  printf("\n");
  } 
  return 0;
}

代码调试截图:

3.当执行三次外层大循环时:

代码:

#include<stdio.h>
int main()
{
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  int m;
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[i][j]);
    printf("\n"); 
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
      printf("%d ",a[j][i]);
    printf("\n");
  }
  printf("下面为对称的显示.\n");
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
    {
      m=a[i][j];
      a[i][j]=a[j][i];
      a[j][i]=m;
      printf("%d ",a[i][j]);
    }
  printf("\n");
  } 
  return 0;
}

代码调试截图:

经过上面三次的调试试验,我们发现只要在外层大循环循环的第一次时进行交换,我们的结果就会没有任何问题,

小结:

二维数组不会像一维数组那么灵活的定义,但二维数组或多维数组的实用性是非常大的,

我们目前可以以数学的思想去将抽象的二维数组转换为具体的“矩形”的“长”“宽”,同时,三维也可以用“x”“y”“z”

进行多维数组交换时,我们要理解,它是如何去交换的,交换了多少次,如果我们不确认,可以拿个小本子在本子上面自己执行下代码,既然是多维,那么我们就不能单一的考虑一方面了

习题:

1.用户输入4个数值,要求必须使用二维数组将其进行输出

2.用户输入9个数,要求三行三列输出一次,第二次输出要求在原来的基础上进行对称交换

参考答案在下一页,

1 2 3
分享到:
赞(0)

请选择你看完该文章的感受:

9瞧一瞧 1扯淡 4学到了 2不懂 7正能量 1无聊

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址 (选填)