关于C语言2维数组换

版权声明:请尊重每一个人的劳动成果 https://blog.csdn.net/jamenu/article/details/84331206

在课本上和很多学校工作室的考题里出现过这一道题目
大致意思如下:

以数字阵的方式表现
若设一2维数组a[3][3],由键盘输入赋值;
以方阵输出如下

1 2 3
4 5 6
7 8 9

要求我们换置为

1 4 7
2 5 8
3 6 9

经过观察,我们发现2与4换置,3与7换置,6与8换置;
把它们分别对应我们的2维数组元素的值;
规律如下
a[0][1]=a[1][0]
a[0][2]=a[2][0]
a[1][2]=a[2][1]
这三对元素发生了变化
我们可以设两个变量分别表示这两个下标,
当两个下标相反时
我们就互换他们的值

以下给出操作的代码

#include <stdio.h>
int main()
{
      int a[3][3];  //定义2维数组
 
      int i,j,k,l;
 
      printf("请输入数组a:\n");
 
      for(i=0;i<3;i++)     //一个双for内嵌完成对2维数组的赋值
      {
              for(j=0;j<3;j++)
             {
                     scanf("%d",&a[i][j]);
             }
       }
       printf("这个数组阵如下\n");
       
      for(i=0;i<3;i++)      //打印数组方阵
      {
             for(j=0;j<3;j++)
            {
                    printf("%3d",a[i][j]); 
            }
       printf("\n");
     }
    for(i=0;i<3;i++)    //换置双循环
   {
          for(j=i+1;j<3;j++)  //让j=i+1以避免a[0][0]和a[1][1]和a[2][2]的情况进行计算
          {
                 l = a[i][j]; //当i和j相反时,则把值互换
   
                a[i][j] = a[j][i];
   
                  a[j][i] = l;
   
              }
   }
  printf("换置后的数组为:\n");
 
 for(i=0;i<3;i++)    //双for循环输出换置后的数组
 {
           for(j=0;j<3;j++)
           {
                  printf("%3d",a[i][j]); 
          }
     printf("\n");
 }
 return 0;
}

下面给出运行截图
在这里插入图片描述
这方法比较直观,比较明显;
但有没有第二种方法来完成同样的效果呢?

下面我来用定义数组函数的方式来完成换置,

在我的上一篇关于指针的博客中证明数组名是一个指针变量,可以作为形参来对主函数进行改变
废话不多说
我们贴出操作代码

#include <stdio.h>
#define N 3              //定义N为3
void huanzhi(int b[][N]); //全局声明换置函数
int main()
{
     int a[N][N];
 
     int i,j,k,l;
 
     printf("请输入数组:\n");
 
    for(i=0;i<N;i++)   //双循环给数组a赋值
    {
         for(j=0;j<N;j++)
         {
               scanf("%d",&a[i][j]);
         }
     }
    for(i=0;i<N;i++)   //输出数组阵
    {
         for(j=0;j<N;j++)
         {
                printf("%3d",a[i][j]);
         }
        printf("\n");
    }
    huanzhi(a);                   //调用换置函数,注意用数组名a而不是a的元素,不然没有效果,这在上一篇里讲过
    printf("换置后的数组为\n");
    for(i=0;i<N;i++)               //输出换置后的数组阵
    {
         for(j=0;j<N;j++)
         {
              printf("%3d",a[i][j]);
         }
       printf("\n");
   }
 return 0; 
} 
void huanzhi(int b[][N])   //定义换置函数
{
     int i,j,k;
     for(i=0;i<N;i++)       //双循环换置
     {
           for(j=i+1;j<N;j++)
           {
                  k = b[i][j];
   
                b[i][j] = b[j][i];
   
                b[j][i] = k;
            }
      } 
}

下面给出运行截图

在这里插入图片描述
这里我们依旧正确的换置了2维数组

既然数组名是指针形变量,我们也能够用指针来解决问题
下面给出我的操作代码

#include <stdio.h>
#define N 3
void huanzhi(int *p1,int b[][N]);//声明
int main()
{
      int a[N][N];
 
      int i,j,*p = a;       //定义一个指针p指向数组a的首地址
 
      printf("请输入这个数组:\n");
 
      for(i=0;i<N;i++)
      {
           for(j=0;j<N;j++)
          {
                 scanf("%d",p++);//用指针来给数组赋值
          }
  
       }
      p = a; //由于在上面的双循环中指针已指向数组的最后一个元素,把指向重置
     for(i=0;i<N;i++)
     {
          for(j=0;j<N;j++)
          {
                printf("%3d",*p++);//输出p指针指向的数组元素的值
          }
        printf("\n");
     }
     printf("被换置后的数组为:\n");
     p = a;//由于在上面的双循环中指针已指向数组的最后一个元素,把指向重置
 
    huanzhi(p,a);       //调用换置函数
    for(i=0;i<N;i++)
    {
           for(j=0;j<N;j++)
           {
                printf("%3d",*p++);
            }
       printf("\n");
     }
 
}
void huanzhi(int *p1,int b[][N])//定义函数
{
      int i,j,temp;
 
      p1 = b;         //让形参数组指向形参数组的首地址
 
     for(i=0;i<N;i++)   //换置
     {
           for(j=i+1;j<N;j++)
           {
                   temp = b[i][j];
   
                   b[i][j] = b[j][i];
   
                   b[j][i] = temp; 
            }
       } 
}

下面给出运行的截图
在这里插入图片描述

由于时间的问题,上完先导课回来,没时间时间去完善,希望我们同学每个人在理解的同时找到自己的方法,人不能吊死在一颗树上,要多去试几棵。

过几天见!

猜你喜欢

转载自blog.csdn.net/jamenu/article/details/84331206