我们接下来学习“二维数组的对称交换”,
我们先不写交换,我们先考虑怎么让它们对称,
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个数,要求三行三列输出一次,第二次输出要求在原来的基础上进行对称交换
参考答案在下一页,
评论抢沙发