没有正确显示矩阵的转置?

时间:2017-09-11 04:22:01

标签: c matrix

它适用于二次矩阵(2x2或3x3),但对于2x3或3x2,它无法正确显示!

#include <stdio.h>

int main()
{
int i,j,k,c1,c2,l1,l2;
int m1[10][10],m2[10][10],transposta[10][10],multiplicacao[10][10];

printf("\nDigite o numero de linhas e colunas na primeira matriz\n");
        scanf("%d%d",&l1,&c1);
        printf("\nDigite os elementos da matriz:\n");
        for(i=0;i<l1;i++)
        {
            for(j=0;j<c1;j++)
            {
                scanf("%d",&m1[i][j]);
            }
        }
        for(i=0;i<l1;i++)
        {
            for(j=0;j<c1;j++)
            {
                transposta[j][i] = m1[i][j];
            }
        }
        printf("\nA matriz transposta e:\n");
        for(i=0;i<l1;i++)
        {
            for(j=0;j<c1;j++)
                printf("%d\t",transposta[i][j]);
            printf("\n");
        }

如果我将元素{1,2,3,4,5,6}放在2x3矩阵中,它会显示如下:

1 4 1

2 5 0

然而,正确的方法是:

1 4

2 5

3 6

代码有什么问题,以及当行数与列不同时,为什么它不起作用

3 个答案:

答案 0 :(得分:1)

你应该这样试试:

#include <stdio.h>

int main()
{
    int a[10][10], transpose[10][10], r, c, i, j;
    printf("Enter rows and columns of matrix: ");
    scanf("%d %d", &r, &c);

    // Storing elements of the matrix
    printf("\nEnter elements of matrix:\n");
    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
        {
            printf("Enter element a%d%d: ",i+1, j+1);
            scanf("%d", &a[i][j]);
        }

    // Displaying the matrix a[][] */
    printf("\nEntered Matrix: \n");
    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
        {
            printf("%d  ", a[i][j]);
            if (j == c-1)
                printf("\n\n");
        }

    // Finding the transpose of matrix a
    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
        {
            transpose[j][i] = a[i][j];
        }

    // Displaying the transpose of matrix a
    printf("\nTranspose of Matrix:\n");
    for(i=0; i<c; i++)
        for(j=0; j<r; j++)
        {
            printf("%d  ",transpose[i][j]);
            if(j==r-1)
                printf("\n\n");
        }

    return 0;
}

答案 1 :(得分:1)

您的转置逻辑不正确。正确的for循环将是

    // note use c1 here not l1
    for(i=0;i<c1;i++)
    {
        //note use l1 here not c1
        for(j=0;j<l1;j++)
        {
            //  indexing of m1 is changed
            transposta[i][j] = m1[j][i];
        }
    }
    printf("\nA matriz transposta e:\n");
    // same here
    for(i=0;i<c1;i++)
    {
        for(j=0;j<l1;j++)
            printf("%d\t",transposta[i][j]);
        printf("\n");
    }

转置时,行成为列,列成为行,因此您需要根据该行更改循环索引。

答案 2 :(得分:1)

您的代码中的所有内容都是正确的,只需更改

即可
for(i=0;i<l1;i++)
        {
            for(j=0;j<c1;j++)
                printf("%d\t",transposta[i][j]);
            printf("\n");
        }

通过

for(i=0;i<c1;i++)
        {
            for(j=0;j<l1;j++)
                printf("%d\t",transposta[i][j]);
            printf("\n");
        }

出于打印目的,你必须照顾c1和l1