/*
** 
** ENUNCIADO 
**       Escribir una matriz por diagonales de abajo a arriba y de
**       izquierda a derecha
** Autor: Departamento de Informatica
** Fecha: junio de 2003
**/

/* CABECERA */
#include <stdio.h>

/* CONSTANTES */
/* tamano maximo de la matriz MAX x MAX*/
#define MAX  10

/* PROTOTIPOS */
void  introdMatriz(int M[MAX][MAX], int *n, int *m);
void  verMatriz(int M[MAX][MAX], int n, int m);
void  EscribDiagonales(int M[MAX][MAX],  int n, int m);
void  EscribDiagonal(int M[MAX][MAX],  int n, int m, int fil, int col);

/* FUNCION PRINCIPAL */
main( ){
    int   n,m;          /* orden de la matriz n x m */
    int  M[MAX][MAX];  /* almaceno la matriz a evaluar */ 

    /* introducimos los datos */
    introdMatriz(M, &n, &m);
		
    /* visualizar los datos */
    printf (" * * * Matriz * * *\n");
    verMatriz(M, n, m);
		
    /* escribir diagonales */	
    printf (" * * * Diagonales * * *\n");
    EscribDiagonales(M, n, m);

}

/* FUNCIONES LOCALES */
/*
**  introdMatriz
**		Introducimos los elementos de una mat. 
**  E:  ---
**  S:	M	Matriz cuyos datos introducimos
** 	n, m	Orden de la matriz. 
**
*/
void introdMatriz(int M[MAX][MAX], int *n, int *m){
	int i,j; /* contador */

	/* pedimos el orden de la matriz */
	do {
		printf("Introduzca el numero de filas de la matriz: ");
		scanf("%d",n);
	}while ((*n>MAX) || (*n<0));

	do {
		printf("Introduzca el numero de columnas de la matriz: ");
		scanf("%d",m);
	}while ((*m>MAX) || (*m<0));



	/* introducimos datos */
	for (i=0;i<*n;i++){
		for(j=0;j<*m;j++){
			printf("Introduzca el elemento %d %d :",i,j);
			scanf("%d",&M[i][j]);
		}
	}
}



 /*
**  procedimiento EscribDiagonales
**		Escribe matriz diagonal a diagonal
**
**  E: M	Matriz que evaluamos					
**     n, m	Orden de la matriz. 
**  S: --- 
**
**  Aclaraciones:
**		Comienzo en la ultima fila y desciendo en diagonales.
**		Al llegar a primera fila avanzo por la primera fila y 
**		desciendo en diagonales
**  Funciones utilizadas:
**		EscribDiagonal: Para escribir  cada diagonal
**
*/
void  EscribDiagonales(int M[MAX][MAX], int n, int m){
	int fila,col;         /* contadores */

	/* Recorro las filas de abajo a arriba */
	for (fila=n-1; fila >= 0 ;fila--)
		EscribDiagonal(M,n,m,fila,0);
		
	/* Recorro las columnas de izquierda a derecha */
	for (col=1; col<m; col++)
		EscribDiagonal(M,n,m,0,col);
}

/*
**  procedimiento EscribDiagonal
**	Escribe la diagonal que empieza en el elemento fil, col de la matriz
**
**  E:	M	    Matriz que evaluamos			
**      n, m 	    Orden de la matriz. 
**      fila, col  Elemento donde empieza la diagonal
**  S: ---
**  Aclaraciones:
**		Desde ese elemento decremento valores de fila e incr
**		valores de columna hasta llegar a uno de los topes.
**
*/
void  EscribDiagonal(int M[MAX][MAX], int n, int m, int fila, int col){
	int i,j; /* contadores */
	
	/* Desde el primer elemento */
	i = fila;
	j = col;

	/* mientras no encontremos un tope */
	while ((i<n)&&(j<m)){
		printf("%4d ",M[i][j]);
		i++;j++;
	}		

	printf("\n");
}


		
/*
**  verMatriz
**		Vemos los elementos de una mat. 
**
**  E: M	Matriz cuyos datos introducimos			
**     n, m	Orden de la matriz. 
**  S: --
*/
void verMatriz(int M[MAX][MAX], int n, int m){
	int i,j; /* contador */

	/* escribimos datos */
	for (i=0;i<n;i++){
		for(j=0;j<m;j++){
			printf("%4d ",M[i][j]);
		}
		printf("\n");
	}
}

