我在C中正在进行一项简短的任务时遇到了一些麻烦。我有一个二维数组看起来像这样:
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,当我在这发生后打印出数组时,它看起来和我初始化的数组相同。我觉得这就是我应该这样做的,但我是否会这样做呢?感谢帮助。
答案 0 :(得分:2)
交换数值时,你必须在循环中途停止,否则你会将它们交换回你开始的地方!
答案 1 :(得分:2)
正如我在评论中提到的那样,因为你在整个矩阵上进行迭代,你确实在反思,但当你走到对角线以下时,你就会将5
反映回原来的位置。内环应该从i+1
开始,这将使你保持在对角线之上:
for (j = i+1; j < arraySize; j++) {
^^^
答案 2 :(得分:1)
正如评论者指出的那样,当你在对角线下方迭代时,你会反思,撤消你刚才做的交换。
你的阵列总是正方形吗?如果是这样,这应该对你有用:
for(i = 0; i < arraySize; i++) {
for (j = i+1; j < arraySize; j++) {
这是有效的,因为i
也告诉我们对角线应该开始多远。我们添加+1
,因为我们不需要交换对角线的中间值。
答案 3 :(得分:0)
通常:交换(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;
}
}