#include <iostream>
using namespace std;
void transpose(int* A, int* B, int m, int n)
{
for (int i = 0; i < m; i++)
{
int nn = (n < m) ? m : n; // 列数小于行数时使用行数m
for (int j = 0; j < nn; j++)
{
B[j * m + i] = A[i * n + j];
}
}
}
int main()
{
cout << "请补全为方阵(缺少部分用0代替)" << endl;
int m, n, t;
cout << "请输入要转置的矩阵的行数:";
cin >> m;
cout << "请输入要转置的矩阵的列数:";
cin >> n;
t = max(m, n); // 取行列数较大的那个数,用于定义数组
int* a = new int[t * t];
int* b = new int[t * t];
// 输入矩阵元素
for (int i = 1; i <= m; i++) // 修正行数
{
cout << "请输入第" << i << "行元素:";
for (int j = 0; j < n; j++)
{
cin >> *(a + (i - 1) * t + j);
}
for (int j = n; j < t; j++) // 如果列数比行数小,在后面补 0
{
*(a + (i - 1) * t + j) = 0;
}
}
// 转置并输出结果
transpose(a, b, m, n);
cout << "转置前的矩阵:" << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << *(a + i * t + j) << " ";
}
cout << endl;
}
cout << "转置后的矩阵:" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << *(b + i * t + j) << " ";
}
cout << endl;
}
delete[] a;
delete[] b;
return 0;
}
这段代码的问题在于在转置矩阵后输出结果时,使用了原始矩阵指针a来输出,而没有使用转置后的矩阵指针b。因此,转置后的矩阵无法正确输出。
下面是修正后的代码:
#include <iostream>
using namespace std;
void transpose(int* A, int* B, int m, int n)
{
for (int i = 0; i < m; i++)
{
int nn = (n < m) ? m : n; // 列数小于行数时使用行数m
for (int j = 0; j < nn; j++)
{
B[j * m + i] = A[i * n + j];
}
}
}
int main()
{
cout << "请补全为方阵(缺少部分用0代替)" << endl;
int m, n, t;
cout << "请输入要转置的矩阵的行数:";
cin >> m;
cout << "请输入要转置的矩阵的列数:";
cin >> n;
t = max(m, n); // 取行列数较大的那个数,用于定义数组
int* a = new int[t * t];
int* b = new int[t * t];
// 输入矩阵元素
for (int i = 1; i <= m; i++) // 修正行数
{
cout << "请输入第" << i << "行元素:";
for (int j = 0; j < n; j++)
{
cin >> *(a + (i - 1) * t + j);
}
for (int j = n; j < t; j++) // 如果列数比行数小,在后面补 0
{
*(a + (i - 1) * t + j) = 0;
}
}
// 转置并输出结果
transpose(a, b, m, n);
cout << "转置前的矩阵:" << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << *(a + i * t + j) << " ";
}
cout << endl;
}
cout << "转置后的矩阵:" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << *(b + i * t + j) << " ";
}
cout << endl;
}
delete[] a;
delete[] b;
return 0;
}