/* * Quadrado Mágico */ #include #define LIM 100 /* Limite máximo para a matriz */ /* Função que realiza a leitura de uma matriz */ /* (a dimensão n pode ser menor do que LIM) */ void leitura (int matriz[LIM][LIM], int n) { /* (1.5) */ int i, j; printf ("Elementos da matriz: \n"); for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d", &matriz[i][j]); } /* Função que calcula o número mágico M para um determinado inteiro n*/ int numero_magico (int n) { /* (0.5) */ return 0.5 * n * (n*n + 1); } /* Retorna 1 se a soma da diagonal principal é igual a m, ou 0 caso contrário*/ int diagonal_principal (int matriz[LIM][LIM], int n, int m) { /* (1.5) */ int i, s; s = 0; for (i = 0; i < n; i++) s += matriz[i][i]; return s == m; } /* Retorna 1 se a soma da diagonal secundária é igual a m, ou 0 caso contrário */ int diagonal_secundaria (int matriz[LIM][LIM], int n, int m) { /* (1.5) */ int i, s; s = 0; for (i = 0; i < n; i++) s += matriz[i][n-1-i]; return s == m; } /* Retorna 1 se a soma de cada uma das linhas é igual a m, ou 0 caso contrário */ int linhas (int matriz[LIM][LIM], int n, int m) { /* (2.0) */ int i, j, s; for (i = 0; i < n; i++) { s = 0; for (j = 0; j < n; j++) s += matriz[i][j]; if (s != m) return 0; } return 1; } /* Retorna 1 se a soma de cada uma das colunas é igual a m, ou 0 caso contrário */ int colunas (int matriz[LIM][LIM], int n, int m) { /* (2.0) */ int i, j, s; for (j = 0; j < n; j++) { s = 0; for (i = 0; i < n; i++) s += matriz[i][j]; if (s != m) return 0; } return 1; } /* Retorna 1 se a matriz é composta de números distintos entre 1 e n*n, ou 0 caso contrário*/ int numeros_diferentes (int matriz[LIM][LIM], int n) { /* (2.0) */ int cont[LIM*LIM+1]; /* conta o número de ocorrências dos */ int i, j; /* números entre 1 e n*n */ for (i = 0; i <= LIM*LIM; i++) cont[i] = 0; for (i = 0; i < n; i++) for (j = 0; j < n; j++) { if (matriz[i][j] < 1 || matriz[i][j] > LIM*LIM || cont[matriz[i][j]] != 0) return 0; cont[matriz[i][j]]++; } return 1; } int main (void) { int n, m; int matriz[LIM][LIM]; printf ("Dimensão da matriz: "); scanf("%d", &n); leitura (matriz, n); m = numero_magico(n); printf ("Numero magico %d: \n", m); if (diagonal_principal(matriz, n, m) && /* (1.0) */ diagonal_secundaria(matriz, n, m) && linhas(matriz, n, m) && colunas(matriz, n, m) && numeros_diferentes(matriz, n)) printf ("A matriz é um quadrado mágico\n"); else printf ("A matriz não é um quadrado mágico\n"); }