转置二维数组

时间:2018-03-16 03:23:16

标签: c

我想转置一个方阵,以下是我的代码。

#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 [] []没有正确定义, 但我无法指出任何错误。

非常感谢任何帮助

编辑: 上面的代码现在适用于突出显示的更改

2 个答案:

答案 0 :(得分:3)

transpose2D

ar[i][j] = transpose[i][j] ;

此处您正在复制transposear的绑定元素,这些元素可能会引发未定义的行为

您需要启动另一个循环并将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

请注意对角线条目AFKP的变化情况。另请注意如何交换EB; ICJGMD等等。

因此,事实上,通过交换元素对,可以实现转置。

对于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

新程序员最常犯的错误是两次交换条目对。这会对相同的数据进行两次转换,这显然会导致无法观察到的变化,并使许多新程序员感到困惑!