PROD_MAT.c



/* PRODUCTO DE MATRICES CON MUCHAS FUNCIONES */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* PROTOTIPOS DE FUNCION O FIRMA DE FUNCION */
void Lee_Dimension( void );
int LeeValor( char *);
void Muestra(char *);
int Verifica_Dimension( void );
void PideDatos(char*);
void Multiplica( );
void Muestra_Matriz(char);


/* DECLARACION DE VARIABLES GLOBALES  */
struct DIMENSION
{
	int RENGLONES;
	int COLUMNAS;
	int DATO[100][100];
};

struct DIMENSION MAT_A;
struct DIMENSION MAT_B;
struct DIMENSION MAT_RESP;

/* INICIO DE LAS FUNCIONES ... */
/* ===========================*/

void PideDatos(char *MENSAJE)
{
	int R, C;
	char *CADENA = (char *)malloc(sizeof(char)*100);

	Muestra(MENSAJE);
	sprintf(CADENA, "MATRIZ A:  [ %d x %d ]\n", MAT_A.RENGLONES, MAT_A.COLUMNAS);
	Muestra(CADENA);

	for ( R = 0; R < MAT_A.RENGLONES; R++ )
		for ( C = 0; C < MAT_A.COLUMNAS; C++ )
		{
			sprintf(CADENA, "MAT_A[%d, %d]= ", R+1, C+1);
			Muestra(CADENA);
			scanf( "%d", &MAT_A.DATO[R][C] );
		}

	for ( R = 0; R < MAT_B.RENGLONES; R++ )
		for ( C = 0; C < MAT_B.COLUMNAS; C++ )
		{
			sprintf(CADENA, "MAT_B[%d, %d]= ", R+1, C+1);
			Muestra(CADENA);
			scanf( "%d", &MAT_B.DATO[R][C] );
		}
}

int Verifica_Dimension( void )
{
	return MAT_A.COLUMNAS == MAT_B.RENGLONES;
}

void Muestra(char *MENSAJE)
{
	printf("%s", MENSAJE);
}

int LeeValor( char *MENSAJE )
{
	int Valor = 0;
	Muestra(MENSAJE);
	scanf("%d", &Valor);
	return Valor;
}


void Lee_Dimension( void )
{
	Muestra("Introduce la dimension de la matriz A ...\n\n");
	MAT_A.RENGLONES = LeeValor("Renglones de la matriz A: ");
	MAT_A.COLUMNAS =  LeeValor("Columnas de la matriz A: ");

	Muestra("Introduce la dimension de la matriz B ...\n\n");
	MAT_B.RENGLONES = LeeValor("Renglones de la matriz B: ");
	MAT_B.COLUMNAS =  LeeValor("Columnas de la matriz B: ");
}

void Multiplica( )
{
	int Rma, Rmb, Cma, Cmb;

	for( Rma=0; Rma<MAT_A.RENGLONES; Rma++)
		for( Cma=0; Cma<MAT_A.COLUMNAS; Cma++)
		{
			MAT_RESP.DATO[Rma][Cmb]  = 0;
			for(Rmb=0; Rmb<MAT_B.RENGLONES; Rmb++)
			{
				MAT_RESP.DATO[Rma][Cmb] += MAT_A.DATO[Rma][Cma] * MAT_B.DATO[Cma][Rmb];
			}
		}
}

void Muestra_Matriz( char MAT )
{
	int R, C, i,j;

	switch (MAT)
	{
		case 'A':	R = MAT_A.RENGLONES; C =  MAT_A.COLUMNAS;
			for(i=0; i<R; i++) { for(j=0; j<C; j++) printf("%d ", MAT_A.DATO[i][j]); printf("\n"); } break;
		case 'B':	R = MAT_B.RENGLONES; C =  MAT_B.COLUMNAS;
			for(i=0; i<R; i++) { for(j=0; j<C; j++) printf("%d ", MAT_B.DATO[i][j]); printf("\n"); } break;
		case 'R':	R = MAT_RESP.RENGLONES; C =  MAT_RESP.COLUMNAS; 
			for(i=0; i<R; i++) { for(j=0; j<C; j++) printf("%d ", MAT_RESP.DATO[i][j]); printf("\n"); } break;
	}
}

int main (int NARGS, char **ARGS)
{
	Lee_Dimension( );
	if( Verifica_Dimension( ) )
	{
		Muestra("MATRICES CORRECTAS ...\n");
		PideDatos("DATOS DE LA MATRIZ ... \n");
		Muestra_Matriz( 'A' );
		Muestra_Matriz( 'B' );
		Multiplica( );
		Muestra_Matriz( 'R' );
	}
	else Muestra("MATRICES NO CORRECTAS ... \n");
}