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

int main()
{
    // Zona de variables
    int longitud; // Tamaño de las matrices
    int **matrizA, **matrizB, **matrizC;
    int numero;

    // Establecer locale a UTF-8
    setlocale(LC_ALL, ".UTF-8");

    // Cambia la consola a UTF-8 para entrada y salida
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    // Limpieza de pantalla
    system("cls");

    // Grueso del programa
    printf("SUMA DE MATRICES\n");
    printf("\nDetermine la longitud de las matrices: ");
    scanf("%d", &longitud);
    while (getchar() != '\n')
        ; // Limpieza de buffer
    do
    {
        if (longitud <= 1)
        {
            printf("\nLa longitud de las matrices no puede ser igual o inferior a 1. Determine la longitud de las matrices: ");
            scanf("%d", &longitud);
            while (getchar() != '\n')
                ; // Limpieza de buffer
        }
    } while (longitud <= 1);
    // Asignación dinámica de memoria para las matrices (filas)
    matrizA = (int **)malloc(longitud * sizeof(int *));
    matrizB = (int **)malloc(longitud * sizeof(int *));
    matrizC = (int **)malloc(longitud * sizeof(int *));

    // Comprobamos si la asignación de memoria fue exitosa
    if (matrizA == NULL || matrizB == NULL || matrizC == NULL)
    {
        printf("Error al asignar memoria.\n");
        return 1; // Salir si la memoria no se asignó correctamente
    }

    // Asignación dinámica para las columnas de cada fila
    for (int i = 0; i < longitud; i++)
    {
        matrizA[i] = (int *)malloc(longitud * sizeof(int));
        matrizB[i] = (int *)malloc(longitud * sizeof(int));
        matrizC[i] = (int *)malloc(longitud * sizeof(int));

        // Verificamos la asignación de memoria para cada fila
        if (matrizA[i] == NULL || matrizB[i] == NULL || matrizC[i] == NULL)
        {
            printf("Error al asignar memoria para la fila %d.\n", i);
            return 1;
        }
    }

    // Llenamos la matrizA con datos
    printf("\nPor favor, vaya introduciendo números para la matriz A.");
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            printf("\nIntroduce número para la casilla (%d, %d): ", i, j);
            scanf("%d", &numero);
            while (getchar() != '\n')
                ; // Limpieza de buffer
            matrizA[i][j] = numero;
        }
    }
    // Llenamos la matrizb con datos
    printf("\nPor favor, vaya introduciendo números para la matriz B.");
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            printf("\nIntroduce número para la casilla (%d, %d): ", j, i);
            scanf("%d", &numero);
            while (getchar() != '\n')
                ; // Limpieza de buffer
            matrizB[i][j] = numero;
        }
    }
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            matrizC[i][j] = matrizA[i][j] + matrizB[i][j];
        }
    }
    printf("\nMatriz A:\n");
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            printf(" %d ", matrizA[i][j]);
        }
        printf("\n");
    }
    printf("\nMatriz B:\n");
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            printf(" %d ", matrizB[i][j]);
        }
        printf("\n");
    }
    printf("\nSUMA:\n");
    for (int i = 0; i < longitud; i++)
    {
        for (int j = 0; j < longitud; j++)
        {
            printf(" %d ", matrizC[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");

    // Liberamos la memoria (importante para evitar fugas de memoria)
    for (int i = 0; i < longitud; i++)
    {
        free(matrizA[i]);
        free(matrizB[i]);
        free(matrizC[i]);
    }
    free(matrizA);
    free(matrizB);
    free(matrizC);
}