for(i)循环的i是相同数据组成的矩形框的层号。
for(j)循环的j是矩形框顶行和底行的列号(i列到N - 1 - i列)。该循环显然是填写行的。
for(k)循环的k是矩形框左列和右列的行号(i行到N - 1 - i行)。该循环显然是填写列的。
看看代码:
for(i = 0 i < N ++i)for(j = 0 j < N ++j
a[i][j] = N * i + j
每一个i都对应N个j(0 -- N - 1),i是行索引,j是列索引,显然是按行 *** 作的
for(i = 0 i < N ++i)for(j = 0 j < 迅宽N ++j
a[j][i] = N * i + j
每一个i都对应N个j(0 -- N - 1),j是行索引,i是列索引,显然是按列 *** 作的
从以上分析可知,二维数组的两个索引的变化方姿昌此式的不同,决定了 *** 作方式的不同。第一维(左边的索引)一次变化对应第二维多次变化时,就是按行 *** 作,相反,第一维(左边的索引)多迹迅次次变化对应第二维一次变化时,就是按列 *** 作。
二维数组的第一维(就是后面一个[])作为行,第二维(就是前面一个[])作为列,这是一种惯用理解方式。你的理解恰好把行和列反了一下。这种理解方式也不是没有原因的,一维数组我们叫一敏陪行,可以用元素指针桥宽蠢自增自减的方式遍历整个行,但我们不能用巧睁元素指针自增自减来遍历二维数组的整个列。
给你分析下。。。。为什么前面已经换了,但后面输出却没换过来?原因很简单。。你做了两次交换。。。例如,当i=1,j=3时,你信逗把t[1][3]与t[3][1]做了一次交换,等程序运行到i=3,j=1时,你是不是对t[3][1]与t[1][3]又做了一次交换??
考虑下吧。。。呵呵。。。进行了两次交换,所有工作都白做了。。。
解决滑源卖办法是:再定义一个二维数组来存放交换后裂衫的值。。。。
#include<iostream>
using namespace std
main()
{
int t[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j
int str[3][3]
for(i=0i<3i++)
for(j=0j<3j++)
{ //cout<<"i shi :"<<i<<"j shi :"<<j<<" "<<t[i][j]
str[j][i]=t[i][j]
//cout<<"现在是"<<t[i][j]<<endl
}
for(i=0i<3i++)
{ for(j=0j<3j++)
{cout<<str[i][j]}
cout<<endl
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)