Найти произведение матриц A и B - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Найти C- произведение матриц A и B. Матрицы описать как одномерные массивы

Решение задачи: «Найти произведение матриц A и B»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct TMatrix
  5. {
  6.   int* array;
  7.  
  8.   size_t rowCount;
  9.   size_t colCount;
  10. }* MATRIX_HANDLE;
  11.  
  12. enum
  13. {
  14.   no_error,
  15.   error_invalid_handle,
  16.   error_invalid_argument,
  17.   error_mem_alloc,
  18.   error_index_out_of_bounds
  19. };
  20.  
  21. int CreateMatrix(MATRIX_HANDLE* hMatrixPtr, const size_t M, const size_t N)
  22. {
  23.   int errorCode = no_error;
  24.  
  25.   if ((hMatrixPtr == NULL) || (M == 0) || (N == 0))
  26.   {
  27.     errorCode = error_invalid_argument;
  28.   }
  29.   else
  30.   {
  31.     *hMatrixPtr = malloc(sizeof(**hMatrixPtr));
  32.  
  33.     if (*hMatrixPtr != NULL)
  34.     {
  35.       (*hMatrixPtr)->array = malloc(M * N * sizeof(*(*hMatrixPtr)->array));
  36.  
  37.       if ((*hMatrixPtr)->array != NULL)
  38.       {
  39.         (*hMatrixPtr)->rowCount = M;
  40.         (*hMatrixPtr)->colCount = N;
  41.       }
  42.       else
  43.       {
  44.         errorCode = error_mem_alloc;
  45.  
  46.         free(*hMatrixPtr);
  47.         *hMatrixPtr = NULL;
  48.       }
  49.     }
  50.     else
  51.     {
  52.       errorCode = error_mem_alloc;
  53.     }
  54.   }
  55.  
  56.   return errorCode;
  57. }
  58.  
  59. void DeleteMatrix(MATRIX_HANDLE* hMatrixPtr)
  60. {
  61.   if (hMatrixPtr != NULL)
  62.   {
  63.     free((*hMatrixPtr)->array);
  64.     free(*hMatrixPtr);
  65.   }
  66. }
  67.  
  68. int SetValue(MATRIX_HANDLE hMatrix, const size_t i, const size_t j, const int value)
  69. {
  70.   int errorCode = no_error;
  71.  
  72.   if (hMatrix == NULL)
  73.   {
  74.     errorCode = error_invalid_handle;
  75.   }
  76.   else
  77.   {
  78.     if ((i > hMatrix->rowCount - 1) || (j > hMatrix->colCount - 1))
  79.     {
  80.       errorCode = error_index_out_of_bounds;
  81.     }
  82.     else
  83.     {
  84.       hMatrix->array[i * hMatrix->colCount + j] = value;
  85.     }
  86.   }
  87.  
  88.   return errorCode;
  89. }
  90.  
  91. int GetValue(MATRIX_HANDLE hMatrix, const size_t i, const size_t j, int* valuePtr)
  92. {
  93.   int errorCode = no_error;
  94.  
  95.   if (hMatrix == NULL)
  96.   {
  97.     errorCode = error_invalid_handle;
  98.   }
  99.   else if (valuePtr == NULL)
  100.   {
  101.     errorCode = error_invalid_argument;
  102.   }
  103.   else
  104.   {
  105.     if ((i > hMatrix->rowCount - 1) || (j > hMatrix->colCount - 1))
  106.     {
  107.       errorCode = error_index_out_of_bounds;
  108.     }
  109.     else
  110.     {
  111.        *valuePtr = hMatrix->array[i * hMatrix->colCount + j];
  112.     }
  113.   }
  114.  
  115.   return errorCode;
  116. }
  117.  
  118. int Multiply(MATRIX_HANDLE A, MATRIX_HANDLE B, MATRIX_HANDLE* hResultMatrixPtr)
  119. {
  120.   int errorCode = no_error;
  121.   int a, b, sum;
  122.  
  123.   size_t i, j, k;
  124.  
  125.   if ((A == NULL) || (B == NULL))
  126.   {
  127.     errorCode = error_invalid_handle;
  128.   }
  129.   else if ((hResultMatrixPtr == NULL) || (A->colCount != B->rowCount))
  130.   {
  131.     errorCode = error_invalid_argument;
  132.   }
  133.   else
  134.   {
  135.     errorCode = CreateMatrix(hResultMatrixPtr, A->rowCount, B->colCount);
  136.  
  137.     if (errorCode == no_error)
  138.     {
  139.       for (i = 0; i < (*hResultMatrixPtr)->rowCount; i++)
  140.       {
  141.         for (j = 0; j < (*hResultMatrixPtr)->colCount; j++)
  142.         {
  143.           sum = 0;
  144.           for (k = 0; k < A->colCount; k++)
  145.           {
  146.             GetValue(A, i, k, &a);
  147.             GetValue(B, k, j, &b);
  148.  
  149.             sum = sum + a * b;
  150.           }
  151.  
  152.           SetValue(*hResultMatrixPtr, i, j, sum);
  153.         }
  154.       }
  155.     }
  156.   }
  157.  
  158.   return errorCode;
  159. }
  160.  
  161. void PrintMatrix(MATRIX_HANDLE hMatrix, const char* name)
  162. {
  163.   size_t i, j;
  164.  
  165.   int value;
  166.  
  167.   printf("------ Matrix '%s' ------\n", name);
  168.   for (i = 0; i < hMatrix->rowCount; i++)
  169.   {
  170.     for (j = 0; j < hMatrix->colCount; j++)
  171.     {
  172.       GetValue(hMatrix, i, j, &value);
  173.  
  174.       if (j == hMatrix->colCount - 1) printf("%3d\n", value);
  175.       else printf("%3d ", value);
  176.     }
  177.   }
  178.   printf("-------------------------\n\n", name);
  179. }
  180.  
  181. int main(void)
  182. {
  183.   MATRIX_HANDLE a, b, c;
  184.  
  185.   CreateMatrix(&a, 2, 3);
  186.   CreateMatrix(&b, 3, 2);
  187.  
  188.   SetValue(a, 0, 0, 0);
  189.   SetValue(a, 0, 1, 1);
  190.   SetValue(a, 0, 2, 2);
  191.   SetValue(a, 1, 0, 0);
  192.   SetValue(a, 1, 1, 1);
  193.   SetValue(a, 1, 2, 1);
  194.  
  195.   SetValue(b, 0, 0, 0);
  196.   SetValue(b, 0, 1, 1);
  197.   SetValue(b, 1, 0, 2);
  198.   SetValue(b, 1, 1, 0);
  199.   SetValue(b, 2, 0, 1);
  200.   SetValue(b, 2, 1, 1);
  201.  
  202.   PrintMatrix(a, "A");
  203.   PrintMatrix(b, "B");
  204.  
  205.   Multiply(a, b, &c);
  206.  
  207.   PrintMatrix(c, "C");
  208.  
  209.   DeleteMatrix(&a);
  210.   DeleteMatrix(&b);
  211.   DeleteMatrix(&c);
  212.  
  213.   return 0;
  214. }

Объяснение кода листинга программы

Этот код является реализацией функций для работы с матрицами в языке C. Он содержит функции для создания, удаления, заполнения и печати матриц. Основная функция - Multiply, которая принимает две матрицы и возвращает их произведение. Она проверяет, являются ли матрицы допустимыми для умножения (то есть, количество столбцов первой матрицы равно количеству строк второй), а затем выполняет умножение, используя вложенные циклы. Программа создает две матрицы, A и B, заполняет их значениями, затем вычисляет и печатает их произведение, C. После этого она удаляет все три матрицы. Вот список функций и их номера:

  1. CreateMatrix - 1
  2. DeleteMatrix - 2
  3. SetValue - 3
  4. GetValue - 4
  5. Multiply - 5
  6. PrintMatrix - 6 Список переменных:
  7. hMatrixPtr - указатель на матрицу
  8. M - количество строк матрицы
  9. N - количество столбцов матрицы
  10. a - значение элемента матрицы
  11. b - значение элемента матрицы
  12. c - значение элемента матрицы
  13. i - номер строки
  14. j - номер столбца
  15. k - номер вложенного цикла
  16. errorCode - код ошибки

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы