Найти произведение матриц 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. После этого она удаляет все три матрицы. Вот список функций и их номера:
- CreateMatrix - 1
- DeleteMatrix - 2
- SetValue - 3
- GetValue - 4
- Multiply - 5
- PrintMatrix - 6 Список переменных:
- hMatrixPtr - указатель на матрицу
- M - количество строк матрицы
- N - количество столбцов матрицы
- a - значение элемента матрицы
- b - значение элемента матрицы
- c - значение элемента матрицы
- i - номер строки
- j - номер столбца
- k - номер вложенного цикла
- errorCode - код ошибки