我想转置一个方阵,以下是我的代码。
#include <stdio.h>
#define SIZE 10
void transpose2D(int ar[][SIZE], int rowSize, int colSize);
void display(int ar[][SIZE], int rowSize, int colSize);
int main()
{
int ar[SIZE][SIZE], rowSize, colSize;
int i,j;
printf("Enter row size of the 2D array: \n");
scanf("%d", &rowSize);
printf("Enter column size of the 2D array: \n");
scanf("%d", &colSize);
printf("Enter the matrix (%dx%d): \n", rowSize, colSize);
for (i=0; i<rowSize; i++)
for (j=0; j<colSize; j++)
scanf("%d", &ar[i][j]);
printf("transpose2D(): \n");
transpose2D(ar, rowSize, colSize);
display(ar, rowSize, colSize);
return 0;
}
void display(int ar[][SIZE], int rowSize, int colSize)
{
int l,m;
for (l = 0; l < rowSize; l++) {
for (m = 0; m < colSize; m++)
printf("%d ", ar[l][m]);
printf("\n");
}
}
void transpose2D(int ar[][SIZE], int rowSize, int colSize)
{
int transpose[rowSize][colSize] ;
/* We have to define a new transposed array because otherwise, when some of
* the values are changed, it wont be an accurate transposition anymore */
int i , j ;
/* This function transposes a given 2D matrix */
for (i = 0 ; i < rowSize ; i++) {
for (j = 0 ; j < colSize ; j++) {
transpose[j][i] = ar[i][j] ;
}
}
for (i = 0 ; i < rowSize ; i++) {
for (j = 0 ; j < colSize ; j++) {
// ^^^^ ^^^^ ^^^^ ^^^^ ^^^^
// edit : assign transpose to ar using for loop
ar[i][j] = transpose[i][j] ;
}
}
}
给定输入,
Enter row size of the 2D array:
4
Enter column size of the 2D array:
4
Enter the matrix (4x4):
1 2 3 4
1 1 2 2
3 3 4 4
4 5 6 7
transpose2D():
1 2 3 4
1 1 2 2
3 3 4 4
4 5 6 7
这是我得到的结果。但是,我应该得到的是
transpose2D():
1 1 3 4
2 1 3 5
3 2 4 6
4 2 4 7
我的代码中是否存在我无法识别的错误? 我的猜测是我的2D数组transpose [] []没有正确定义, 但我无法指出任何错误。
非常感谢任何帮助
编辑: 上面的代码现在适用于突出显示的更改
答案 0 :(得分:3)
在transpose2D
ar[i][j] = transpose[i][j] ;
此处您正在复制transpose
到ar
的绑定元素,这些元素可能会引发未定义的行为
您需要启动另一个循环并将transpose
的元素复制回ar
答案 1 :(得分:1)
在我们编写任何代码之前,我们应该调查一下我们应该完成什么。
让我们考虑一个4×4阵列及其转置。为了便于说明,我将使用字母A到P来描述值:
A B C D A E I M
E F G H transposed is B F J N
I J K L C G K O
M N O P D H L P
请注意对角线条目A
,F
,K
和P
的变化情况。另请注意如何交换E
和B
; I
和C
,J
和G
,M
和D
等等。
因此,事实上,通过交换元素对,可以实现转置。
对于4×4矩阵,有六对交换:
Original Transpose
A B C D A E C D A E I D A E I M A E I M A E I M A E I M
E F G H B F G H B F G H B F G H B F J H B F J N B F J N
I J K L I J K L C J K L C J K L C G K L C G K L C G K O
M N O P M N O P M N O P D N O P D N O P D H O P D H L P
No swaps B-E C-I D-M G-J H-N L-O
基本上,我们将下三角形中的每一个与上三角形中相应的一个交换。例如,对于较低的三角形元素使用L
,对于上三角形元素使用U
,对于对角元素使用D
:
D U U U
L D U U
L L D U
L L L D
我们现在可以编写伪代码算法:
Let T[N][N] be the matrix to be transposed
Let C be the column number in the lower triangular part,
and the row number in the upper triangular part
Let R be the row number in the lower triangular part
and the column number in the upper triangular part
For C = 0 to N-1, inclusive:
For R = C+1 to N-1, inclusive:
Swap T[C][R] and T[R][C]
End For
End For
新程序员最常犯的错误是两次交换条目对。这会对相同的数据进行两次转换,这显然会导致无法观察到的变化,并使许多新程序员感到困惑!