Загрузка данных


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

void free_matrix(int **matrix, int n) {
    if (matrix) {
        for (int i = 0; i < n; i++)
            free(matrix[i]);
        free(matrix);
    }
}

int **create_matrix(int n, int m) {
    int **matrix = malloc(n * sizeof(int *));
    if (!matrix)
        return NULL;

    for (int i = 0; i < n; i++) {
        matrix[i] = malloc(m * sizeof(int));
        if (!matrix[i]) {
            free_matrix(matrix, i);
            return NULL;
        }
    }

    return matrix;
}

int input_matrix(int ***matrix, int *n, int *m) {
    if (scanf("%d%d", n, m) != 2 || *n <= 0 || *m <= 0)
        return 0;

    *matrix = create_matrix(*n, *m);
    if (!(*matrix))
        return 0;

    for (int i = 0; i < *n; i++) {
        for (int j = 0; j < *m; j++) {
            if (scanf("%d", &(*matrix)[i][j]) != 1) {
                free_matrix(*matrix, *n);
                return 0;
            }
        }
    }

    return 1;
}

void print_matrix(int **matrix, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j)
                printf(" ");
            printf("%d", matrix[i][j]);
        }
        if (i != n - 1)
            printf("\n");
    }
}

int main() {
    int op;

    if (scanf("%d", &op) != 1) {
        printf("n/a");
        return 0;
    }

    if (op == 1) {
        int **a, **b;
        int n1, m1, n2, m2;

        if (!input_matrix(&a, &n1, &m1) ||
            !input_matrix(&b, &n2, &m2) ||
            n1 != n2 || m1 != m2) {
            printf("n/a");
            return 0;
        }

        int **r = create_matrix(n1, m1);

        for (int i = 0; i < n1; i++)
            for (int j = 0; j < m1; j++)
                r[i][j] = a[i][j] + b[i][j];

        print_matrix(r, n1, m1);

        free_matrix(a, n1);
        free_matrix(b, n2);
        free_matrix(r, n1);
    } else if (op == 2) {
        int **a, **b;
        int n1, m1, n2, m2;

        if (!input_matrix(&a, &n1, &m1) ||
            !input_matrix(&b, &n2, &m2) ||
            m1 != n2) {
            printf("n/a");
            return 0;
        }

        int **r = create_matrix(n1, m2);

        for (int i = 0; i < n1; i++) {
            for (int j = 0; j < m2; j++) {
                r[i][j] = 0;
                for (int k = 0; k < m1; k++)
                    r[i][j] += a[i][k] * b[k][j];
            }
        }

        print_matrix(r, n1, m2);

        free_matrix(a, n1);
        free_matrix(b, n2);
        free_matrix(r, n1);
    } else if (op == 3) {
        int **a;
        int n, m;

        if (!input_matrix(&a, &n, &m)) {
            printf("n/a");
            return 0;
        }

        int **r = create_matrix(m, n);

        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                r[j][i] = a[i][j];

        print_matrix(r, m, n);

        free_matrix(a, n);
        free_matrix(r, m);
    } else {
        printf("n/a");
    }

    return 0;
}