Então cara, achei aqui nos meus arquivos antigos da faculdade, mas não sei se está completa essa versão que vou mandar aqui. De qualquer forma, pode ajudar bastante =) Ela funciona só para matrizes quadradas (obviamente). /*******************************************/
/* Fabricio Carraro Magalhaes */
/* 03/10/06 */
/* */
/* Lab 8: */
/* Utilizacao de funcoes e matrizes */
/* Programa que determina se uma */
/* matriz quadrada dada é ou não */
/* um quadrado magico. */
/********************************************/
#include <stdio.h> /*Biblioteca*/
#include <stdlib.h>
/*Funcao que faz a leitura da dimensao e dos elementos de uma matriz*/
void leitura(int *n, int matriz[100][100]){
int i, j; /*Declaracao de variaveis*/
printf("Digite a dimensao da matriz quadrada: ");
scanf("%d", n); /*Leitura da dimensao*/
printf("Digite os elementos da matriz:\n");
for(i = 0; i < *n; i++){
for(j = 0; j < *n; j++)
scanf("%d", &matriz[i][j]); /*Leitura dos elementos*/
}
}
/*Funcao que calcula a soma da diagonal principal de uma matriz*/
int diagonalprincipal(int n, int matriz[100][100]){
int i, somapri = 0; /*Declaracao de variaveis*/
for(i = 0; i < n; i++)
somapri += matriz[i][i]; /*Soma da diagonal principal*/
return somapri; /*Retorna o valor encontrado*/
}
/*Funcao que calcula a soma da diagonal secundaria de uma matriz*/
int diagonalsecundaria(int n, int matriz[100][100]){
int i, j, somasec = 0; /*Declaracao de variaveis*/
for(i = 0; i < n; i++){
for(j = n; j > 1; j--)
somasec += matriz[i][j]; /*Soma da diagonal secundaria*/
}
return somasec; /*Retorna o valor encontrado*/
}
/*Funcao que calcula e compara soma da diagonal de uma matriz com...*/
/*...a soma de cada uma de suas linhas, e retorna "1"(um) se for igual*/
int linha(int n, int matriz[100][100], int somadiag){
int i, j = 0, somalin; /*Declaracao de variaveis*/
while (j < n){
somalin = 0;
for(i = 0; i < n; i++)
somalin += matriz[i][j]; /*Soma das linhas*/
if(somalin == somadiag)
j++;
else return -1; /*Retorna "-1" se não for igual*/
}
return 1; /*Retorna "1"(um) se for igual*/
}
/*Funcao que calcula e compara soma da diagonal de uma matriz com...*/
/*...a soma de cada uma de suas colunas, e retorna "1"(um) se for igual*/
int coluna(int n, int matriz[100][100], int somadiag){
int i = 0, j, somacol; /*Declaracao de variaveis*/
while (i < n){
somacol = 0;
for(j = 0; j < n; j++)
somacol += matriz[i][j]; /*Soma das colunas*/
if(somacol == somadiag)
i++;
else return -1; /*Retorna "-1" se não for igual*/
}
return 1; /*Retorna "1"(um) se for igual*/
}
int main(){
int matriz[100][100], n, somadiag; /*Declaracao de variaveis*/
leitura(&n, matriz); /*Chama a funcao que le a matriz*/
somadiag = diagonalprincipal(n, matriz);
if(somadiag == diagonalsecundaria(n, matriz)){
if(linha(n, matriz, somadiag) == 1){ /*Se for "1", ou seja, igual*/
if(coluna(n, matriz, somadiag) == 1) /*Se for "1"*/
printf("é magico!\n");
else printf("não é magico!\n");
}
else printf("não é magico!\n");
}
else printf("não é magico!\n");
system("pause");
return 0;
}