版权声明:请尊重每一个人的劳动成果 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;
}
}
}
下面给出运行的截图
由于时间的问题,上完先导课回来,没时间时间去完善,希望我们同学每个人在理解的同时找到自己的方法,人不能吊死在一颗树上,要多去试几棵。
过几天见!