/*
** quadrato_magico.c
**
** Genera in modo casuale una matrice quadrata di dimensione n
** e verifica se e` un quadrato magico.
**
** Marco Liverani (liverani@mat.uniroma3.it) - Febbraio 1999
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_N 10
/*
** genera
**
** assegna in modo random i valori alla sotto-matrice
** quadrata di ordine n.
*/
int genera(int *m) {
int n, i, j;
srand((unsigned) time(NULL));
n = rand() % (MAX_N-2) + 2;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
*(m+i*MAX_N+j) = rand() % 100;
}
}
return(n);
}
/*
** stampa_matrice
**
** visualizza la matrice in output.
*/
void stampa_matrice(int *m, int n) {
int i, j;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("%3d", *(m+i*MAX_N+j));
}
printf("\n");
}
return;
}
/*
** verifica
**
** verifica se la matrice e` un quadrato magico: appena
** trova una riga o una colonna o una diagonale con una
** somma diversa esce dalla funzione.
*/
int verifica(int *m, int n) {
int i, j, r, s, somma;
r = 1;
somma = 0;
for (j=0; j<n; j++) {
somma = somma + *(m+j);
}
/* controllo le righe */
i = 1;
while (i<n && r==1) {
s = 0;
for (j=0; j<n; j++) {
s = s + *(m+i*MAX_N+j);
}
if (s != somma) {
r = 0;
}
i++;
}
/* controllo le colonne */
j = 0;
while (j<n && r==1) {
s = 0;
for (i=0; i<n; i++) {
s = s + *(m+i*MAX_N+j);
}
if (s != somma) {
r = 0;
}
j++;
}
/* controllo la prima diagonale */
s = 0;
i = 0;
while (i<n && r==1) {
s = s + *(m+i*MAX_N+i);
i++;
}
if (s != somma) {
r = 0;
}
/* controllo la seconda diagonale */
s = 0;
i = 0;
while (i<n && r==1) {
s = s + *(m + i*MAX_N + (n-i-1));
i++;
}
if (s != somma) {
r = 0;
}
return(r);
}
/*
** main
**
** funzione principale che richiama le altre.
*/
int main(void) {
int M[MAX_N][MAX_N], n;
n = genera(&M[0][0]);
if (verifica(&M[0][0],n) == 1) {
printf("La matrice\n");
stampa_matrice(&M[0][0], n);
printf("e' un quadrato magico.\n");
} else {
printf("La matrice\n");
stampa_matrice(&M[0][0], n);
printf("non e' un quadrato magico.\n");
}
return(1);
}