tranerius

19. Произведение матриц

Dec 14th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #define BUG_1 0
  4. void swap(int &i_1, int &j_1, int &i_2, int &j_2);
  5. void DeleteDynamicArray(int **&arrtwoDimArr, const int rows, const int cols) {
  6.     for (int i = 0; i < rows; i++) {
  7.         delete[] arrtwoDimArr[i];
  8.     }
  9.     delete[]arrtwoDimArr;
  10.     arrtwoDimArr = nullptr;
  11. }
  12. void DeleteDynamicArray(int *&arroneDimArr) {
  13.     delete[]arroneDimArr;
  14.     arroneDimArr = nullptr;
  15. }
  16. void AutoFillArray(int *arroneDimArr, const int size);
  17. void AutoFillArray(int **arrtwoDimArr, const int rows, const int cols);
  18. void ManuallyFillArray(int *arrtwoDimArr, const int size);
  19. void ManuallyFillArray(int **arrtwoDimArr, const int rows, const int cols);
  20. void MultArray(int *arroneDimArr_1, const int size, int **arrtwoDimArr_2, const int rows, const int cols);
  21. void MultArray(int **arrtwoDimArr_1, int **arrtwoDimArr_2, const int rows_1, const int cols_1, const int rows_2, const int cols_2);
  22. void shawArr(int* oneDimArr, const int size);
  23. void shawArr(int** twoDimArr, const int rows, const int cols);
  24. int sumArrVals(int* oneDimArr, const int size);
  25. int sumArrVals(int** twoDimArr, const int rows, const int cols);
  26. int main() {
  27.     setlocale(LC_ALL, "ru");
  28.     srand(time(NULL));
  29.     int rows_1, rows_2, cols_1, cols_2; char answer;
  30.     std::cout << "Введите количество строк первой матрицы: ";
  31.     std::cin >> rows_1;
  32.     std::cout << "Введите количество столбцов первой матрицы: ";
  33.     std::cin >> cols_1;
  34.     std::cout << "Введите количество строк второй матрицы: ";
  35.     std::cin >> rows_2;
  36.     std::cout << "Введите количество столбцов второй матрицы: ";
  37.     std::cin >> cols_2;
  38.     do {
  39.         if (cols_1 != rows_2 && cols_2 != rows_1) {
  40.             std::cout << "Матрицы с такими размерами нельзя перемножить."
  41.                 << "\nРазмер первой матрицы: " << rows_1 << " x " << cols_1
  42.                 << "\nРазмер второй матрицы: " << rows_2 << " x " << cols_2 << std::endl;
  43.             while (true) {
  44.                 std::cout << "Какую матрицу изменить?(1/2) ";
  45.                 std::cin >> answer;
  46.                 if (answer == '1') {
  47.                     std::cout << "Введите количество строк первой матрицы: ";
  48.                     std::cin >> rows_1;
  49.                     std::cout << "Введите количество столбцов первой матрицы: ";
  50.                     std::cin >> cols_1;
  51.                     break;
  52.                 }
  53.                 else if (answer == '2') {
  54.                     std::cout << "Введите количество строк второй матрицы: ";
  55.                     std::cin >> rows_2;
  56.                     std::cout << "Введите количество столбцов второй матрицы: ";
  57.                     std::cin >> cols_2;
  58.                     break;
  59.                 }
  60.                 else {
  61.                     std::cout << "Ошибка: неверный ответ" << std::endl;
  62.                     continue;
  63.                 }
  64.             }
  65.         }
  66.     } while (cols_1 != rows_2 && cols_2 != rows_1);
  67.     if (cols_1 > rows_2) {
  68.         swap(rows_1, cols_1, rows_2, cols_2);
  69.     }
  70.     if (rows_1 == 1) {
  71.         int *oneDimArr_1 = new int[cols_1];
  72. #if BUG_1==1
  73.         AutoFillArray(oneDimArr_1, rows_1*cols_1);
  74.         shawArr(oneDimArr_1, rows_1*cols_1);
  75. #endif
  76. #if BUG_1==0
  77.         std::cout << "Первая матрица: " << std::endl;
  78.         ManuallyFillArray(oneDimArr_1, rows_1*cols_1);
  79. #endif
  80.         int **twoDimArr_2 = new int*[rows_2];
  81.         for (int i = 0; i < rows_2; i++) {
  82.             twoDimArr_2[i] = new int[cols_2];
  83.         }
  84. #if BUG_1==1
  85.         AutoFillArray(twoDimArr_2, rows_2, cols_2);
  86.         shawArr(twoDimArr_2, rows_2, cols_2);
  87. #endif
  88. #if BUG_1==0
  89.         std::cout << "Вторая матрица: " << std::endl;
  90.         ManuallyFillArray(twoDimArr_2, rows_2, cols_2);
  91. #endif
  92.         MultArray(oneDimArr_1, rows_1*cols_1, twoDimArr_2, rows_2, cols_2);
  93.         DeleteDynamicArray(oneDimArr_1);
  94.         DeleteDynamicArray(twoDimArr_2, rows_2, cols_2);
  95.     }
  96.     else if (rows_1 != 1) {
  97.         int **twoDimArr_1 = new int*[rows_1];
  98.         for (int i = 0; i < rows_1; i++) {
  99.             twoDimArr_1[i] = new int[cols_1];
  100.         }
  101. #if BUG_1==1
  102.         AutoFillArray(twoDimArr_1, rows_1, cols_1);
  103.         shawArr(twoDimArr_1, rows_1, cols_1);
  104. #endif
  105. #if BUG_1==0
  106.         std::cout << "Первая матрица: " << std::endl;
  107.         ManuallyFillArray(twoDimArr_1, rows_1, cols_1);
  108. #endif
  109.         int **twoDimArr_2 = new int*[rows_2];
  110.         for (int i = 0; i < rows_2; i++) {
  111.             twoDimArr_2[i] = new int[cols_2];
  112.         }
  113. #if BUG_1==1
  114.         AutoFillArray(twoDimArr_2, rows_2, cols_2);
  115.         shawArr(twoDimArr_2, rows_2, cols_2);
  116. #endif
  117. #if BUG_1==0
  118.         std::cout << "Вторая матрица: " << std::endl;
  119.         ManuallyFillArray(twoDimArr_2, rows_2, cols_2);
  120. #endif
  121.         MultArray(twoDimArr_1, twoDimArr_2, rows_1, cols_1, rows_2, cols_2);
  122.         DeleteDynamicArray(twoDimArr_1, rows_1, cols_1);
  123.         DeleteDynamicArray(twoDimArr_2, rows_2, cols_2);
  124.     }
  125.     return 0;
  126. }
  127. void swap(int &i_1, int &j_1, int &i_2, int &j_2) {
  128.     int temp_1, temp_2;
  129.     temp_1 = i_1;
  130.     temp_2 = j_1;
  131.     i_1 = i_2;
  132.     j_1 = j_2;
  133.     i_2 = temp_1;
  134.     j_2 = temp_2;
  135. }
  136. void AutoFillArray(int *arroneDimArr, const int size) {
  137.     for (int i = 0; i < size; i++) {
  138.         arroneDimArr[i] = 1 + rand() % (size * 2);
  139.     }
  140.     for (int i = 0; i < size; i++) {
  141.         for (int j = 0; j < size; j++) {
  142.             if (i == j) {
  143.                 continue;
  144.             }
  145.             if (arroneDimArr[i] == arroneDimArr[j]) {
  146.                 arroneDimArr[i] = 1 + rand() % (size * 2);
  147.                 i = -1;
  148.                 break;
  149.             }
  150.         }
  151.     }
  152. }
  153. void AutoFillArray(int **arrtwoDimArr, const int rows, const int cols) {
  154.     for (int i = 0; i < rows; i++) {
  155.         for (int j = 0; j < cols; j++) {
  156.             arrtwoDimArr[i][j] = 1 + rand() % (cols*rows * 2);
  157.         }
  158.     }
  159.     for (int i = 0; i < rows; i++) {
  160.         for (int j = 0; j < cols; j++) {
  161.             for (int k = 0; k < rows; k++) {
  162.                 for (int l = 0; l < cols; l++) {
  163.                     if (i == k && j == l) {
  164.                         continue;
  165.                     }
  166.                     if (arrtwoDimArr[k][l] == arrtwoDimArr[i][j]) {
  167.                         arrtwoDimArr[i][j] = 1 + rand() % (cols*rows * 2);
  168.                         k = -1;
  169.                         break;
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
  175. }
  176. void ManuallyFillArray(int *arrtwoDimArr, const int size) {
  177.     char answer; int i;
  178.     for (i = 0; i < size; i++) {
  179.         std::cout << "Введите " << i + 1 << " элемент матрицы: ";
  180.         std::cin >> arrtwoDimArr[i];
  181.     }
  182.     std::cout << "Проверьте правильность ввода матрицы" << std::endl;
  183.     while (true) {
  184.         for (i = 0; i < size; i++) {
  185.             std::cout << arrtwoDimArr[i] << "\t";
  186.         }
  187.         std::cout << "\nВсе верно?(y/n) ";
  188.         std::cin >> answer;
  189.         if (answer != 'y' && answer != 'n') {
  190.             std::cout << "Вы не ответили" << std::endl;
  191.             continue;
  192.         }
  193.         else if (answer == 'n') {
  194.             std::cout << "Какой элемент матрицы изменить?" << std::endl;
  195.             std::cout << "Введите номер стобца матрицы: ";
  196.             std::cin >> i;
  197.             std::cout << "Введите новое значение элемента " << i + 1 << " матрицы: ";
  198.             std::cin >> arrtwoDimArr[i - 1];
  199.             continue;
  200.         }
  201.         else {
  202.             break;
  203.         }
  204.     }
  205. }
  206. void ManuallyFillArray(int **arrtwoDimArr, const int rows, const int cols) {
  207.     char answer; int i, j;
  208.     for (i = 0; i < rows; i++) {
  209.         for (j = 0; j < cols; j++) {
  210.             std::cout << "Введите " << i + 1 << ", " << j + 1 << " элемент матрицы: ";
  211.             std::cin >> arrtwoDimArr[i][j];
  212.         }
  213.     }
  214.     std::cout << "Проверьте правильность ввода матрицы" << std::endl;
  215.     while (true) {
  216.         for (i = 0; i < rows; i++) {
  217.             for (j = 0; j < cols; j++) {
  218.                 std::cout << arrtwoDimArr[i][j] << "\t";
  219.             }
  220.             std::cout << std::endl;
  221.         }
  222.         std::cout << "Все верно?(y/n) ";
  223.         std::cin >> answer;
  224.         if (answer != 'y' && answer != 'n') {
  225.             std::cout << "Вы не ответили" << std::endl;
  226.             continue;
  227.         }
  228.         else if (answer == 'n') {
  229.             std::cout << "Какой элемент матрицы изменить?" << std::endl;
  230.             std::cout << "Введите номер строки матрицы: ";
  231.             std::cin >> i;
  232.             std::cout << "Введите номер столбца матрицы: ";
  233.             std::cin >> j;
  234.             std::cout << "Введите новое значение элемента " << i << ", " << j << " матрицы: ";
  235.             std::cin >> arrtwoDimArr[i - 1][j - 1];
  236.             continue;
  237.         }
  238.         else {
  239.             break;
  240.         }
  241.     }
  242. }
  243. void MultArray(int *arroneDimArr, const int size, int **arrtwoDimArr, const int rows, const int cols) {
  244.     int temp = 0;
  245.     int *multArr = new int[cols];
  246.     for (int j = 0; j < cols; j++) {
  247.         for (int m = 0, i = 0; m < size, i < rows; m++, i++) {
  248.             temp += arroneDimArr[i] * arrtwoDimArr[i][j];
  249.         }
  250.         multArr[j] = temp;
  251.         temp = 0;
  252.     }
  253.     std::cout << "Результат умножения матрицы 1 на матрицу 2: " << std::endl;
  254.     for (int i = 0; i < cols; i++) {
  255.         std::cout << multArr[i] << "\t";
  256.     }
  257.     std::cout << std::endl;
  258.     DeleteDynamicArray(multArr);
  259. }
  260. void MultArray(int **arrtwoDimArr_1, int **arrtwoDimArr_2, const int rows_1, const int cols_1, const int rows_2, const int cols_2) {
  261.     int temp = 0;
  262.     int **multArr = new int*[rows_1];
  263.     for (int i = 0; i < rows_1; i++) {
  264.         multArr[i] = new int[cols_2];
  265.     }
  266.     for (int i = 0; i < rows_1; i++) {
  267.         for (int l = 0; l < cols_2; l++) {
  268.             for (int j = 0, m = 0; j < rows_2, m < cols_1; j++, m++) {
  269.                 temp += arrtwoDimArr_1[i][m] * arrtwoDimArr_2[j][l];
  270.             }
  271.             multArr[i][l] = temp;
  272.             temp = 0;
  273.         }
  274.     }
  275.     std::cout << "Результат умножения матрицы 1 на матрицу 2: " << std::endl;
  276.     for (int i = 0; i < rows_1; i++) {
  277.         for (int j = 0; j < cols_2; j++) {
  278.             std::cout << multArr[i][j] << "\t";
  279.         }
  280.         std::cout << std::endl;
  281.     }
  282.     DeleteDynamicArray(multArr, rows_1, cols_2);
  283. }
  284. void shawArr(int* oneDimArr, const int size) {
  285.     for (int i = 0; i < size; i++) {
  286.         std::cout << oneDimArr[i] << "\t";
  287.     }
  288. #if BUG_1==1
  289.     std::cout << "\nСумма " << size << " элементов массива равна " << sumArrVals(oneDimArr, size) << std::endl;
  290. #endif
  291. }
  292. void shawArr(int** twoDimArr, const int rows, const int cols) {
  293.     for (int i = 0; i < rows; i++) {
  294.         for (int j = 0; j < cols; j++) {
  295.             std::cout << twoDimArr[i][j] << "\t";
  296.         }
  297.         std::cout << std::endl;
  298.     }
  299. #if BUG_1==1
  300.     std::cout << "Сумма элементов массива " << rows << " x " << cols << " равна " << sumArrVals(twoDimArr, rows, cols) << std::endl;
  301. #endif
  302. }
  303. int sumArrVals(int* oneDimArr, const int size) {
  304.     int val = 0;
  305.     for (int i = 0; i < size; i++) {
  306.         val = val + oneDimArr[i];
  307.     }
  308.     return val;
  309. }
  310. int sumArrVals(int** twoDimArr, const int rows, const int cols) {
  311.     int val = 0;
  312.     for (int i = 0; i < rows; i++) {
  313.         for (int j = 0; j < cols; j++) {
  314.             val = val + twoDimArr[i][j];
  315.         }
  316.     }
  317.     return val;
  318. }
Advertisement
Add Comment
Please, Sign In to add comment