我希望我的代码扫描行和列的值,然后打印矩阵(我不关心矩阵中的值)并打印转置矩阵。
我的代码有什么问题?
代码:
#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
答案 0 :(得分:1)
初始化转置矩阵时,就像
一样transpose_matrix1[j][i] = matrix1[i][j];
请注意j
中使用i
和transpose_matrix1[j][i]
的顺序。
然后在打印时使用transpose_matrix1[i][j]
。请注意,j
和i
的顺序已更改,即使两者的循环相同也是如此。您需要在两个循环中对j
和i
使用相同的顺序。
答案 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到columns1
和j
从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");
}