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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct TMatrix
{
  int* array;
 
  size_t rowCount;
  size_t colCount;
}* MATRIX_HANDLE;
 
enum
{
  no_error,
  error_invalid_handle,
  error_invalid_argument,
  error_mem_alloc,
  error_index_out_of_bounds
};
 
int CreateMatrix(MATRIX_HANDLE* hMatrixPtr, const size_t M, const size_t N)
{
  int errorCode = no_error;
 
  if ((hMatrixPtr == NULL) || (M == 0) || (N == 0))
  {
    errorCode = error_invalid_argument;
  }
  else
  {
    *hMatrixPtr = malloc(sizeof(**hMatrixPtr));
 
    if (*hMatrixPtr != NULL)
    {
      (*hMatrixPtr)->array = malloc(M * N * sizeof(*(*hMatrixPtr)->array));
 
      if ((*hMatrixPtr)->array != NULL)
      {
        (*hMatrixPtr)->rowCount = M;
        (*hMatrixPtr)->colCount = N;
      }
      else
      {
        errorCode = error_mem_alloc;
 
        free(*hMatrixPtr);
        *hMatrixPtr = NULL;
      }
    }
    else
    {
      errorCode = error_mem_alloc;
    }
  }
 
  return errorCode;
}
 
void DeleteMatrix(MATRIX_HANDLE* hMatrixPtr)
{
  if (hMatrixPtr != NULL)
  {
    free((*hMatrixPtr)->array);
    free(*hMatrixPtr);
  }
}
 
int SetValue(MATRIX_HANDLE hMatrix, const size_t i, const size_t j, const int value)
{
  int errorCode = no_error;
 
  if (hMatrix == NULL)
  {
    errorCode = error_invalid_handle;
  }
  else
  {
    if ((i > hMatrix->rowCount - 1) || (j > hMatrix->colCount - 1))
    {
      errorCode = error_index_out_of_bounds;
    }
    else
    {
      hMatrix->array[i * hMatrix->colCount + j] = value;
    }
  }
 
  return errorCode;
}
 
int GetValue(MATRIX_HANDLE hMatrix, const size_t i, const size_t j, int* valuePtr)
{
  int errorCode = no_error;
 
  if (hMatrix == NULL)
  {
    errorCode = error_invalid_handle;
  }
  else if (valuePtr == NULL)
  {
    errorCode = error_invalid_argument;
  }
  else
  {
    if ((i > hMatrix->rowCount - 1) || (j > hMatrix->colCount - 1))
    {
      errorCode = error_index_out_of_bounds;
    }
    else
    {
       *valuePtr = hMatrix->array[i * hMatrix->colCount + j];
    }
  }
 
  return errorCode;
}
 
int Multiply(MATRIX_HANDLE A, MATRIX_HANDLE B, MATRIX_HANDLE* hResultMatrixPtr)
{
  int errorCode = no_error;
  int a, b, sum;
 
  size_t i, j, k;
 
  if ((A == NULL) || (B == NULL))
  {
    errorCode = error_invalid_handle;
  }
  else if ((hResultMatrixPtr == NULL) || (A->colCount != B->rowCount))
  {
    errorCode = error_invalid_argument;
  }
  else
  {
    errorCode = CreateMatrix(hResultMatrixPtr, A->rowCount, B->colCount);
 
    if (errorCode == no_error)
    {
      for (i = 0; i < (*hResultMatrixPtr)->rowCount; i++)
      {
        for (j = 0; j < (*hResultMatrixPtr)->colCount; j++)
        {
          sum = 0;
          for (k = 0; k < A->colCount; k++)
          {
            GetValue(A, i, k, &a);
            GetValue(B, k, j, &b);
 
            sum = sum + a * b;
          }
 
          SetValue(*hResultMatrixPtr, i, j, sum);
        }
      }
    }
  }
 
  return errorCode;
}
 
void PrintMatrix(MATRIX_HANDLE hMatrix, const char* name)
{
  size_t i, j;
 
  int value;
 
  printf("------ Matrix '%s' ------\n", name);
  for (i = 0; i < hMatrix->rowCount; i++)
  {
    for (j = 0; j < hMatrix->colCount; j++)
    {
      GetValue(hMatrix, i, j, &value);
 
      if (j == hMatrix->colCount - 1) printf("%3d\n", value);
      else printf("%3d ", value);
    }
  }
  printf("-------------------------\n\n", name);
}
 
int main(void)
{
  MATRIX_HANDLE a, b, c;
 
  CreateMatrix(&a, 2, 3);
  CreateMatrix(&b, 3, 2);
 
  SetValue(a, 0, 0, 0);
  SetValue(a, 0, 1, 1);
  SetValue(a, 0, 2, 2);
  SetValue(a, 1, 0, 0);
  SetValue(a, 1, 1, 1);
  SetValue(a, 1, 2, 1);
 
  SetValue(b, 0, 0, 0);
  SetValue(b, 0, 1, 1);
  SetValue(b, 1, 0, 2);
  SetValue(b, 1, 1, 0);
  SetValue(b, 2, 0, 1);
  SetValue(b, 2, 1, 1);
 
  PrintMatrix(a, "A");
  PrintMatrix(b, "B");
 
  Multiply(a, b, &c);
 
  PrintMatrix(c, "C");
 
  DeleteMatrix(&a);
  DeleteMatrix(&b);
  DeleteMatrix(&c);
 
  return 0;
}

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

Этот код является реализацией функций для работы с матрицами в языке 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
Похожие ответы