-1

Я сделал программу Matrix Multiplication в C++, используя динамические многомерные массивы. Проблема заключается в том, когда я ввожу значения теста матрица A = row1 {1}, row2 {2} matrix B = row1 {1, 2, 3}, она перестает работать в цикле, где пользователь вводит значения первого массива, я нашел он использует отладки. но программа отлично работает при вводе матрицы A = row1 {1, 2}, row2 {3, 4} matrix 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(); 

      } 
+0

Любая причина, по которой вы не используете 'std :: vector' и избавляетесь от этих проблем? – PaulMcKenzie

+0

Потому что я обязан так поступать! , кроме того, если это возможно, то почему бы и нет, я буду изучать лучшие пути позже, сначала я должен пройти через каждую концепцию :) – ShearzAhmed

+0

Я не понимаю вашего описания того, что вы ввели. Сколько строк и столбцов вы вводили для Array1, сколько строк/столбцов вы вводили для Array2? – PaulMcKenzie

ответ

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

это именно то, что я делаю :( вы можете видеть мой и ваш код. Они точно такие же – ShearzAhmed

+0

Нет, вы выделяете строки в цикле, а затем перебираете количество столбцов для выделения столбцов – user1781290

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 удовлетворяют требованиям для умножения А и В.

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

Этот цикл будет идти наперекосяк, если dynamicArray1 и dynamicArray2 не имеют необходимых количество столбцов и строк перед умножением.

Во-первых, следующее испытание должно быть сделано до умножения:

if (a1Columns != a2Rows) 
    return; 

Во-вторых, ваш k цикл неправильно. Это должно быть так:

for (int k = 0; k < a2Rows; k++) 
    sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]); 
dynamicArray3[i][j] = sum; 
+0

hey PaulMcKenz, Я согласен со всеми тремя вашими точками :) Причина, по которой я использую цикл для распределения памяти по строкам, заключается в том, что я хочу, чтобы эта программа была общей программой, которая может умножать всю матрицу умножаемой матрицы – ShearzAhmed

+0

Что делать, если у меня есть матрица, которая имеет более 1-го ряда строк, получая мою мысль? – ShearzAhmed

+0

@ user3812696 - Ваша петля k неверна. См. Мой обновленный ответ. – PaulMcKenzie

Смежные вопросы