C++编写关于矩阵转置的代码,最后调试时输出的数字出现问题

img


代码如下:


#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;
}

基于Monster 组和GPT的调写:

这段代码的问题在于在转置矩阵后输出结果时,使用了原始矩阵指针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;
}

img