Advertisement
Toliak

code)

Apr 16th, 2019
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.49 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <stdlib.h>
  7.  
  8. int Create_Matrix(int*** m, int h, int l)
  9. {
  10.     int i;
  11.     *m = (int**)malloc(h * sizeof(int*));       // Выделение памяти под массив указателей размера h
  12.  
  13.     for (i = 0; i < h; i++)
  14.     {
  15.         (*m)[i] = (int*)malloc(l * sizeof(int));        // Выделение памяти под массив int размера l
  16.     }
  17.  
  18.     return 0;
  19. }
  20.  
  21. int Input_Matrix(int** m, int h, int l)
  22. {
  23.     // Вывод (для красоты)
  24.     printf("\nEnter matrix %d x %d:\n", h, l);
  25.  
  26.     int i, j;
  27.  
  28.     for (j = 0; j < h; j++)
  29.     {
  30.         for (i = 0; i < l; i++)
  31.         {
  32.             scanf("%d", &m[j][i]);
  33.         }
  34.     }
  35.  
  36.     return 0;
  37. }
  38.  
  39. // Размер первой матрицы: h1, l1
  40. // Размер второй матрицы: h2, l2
  41. // Размер результата: h1, l2
  42. // Ожидается, что l1 == h2, иначе матрицы невозможно перемножить
  43. int Multiply_Matrix(int** m1, int** m2, int** mr, int h1, int l1, int h2, int l2)
  44. {
  45.     if (l1 != h2)
  46.     {
  47.         return -1; // Что-то вроде ошибки
  48.     }
  49.  
  50.     int i, j, k;
  51.  
  52.     // Инициализация массива нулями
  53.     for (j = 0; j < h1; j++) {
  54.         for (i = 0; i < l2; i++) {
  55.             mr[j][i] = 0;
  56.         }
  57.     }
  58.  
  59.     // j - строка, i - столбец в результирующей матрице
  60.     // k - номер слагаемого ( R_ji = A_j0 * B_0i + A_j1 * B_1i + ... + A_jk * B_1k + ... + A_jn * B_1n)
  61.     for (j = 0; j < h1; j++)
  62.     {
  63.         for (i = 0; i < l2; i++)
  64.         {
  65.             for (k = 0; k < l1; k++)
  66.             {
  67.                 mr[j][i] += m1[j][k] * m2[k][i];
  68.             }
  69.         }
  70.     }
  71.  
  72.     return 0;
  73. }
  74.  
  75. int Output_Matrix(int** m, int h, int l)
  76. {
  77.     // Вывод (для красоты)
  78.     printf("\nResult matrix %d x %d:\n", h, l);
  79.  
  80.     int i, j;
  81.     for (j = 0; j < h; j++)
  82.     {
  83.         for (i = 0; i < l; i++)
  84.         {
  85.             printf("%d ", m[j][i]);
  86.         }
  87.         printf("\n");
  88.     }
  89.  
  90.     return 0;
  91. }
  92.  
  93. // Интересует двумерный массив и количество строк
  94. int Delete_matrix(int** m, int h)
  95. {
  96.     int i;
  97.  
  98.     // Сначала очищаем память, выделенную под строки
  99.     for (i = 0; i < h; i++)
  100.     {
  101.         free(m[i]);
  102.     }
  103.  
  104.     // Теперь очищаем память, выделенную под массив указателей
  105.     free(m);
  106. }
  107.  
  108. int main()
  109. {
  110.     int** m1 = NULL;
  111.     int** m2 = NULL;
  112.     int** mr = NULL;
  113.  
  114.     // h - количество строк
  115.     // l - количество столбцов
  116.     int l1, h1, l2, h2;
  117.  
  118.     printf("Enter left matrix size (rows, columns): ");
  119.     scanf("%d %d", &h1, &l1);
  120.  
  121.     printf("Enter right matrix size (rows, columns): ");
  122.     scanf("%d %d", &h2, &l2);
  123.  
  124.     Create_Matrix(&m1, h1, l1);
  125.     Create_Matrix(&m2, h2, l2);
  126.     Create_Matrix(&mr, h1, l2); // Потому что при A*B (где размеры A и B равны m x n и n x h) размер результата: m x h
  127.  
  128.     Input_Matrix(m1, h1, l1);
  129.     Input_Matrix(m2, h2, l2);
  130.  
  131.     Multiply_Matrix(m1, m2, mr, h1, l1, h2, l2);
  132.  
  133.     Output_Matrix(mr, h1, l2);
  134.  
  135.     Delete_matrix(m1, h1);
  136.     Delete_matrix(m2, h2);
  137.     Delete_matrix(mr, h1);
  138.  
  139.     _getch();
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement