/* File: matsimm.c */
/* Time-stamp: "2002-04-16 15:10:36 calvanes" */
/* Scopo: uso di array multidimensionali */

/* Legge una matrice quadrata e verifica se e' una matrice simmetrica
   (mat[i][j] = mat[j][i]).
*/

#include <stdio.h>

#define DIM 3


void leggiMatrice(int m[DIM][DIM])
{
  int i, j;

  printf("Inserire gli elementi di una matrice di interi %dx%d\n", DIM, DIM);
  for (i = 0; i < DIM; i++)
    for (j = 0; j < DIM; j++)
      scanf("%d", &m[i][j]);
}


void stampaMatrice(int m[DIM][DIM])
{
  int i, j;

  for (i = 0; i < DIM; i++) {
    for (j = 0; j < DIM; j++)
      printf("%5d", m[i][j]);
    printf("\n");
  }
}


int simmetrica(int m[DIM][DIM])
{
  int i, j;
  int simm;     /* booleana: indica se la matrice e` simmetrica */

  simm = 1;                                  /* assumiamo che sia simmetrica */
  for (i = 0; i < DIM; i++)
    for (j = i+1; j < DIM; j++)
      if (m[i][j] != m[j][i])           /* ho trovato una coppia di elementi */
        simm = 0;                       /* che viola la simmetria            */
      /* NON ci deve essere il ramo else */

  return simm;

  /* Per anticipare l'uscita dai cicli durante la verifica si puo` modificare
     il codice si sopra come segue:

     simm = 1;
     for (i = 0; simm && i < DIM; i++)
       for (j = 0; simm && j < DIM; j++)
         if (m[i][j] != m[j][i])
           simm = 0;

     Oppure usando l'istruzione break:

     simm = 1;
     for (i = 0; simm && i < DIM; i++)
       for (j = 0; j < DIM; j++)
         if (m[i][j] != m[j][i]) {
           simm = 0;
           break;
         }
  */
}


int main(void)
{
  int mat[DIM][DIM];

  leggiMatrice(mat);
  printf("La matrice\n");
  stampaMatrice(mat);

  if (simmetrica(mat))
    printf("e` simmetrica!\n");
  else
    printf("non e` simmetrica!\n");

  return 0;
}