Перемножение двух матриц - C (СИ) (76858)

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

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

Для заданных матриц и найти Программу на Си желательно с комментарием ... хочется понять и разобраться для усвоения материала..

Решение задачи: «Перемножение двух матриц»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
 
double **multiply_matrices(double **dest, size_t dest_rows, size_t dest_cols,
                           double **mat1, size_t mat1_rows, size_t mat1_cols,
                           double **mat2, size_t mat2_rows, size_t mat2_cols)
{
    size_t i, j, k;
    
    if(mat1_cols != mat2_rows ||
       dest_rows != mat1_rows ||
       dest_cols != mat2_cols)
        return NULL;
 
    for(i = 0; i < mat1_rows; ++i)
    {
        for(j = 0; j < mat2_cols; ++j)
        {
            double sum = 0;
 
            for(k = 0; k < mat1_cols; ++k)
                sum += mat1[i][k] * mat2[k][j];
 
            dest[i][j] = sum;
        }
    }
 
    return dest;
}
 
double **scale_matrix(double coeff,
                      double **dest, size_t dest_rows, size_t dest_cols,
                      double **mat, size_t mat_rows, size_t mat_cols)
{
    size_t i, j;
 
    if(dest_rows != mat_rows ||
       dest_cols != mat_cols)
        return NULL;
 
    for(i = 0; i < dest_rows; ++i)
        for(j = 0; j < mat_rows; ++j)
            dest[i][j] = mat[i][j] * coeff;
 
    return dest;
}
 
double **allocate_matrix(size_t rows, size_t cols)
{
    size_t i;
    double **matrix = malloc(rows * sizeof *matrix);
 
    if(matrix == NULL)
        return NULL;
 
    for(i = 0; i < rows; ++i)
    {
        matrix[i] = malloc(cols * sizeof **matrix);
 
        if(matrix[i] == NULL)
        {
            free(matrix);
            return NULL;
        }
    }
    
    return matrix;
}
 
int read_matrix(const char *prompt, double **matrix, size_t rows, size_t cols)
{
    size_t i, j;
 
    for(i = 0; i < rows; ++i)
    {
        for(j = 0; j < cols; ++j)
        {
            printf("%s", prompt);
            fflush(stdout);
 
            if(scanf("%lf", &matrix[i][j]) != 1)
                return 0;
        }
    }
 
    return 1;
}
 
void handle_error(const char *message)
{
    fprintf(stderr, "ERROR: %s\n", message);
    exit(EXIT_FAILURE);
}
 
void deallocate_matrix(double **matrix, size_t rows)
{
    size_t i;
    for(i = 0; i < rows; ++i)
        free(matrix[i]);
    free(matrix);
}
 
int main(void)
{
    size_t n, i, j;
    double **a, **b, **interm;
 
    printf("Enter the order of square matrices: ");
    fflush(stdout);
 
    if(scanf("%u", &n) != 1)
        handle_error(strerror(errno));
 
    if((a = allocate_matrix(n, n)) == NULL ||
       (b = allocate_matrix(n, n)) == NULL ||
       (interm = allocate_matrix(n, n)) == NULL)
        handle_error(strerror(errno));
 
    puts("Enter the matrices A and B:");
    
    if(read_matrix("A>>> ", a, n, n) == 0 ||
       read_matrix("B>>> ", b, n, n) == 0)
        handle_error(strerror(errno));
 
    if(multiply_matrices(interm, n, n,
                         b, n, n,
                         b, n, n) == NULL)
        handle_error("Nonconformant matrix dimensions");
 
    if(multiply_matrices(b, n, n,
                         a, n, n,
                         interm, n, n) == NULL)
        handle_error("Nonconformant matrix dimensions");
 
    if(scale_matrix(.5, b, n, n, b, n, n) == NULL)
        handle_error("Nonconformant matrix dimensions");
 
    puts("Result:");
    
    for(i = 0; i < n; ++i)
    {
        for(j = 0; j < n; ++j)
            printf("%+8.3f", b[i][j]);
        putchar('\n');
    }
                
    deallocate_matrix(a, n);
    deallocate_matrix(b, n);
    deallocate_matrix(interm, n);
    
    exit(EXIT_SUCCESS);
}

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

Этот код реализует функцию для перемножения двух матриц и функцию для масштабирования матрицы. Также в нём есть функции для чтения матрицы с консоли, для выделения памяти под матрицу и для освобождения памяти. В функции main создаются матрицы, заполняются их значениями, затем происходит перемножение матриц и масштабирование матрицы. Результат выводится на экран. Если при выполнении этих действий происходит ошибка, код выводит сообщение об ошибке и завершает работу.

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


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

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

11   голосов , оценка 4.273 из 5
Похожие ответы