/* 
  ** Programacion - I.T.Industrial
  ** Curso 2002-2003
  ** Ejemplo de tratamiento avanzado de matrices
  ** Traspone una matriz 
  ** E: teclado
  ** S: pantalla
  **
*/


#include <stdio.h>
#define MF 10 
#define MC 10 

void Lee_Valida_Entero (int, int, int *);
void EscribeM2d (int M[][MC], int nf, int nc);
void LeeM2d (int M[MF][MC], int *nf, int *nc);
void Intercambia (int *, int *);
void TransponeMatriz (int M[MF][MC], int *nf, int *nc);

void LeeM2d (int M[MF][MC], int * nf, int * nc){
int i;
int j;
        printf ("** Num. de filas: ");
	Lee_Valida_Entero (1, MF, nf);
        printf ("** Num. de columnas: ");
	Lee_Valida_Entero (1, MC, nc);
	for (i=0; i<*nf; i++)
	   for (j=0; j<*nc; j++){
		printf ("Elemento %d %d = ", i, j );
	 	scanf ("%d", &M[i][j]);
           }			

} /* LeeM2d */

void EscribeM2d (int M[][MC], int nf, int nc){
/* Escribe una matriz real de dim. 2
   Parametros : E/ : M[][MC] --> matriz
			    E/ : nf, nc  --> tamanio efectivo matriz
*/
int i;
int j;
	for (i=0; i<nf; i++){
	   for (j=0; j<nc; j++)
		printf ("%3d", M[i][j]);
	   printf ("\n");
	}

} /* escribeM2d */	
	
void Intercambia (int *a, int *b){
/* 
   Intercambia los valores de *a y *b
   Paramentros E/S: a, b: numeros a intercambiar
*/
int aux;
	aux = *a;
	*a = *b;
	*b = aux;
}

void TransponeMatriz (int A[][MC], int *nf, int *nc){
/* Transpone la matriz A 
   Par. E/S: nf, nc < MC
	E/S: M , matriz a transponer 
   Comentario: nf <= MF y nf <= MC
	       nc <= MF y nc <=MC
*/
   
int i;
int j;
int aux;
	if (*nf <= *nc) 
	/* matriz "apaisada" : triang. superior */
	for (i=0; i< *nf; i++)
	   for (j = i; j < *nc; j++)
		Intercambia (&A[i][j], &A[j][i]);
	   else /*matriz alargada : triangulo inferior */
		for (i=0; i<*nf; i++)
			for (j=0; j<i; j++)
				Intercambia (&A[i][j], &A[j][i]);
	
	/* Cambio de num fil y num_col */
	Intercambia (nf, nc);
}	

/*
**
funcion principal - main() 
**
*/

main(){
	int Matriz[MF][MC];
	int nfil, ncol; /* numero de filas y columnas efectivo */

	LeeM2d (Matriz, &nfil , & ncol);
	/* Comprueba si se puede transponer */
	if (nfil <= MC && ncol <= MF){
		printf ("* * * Matriz inicial * * *  \n");
		EscribeM2d (Matriz, nfil, ncol);
		TransponeMatriz (Matriz, &nfil, &ncol);
		printf ("* * * Matriz transpuesta * * * \n");
		EscribeM2d (Matriz, nfil, ncol);
	}
	else 
		printf ("La matriz no se puede transponer \n");
}

void Lee_Valida_Entero (int linf, int lsup, int * n){
/* Lee y valida num */
/* E: linf,lsup
   S: n
*/

printf ("Introduzca num (%d <= n <= %d ) : ", linf, lsup);
scanf ("%d", n);
while (*n < linf || *n > lsup){
	printf ("Error. \n");
	printf ("Introduzca num (%d <= n <= %d ) : ", linf, lsup);
	scanf ("%d", n);
	}
}
