如何使用malloc转置矩阵并打印它

时间:2018-04-28 08:28:36

标签: c

我希望我的代码扫描行和列的值,然后打印矩阵(我不关心矩阵中的值)并打印转置矩阵。

我的代码有什么问题?

代码:

#include <stdio.h>
#include <string.h>

void main()
{
    int rows1, colums1, i, j;
    int**matrix1, **transpose_matrix1;

    printf_s("enter rows and colums\n");
    scanf_s("%d%d", &rows1, &colums1);

    matrix1 = malloc(sizeof(int*)*rows1);
    for (i = 0; i < rows1; i++)
        matrix1[i] = malloc(sizeof(int)*colums1);

    for (i = 0; i < rows1; i++)
        for (j = 0; j < colums1; j++)
            matrix1[i][j] = i+j;
    puts("matrix: ");
    for (i = 0; i < rows1; i++)
    {
        for (j = 0; j < colums1; j++)
        {
            printf_s("%d ", matrix1[i][j]);
        }
        printf_s("\n");
    }

    transpose_matrix1 = malloc(sizeof(int*)*colums1);
    for (i = 0; i < colums1; i++)
        transpose_matrix1[i] = malloc(sizeof(int)*rows1);

    for (i = 0; i < rows1; i++)
        for (j = 0; j < colums1; j++)
            transpose_matrix1[j][i] = matrix1[i][j];

    puts("transpose matrix:");
    for (i = 0; i < rows1; i++)
    {
        for (j = 0; j < colums1; j++)
        {
            printf_s("%d ", transpose_matrix1[i][j]);
        }
        printf_s("\n");
    }
}

输入:

2 3
0 1 2
1 2 3

输出:

enter rows and colums
matrix:
transposematrix:
0 1 -33686019
1 2 -33686019

3 个答案:

答案 0 :(得分:1)

初始化转置矩阵时,就像

一样
transpose_matrix1[j][i] = matrix1[i][j];

请注意j中使用itranspose_matrix1[j][i]的顺序。

然后在打印时使用transpose_matrix1[i][j]。请注意,ji的顺序已更改,即使两者的循环相同也是如此。您需要在两个循环中对ji使用相同的顺序。

答案 1 :(得分:1)

你已经把自己与一个列和什么行混淆了一点 这是一个固定版本:

void print_matrix(int ** matrix, int rows, int colums){
    int i,j;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < colums; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    int transpose_rows1, transpose_colums1, rows1, colums1, i, j;
    int**matrix1, **transpose_matrix1;

    printf("enter rows and colums\n");
    scanf("%d%d", &rows1, &colums1);

    matrix1 = (int**)malloc(sizeof(int*)*rows1);
    for (i = 0; i < rows1; i++)
        matrix1[i] = (int*)malloc(sizeof(int)*colums1);

    for (i = 0; i < rows1; i++)
        for (j = 0; j < colums1; j++)
            matrix1[i][j] = i+j;
    puts("matrix: ");
    print_matrix(matrix1, rows1, colums1);

    transpose_rows1 = colums1;
    transpose_colums1 = rows1;

    transpose_matrix1 = (malloc(sizeof(int*) * transpose_rows1));
    for (i = 0; i < transpose_rows1; i++)
        transpose_matrix1[i] = (malloc(sizeof(int) * transpose_colums1));

    for (i = 0; i < rows1; i++)
        for (j = 0; j < colums1; j++)
            transpose_matrix1[j][i] = matrix1[i][j];

    puts("transpose matrix:");
    print_matrix(transpose_matrix1, transpose_rows1, transpose_colums1);

    return 0;
}

为了在将来不要混淆自己,请尝试使用具有确切含义的函数和名称。

创建一个打印数组的函数要比编写代码两次更容易,然后再考虑现在的行是什么以及列是什么。

而且,如果变量名colums1始终是矩阵的列,而不是一列上的列而另一列上的行,则更容易,因此只需为第二个数组列和行创建一个新变量正确的数据。

答案 2 :(得分:0)

在转换矩阵中,行数是普通矩阵的列数,列数等于普通矩阵的行数。因此,i应该从0到columns1j从0到rows1

for (i = 0; i < colums1; i++)
    for (j = 0; j < rows1; j++)
        transpose_matrix1[i][j] = matrix1[j][i];

puts("transpose matrix:");
for (i = 0; i < colums1; i++)
{
    for (j = 0; j < rows1; j++)
    {
        printf("%d ", transpose_matrix1[i][j]);
    }
    printf("\n");
}