C ++中的动态多维数组

问题描述 投票:-2回答:2

我使用动态多维数组在c ++中创建了Matrix Multiplication程序。问题是当我输入测试值矩阵A = row1 {1},row2 {2}矩阵B = row1 {1,2,3}时,它停止工作在用户输入第一个数组值的循环中,我发现它使用调试。但是当我输入矩阵A = row1 {1,2},row2 {3,4}矩阵B = row1 {5,6},row2 {7,8}时,程序工作正常

我希望这个程序是一个可以倍增所有矩阵的通用程序

#include <iostream>
using namespace std;

class Lab_02
{
public:
    void Product(){
    int a1Rows, a1Columns;
    int a2Rows, a2Columns;
    cout << "Plz Enter the no. of rows for Array 1      :";
    cin >> a1Rows;

    cout << "Plz Enter the no. of columns for Array 1   :";
    cin >> a1Columns;

    cout << "Plz Enter the no. of rows for Array 2      :";
    cin >> a2Rows;

    cout << "Plz Enter the no. of columns for Array 2   :";
    cin >> a2Columns;

    int **dynamicArray = 0;
    int **dynamicArray2 = 0;
    int **dynamicArray3 = 0;
    cout << endl;


    for (int i = 0; i < a1Rows; i++)
    {
        dynamicArray3 = new int *[a1Rows];
    }
    for (int i = 0; i < a2Columns; i++)
    {
        dynamicArray3[i] = new int[a2Columns];
    }



    // memory allocated for elements of rows. 
    for (int i = 0; i < a1Rows; i++)
    {
        dynamicArray = new int *[a1Rows];
    }
    // memory allocated for  elements of each column.  
    for (int i = 0; i < a1Columns; i++)
    {
        dynamicArray[i] = new int[a1Columns];
    }


    // memory allocated for elements of rows. 
    for (int i = 0; i < a2Rows; i++)
    {
        dynamicArray2 = new int *[a2Rows];
    }
    // memory allocated for  elements of each column.  
    for (int i = 0; i < a2Columns; i++)
    {
        dynamicArray2[i] = new int[a2Columns];
    }


    cout << "enter the values or array 1 \n";
    for (int i = 0; i < a1Rows; i++)
    {
        for (int j = 0; j < a1Columns; j++)
        {
            cout << "array[" << i << "][" << j << "]\t";
            cin >> dynamicArray[i][j];

        }

    }

    cout << "enter the values or array 2 :\n";

    for (int i = 0; i < a2Rows; i++)
    {
        for (int j = 0; j < a2Columns; j++)
        {
            cout << "array[" << i << "][" << j << "]\t"; 
            cin >> dynamicArray2[i][j];

        }
    }


    int sum; 


    for (int i = 0; i < a1Rows; i++)
    {
        for (int j = 0; j < a1Columns ; j++)
        {
            sum = 0;
            for (int k = 0; k <  a2Columns ; k++)
            {
                sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]);
            }
            dynamicArray3[i][j] = sum;
        }

    }


        cout <<"Result" << endl << endl;
        for (int i = 0; i < a1Rows; i++)
        {
            for (int j = 0; j < a2Columns; j++)
            {
                cout << dynamicArray3[i][j] << "\t";

            }
            cout << endl;
        }


    }
   };


        void main(void)
        {

         Lab_02 object;   
           object.Product();

          }
c++ arrays multidimensional-array matrix-multiplication dynamic-arrays
2个回答
0
投票

您对矩阵的内存分配是个问题。将它们更改为以下内容

// memory allocated for elements of rows. 
dynamicArray = new int *[a1Rows];

// memory allocated for  elements of each column.  
for (int i = 0; i < a1Rows; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

您需要为行分配一个数组数组,然后您需要循环遍历行并分配列。


0
投票

代码的问题是你不应该在循环中分配“行”。您只需要为行分配一个,然后循环以为每行分配数据。

例如,而不是这样:

for (int i = 0; i < a1Rows; i++)
{
    dynamicArray = new int *[a1Rows];
}
// memory allocated for  elements of each column.  
for (int i = 0; i < a1Columns; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

正确的方法是:

dynamicArray = new int *[a1Rows];
for (int i = 0; i < a1Columns; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

你为每个循环犯了同样的错误。

还有一些要点:

  1. 您无法释放已分配的内存。
  2. 如果你使用std::vector,那么事情变得容易多了。
  3. 在执行sum循环之前,您需要检查矩阵是否可以乘法。通过multiplyable意味着矩阵A和B的列数和行数满足A和B的乘法要求。 for (int i = 0; i < a1Rows; i++) { for (int j = 0; j < a1Columns; j++) { sum = 0; for (int k = 0; k < a2Columns; k++) sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]); dynamicArray3[i][j] = sum; } }

如果dynamicArray1dynamicArray2在乘法之前没有必要数量的列和行,则此循环将变得混乱。

首先,应在乘法之前进行以下测试:

if (a1Columns != a2Rows)
    return;

其次,你的k循环是错误的。它应该是这样的:

for (int k = 0; k < a2Rows; k++)
    sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]);
dynamicArray3[i][j] = sum;
© www.soinside.com 2019 - 2024. All rights reserved.