c语言——求矩阵的运算

img

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef struct
{
    int *data;
    int n;
} SquareMatrix;

SquareMatrix *create(int n)
{
    assert(n >= 1);
    SquareMatrix *matrix = (SquareMatrix *)malloc(sizeof(SquareMatrix));
    matrix->data = (int *)malloc(n * n * sizeof(int));
    matrix->n = n;
    return matrix;
}

void destroy(SquareMatrix *matrix)
{
    free(matrix->data);
    free(matrix);
}

void input(SquareMatrix *matrix)
{
    int n = matrix->n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &matrix->data[i * n + j]);
}

void print(const SquareMatrix *matrix)
{
    int n = matrix->n;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%5d", matrix->data[i * n + j]);
        printf("\n");
    }
}

// matrix1 += matirx2
void add(SquareMatrix *matrix1, const SquareMatrix *matrix2)
{
    assert(matrix1->n == matrix2->n);
    int n = matrix1->n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            matrix1->data[i * n + j] += matrix2->data[i * n + j];
}

// matrix1 -= matrix2
void subtract(SquareMatrix *matrix1, const SquareMatrix *matrix2)
{
    assert(matrix1->n == matrix2->n);
    int n = matrix1->n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            matrix1->data[i * n + j] -= matrix2->data[i * n + j];
}

int main()
{
    int n;
    scanf("%d", &n);
    SquareMatrix *matrix1 = create(n);
    SquareMatrix *matrix2 = create(n);
    input(matrix1);
    while (1)
    {
        char op;
        scanf(" %c", &op);
        if (op == '#')
        {
            print(matrix1);
            break;
        }
        input(matrix2);
        if (op == '+')
            add(matrix1, matrix2);
        else if (op == '-')
            subtract(matrix1, matrix2);
    }
    destroy(matrix1);
    destroy(matrix2);
    return 0;
}
$ gcc -Wall main.c
$ ./a.out
3
1 -2 7
2 8 -5
3 6 9
+
3 5 7
-1 2 6
3 7 10
-
1 -2 7
2 8 -5
3 6 9
#
    3    5    7
   -1    2    6
    3    7   10