/****************************************
 * Veja o uso das constantes TRUE e FALSE
 ******************************************
 */

/*
 * arquivo: matriz_simetrica.c
 * ---------------------------
 * Recebe um inteiro n e uma matriz real n x n.
 * Decide se a matriz dada e' simetrica.
 */
#include <stdio.h>

#define TRUE 1
#define FALSE 0

#define NMAX 10


/*************** Prototipos das funcoes ****************************/

 void leia_matriz(double a[][NMAX], int m, int n);
/*
 * Esta funcao recebe uma matriz de doubles a[][NMAX] e inteiros m e n.
 * Le m x n reais e os coloca em em a, isto 'e, em
 *
 * a[0][0] ... a[0][n-1]
 * a[1][0] ... a[1][n-1]
 * ...
 * a[m-1][0] ... a[0][n-1]
 */


int mz_eh_simetrica(double a[][NMAX], int n);
/*
 * Esta funcao 
 * recebe uma n x n matriz de doubles a[][NMAX] e um inteiro n.
 * Decide se a matriz recebida 'e simetrica, isto 'e, 
 * 
 * se a[i][j] = a[j][i]  para todo 0 <= i < n e 0 <= i < n.
 *
 * Se a matriz a e' simetrica, devolve TRUE;
 *                             caso contrario, devolve FALSE;
 * OBS: Esta funcao é do tipo int (pois devolve um numero inteiro).
 */

/**********************************************************************/

int main()
{
  double M[NMAX][NMAX];
  int n;

  printf("Forneca o valor de n: ");
  scanf("%d", &n);

  leia_matriz(M, n, n);

  if (mz_eh_simetrica(M,n))
    printf("A matriz dada 'e simetrica.\n");
  else
    printf("A matriz dada _nao_ 'e simetrica.\n");
  
  return 0;
}

/**********************************************************************/

void leia_matriz(double a[][NMAX], int m, int n)
{
  int i, j;

  printf("Forneca as entradas da matriz %d x %d:\n", m, n);
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      scanf("%lf", &a[i][j]);
}

int mz_eh_simetrica(double a[][NMAX], int n)
{
  int i, j;

  for (i = 0; i < n; i++) 
    for (j = i+1; j < n; j++)
      if (a[i][j]!= a[j][i])
	return FALSE;

  return TRUE;
}