#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//PROTOTIPOS
void gerarMatriz(int tam, int mat[tam][tam]);
void mostraMatriz(int tam, int mat[tam][tam]);
int somaDiagonalPrincipal(int tam, int mat[tam][tam]);
void mostraVetor(int vet[], int tam);
void somaLinhas(int tam, int mat[tam][tam], int vet[]);
void somaColunas(int tam, int mat[tam][tam], int vet[]);
int testaIgualVetor(int vet[], int tam);
//MAIN
int main() {
int n;
scanf("%i", &n);
int mat[n][n];
gerarMatriz(n, mat);
mostraMatriz(n, mat);
srand=(time(NULL));
int somaDP = 0;
somaDP = somaDiagonalPrincipal(n,mat);
//soma linhas
int vetL[n];
somaLinhas(n, mat, vetL);
printf("\nSoma das linhas: ");
mostraVetor(vetL, n);
//soma colunas
int vetC[n];
somaColunas(n, mat, vetC);
printf("\nSoma das colunas: ");
mostraVetor(vetC, n);
printf("\nSoma diagonal principal %i\n", somaDP);
int testaL, testaC;
testaL = testaIgualVetor(vetL, n);
testaC = testaIgualVetor(vetC, n);
if (testaL && testaC && somaDP && somaDP == vetL[0]) {
printf("Matriz Magica");
} else {
printf("Matriz não Magica");
}
return 0;
}
//FUNCOES
void gerarMatriz(int tam, int mat[tam][tam]) {
int i, j;
for (i = 0; i < tam; i++) {
for (j = 0; j < tam; j++) {
mat[i][j]= (rand()% tam)+1;
}
}
}
void mostraMatriz(int tam, int mat[tam][tam]) {
int i, j;
for (i = 0; i < tam; i++) {
for (j = 0; j < tam; j++) {
printf("%i ", mat[i][j]);
}
printf("| \n");
}
}
int somaDiagonalPrincipal(int tam, int mat[tam][tam]) {
int i, soma = 0;
for (i = 0; i < tam; i++) {
soma += mat[i][i];
}
return soma;
}
void mostraVetor(int vet[], int tam) {
int i;
for (i = 0; i < tam; i++) {
printf("%i ", vet[i]);
}
}
void somaLinhas(int tam, int mat[tam][tam], int vet[]) {
int i, j;
for (i = 0; i < tam; i++) {
vet[i] = 0;
for (j = 0; j < tam; j++) {
vet[i] += mat[i][j];
}
}
}
void somaColunas(int tam, int mat[tam][tam], int vet[]) {
int i, j;
for (j = 0; j < tam; j++) {
vet[j] = 0;
for (i = 0; i < tam; i++) {
vet[j] += mat[i][j];
}
}
}
int testaIgualVetor(int vet[], int tam) {
int i;
for (i = 1; i < tam; i++) {
if (vet[i] != vet[i-1]) {
return 0;
}
}
return 1;
}