Найти произведение матриц 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 - код ошибки
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д