2013-04-24 60 views
3

我有一点麻烦具有短分配我在C.工作我有一个2维数组,它看起来像这样:内C - 2维阵列反射值

0 5 5 5 
0 0 5 5 
0 0 0 5 
0 0 0 0 

我想反映5周的的对角线,所以它看起来是这样的:

0 0 0 0 
5 0 0 0 
5 5 0 0 
5 5 5 0 

这是我有:

//reflect the 5's 
for(i = 0; i < arraySize; i++) { 
    for (j = 0; j < arraySize; j++) { 
     int temp = array[i][j]; 
     array[i][j] = array[j][i]; 
     array[j][i] = temp; 
    } 
} 

这我没有反映出5,当我在这种情况发生后打印数组时,它看起来与我初始化的数组相同。我觉得这就是我应该这样做的,但是我是否在谈论这个错误?感谢帮助。

+1

那么你在反思,但那么你就当你遍历对角线 – 2013-04-24 01:52:11

+0

下方反射回我知道OP是一个新手,但他/她应该避免使用术语:反映。也许是“镜子”。 IIRC这是我在学习Linear代数时听到的术语。 – 2013-04-24 01:57:08

+0

@AdamGent我认为'反映'是一个适当的词汇http://en.wikipedia.org/wiki/Transpose – 2013-04-24 02:02:52

回答

3

当交换值时,你必须在循环中途停下来,否则你会把它们交换回你开始的地方!

+0

好吧,我在我的嵌套for循环中添加了一个if条件来修复它。我没有意识到我正在把他们反映在他们所在的地方。非常感谢。 – mrowland 2013-04-24 01:56:02

1

一般而言:交换(A [i] [j],A [j]的[I])对于j = I + 1..arrSize

//reflect the 5's 
for(i = 0; i < arraySize; i++) { 
    for (j = i+1; j < arraySize; j++) { 
     int temp = array[i][j]; 
     array[i][j] = array[j][i]; 
     array[j][i] = temp; 
    } 
} 
+0

谢谢,我很感激。 – mrowland 2013-04-24 01:58:36

2

作为评论者指出的,你反射当您在对角线下面迭代时,退回您刚才创建的交换。

你的数组是否总是正方形?如果是的话,这应该为你工作:

for(i = 0; i < arraySize; i++) { 
    for (j = i+1; j < arraySize; j++) { 

这工作,因为i也告诉我们多远沿对角线应该开始。我们添加+1,因为我们不需要交换对角线的中间值。

+0

谢谢你。 – mrowland 2013-04-24 01:59:19

3

正如我在我的评论中提到的那样,由于您正在迭代整个矩阵,所以您确实在反射,但是当您走到对角线的下方时,您将把原来的位置反射回原来的位置。内环应该开始在i+1,这将让你在对角线之上:

for (j = i+1; j < arraySize; j++) { 
     ^^^ 
+0

并感谢你。 – mrowland 2013-04-24 01:59:39