
#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