/*
  Ejercicio # 2
  Nombre: Multiplicación de Matrices
  Autor: Carlos Rolando Calán Ajquill
  Fecha: 24/06/06 00:45
  Descripción: Programa que realiza la multiplicación de 2 matrices
  Versión: 1.0 
*/
#include <cstdlib>
#include <iostream>
#include <conio.c>
#include <iomanip>
using namespace std;
//Procedimiento que realiza la multiplicacion de las matrices
void MultiplicarMatriz();
//Variables que nos servira para saber la cantidad de filas de las matrices
int Fila1, Fila2;
//Variables que nos servira para saber la cantidad de columnas de las matrices
int Columna1, Columna2;
//Punteros que contendran los datos que sean ingresados por los usuarios
int **Matriz1, **Matriz2, **MatrizR;

int main()
{ 
  int Opcion = 0;
  while (Opcion != 2)
  {
    system("CLS");
    cout<<"\t \t \t UNIVERSIDAD MARIANO GALVEZ \n \n"; 
    cout<<"\t \t Proyecto Final Estructura De Datos \n";    
    cout<<"\t \t Carlos Rolando Calan Ajquill    Junio/2006 \n";
    cout<<"\t \t Carne: 0910-04-13429         5to. Semestre \n";
    cout<<"\t \t ----------------------------------------------\n";    
    cout<<"\t \t Multiplicacion de Matrices \n ";
    cout<<"\t \t ----------------------------------------------\n\n";    
		cout<<"\t 1.- Ingreso de Datos \n";
		cout<<"\t 2.- Salir \n";
    cout<<"\t -------------------------------------------------\n";    
		cout<<"\t \t Seleccione una opcion \t";
		cin>>Opcion;
	  switch (Opcion)
		{
		  case 1:
        cout<<"OPCION 1:";
		    MultiplicarMatriz();
				break;
			case 2:
        cout<<"OPCION 2:";
			  system("CLS");
        cout<<"Hecho por Carlos Rolando Calán Ajquill, hasta pronto ......\n\n";			        
			  break;
      default:
        cout;      
        cout<<"Opcion Invalida \n\n";
        break;	    
    } 
 	}
  system("PAUSE");
  return EXIT_SUCCESS;
}

void MultiplicarMatriz()
{
  system("CLS");
  cout<<"Multiplicacion de Matrices"<<endl;
  cout<<"\n Cuantas Filas tendra la matriz A ";
  cin>>Fila1;
  cout<<"\n Cuantas Columnas tendra la matriz A ";
  cin>>Columna1;
  cout<<"\n Ingrese los datos de la matriz A";
  //Reservamos espacio de memoria para la matriz A
  Matriz1 = new int*[Fila1];
  for(int i=0;i<Fila1;i++)
    Matriz1[i]=new int[Columna1];
  //Se pide que ingresen los datos de la Matriz A
  for(int i=0; i<Fila1; i++)
  {
    for(int j=0; j<Columna1; j++)
    {
      //cout<<"Datos de la Fila "<<i<<" Columna "<<j;
      gotoxy(5+3*j,9+i);
      cin>>Matriz1[i][j];
    }
  }
  system("CLS");
  cout<<"Multiplicacion de Matrices \n";
  cout<<"\n Cuantas Filas tendra la matriz B ";
  cin>>Fila2;
  cout<<"\n Cuantas Columnas tendra la matriz B ";
  cin>>Columna2;
  cout<<"\n Ingrese los datos de la matriz B";
  //Reservamos espacio de memoria para la matriz B
  Matriz2 = new int*[Fila2];
  for(int i=0; i<Fila2; i++)
    Matriz2[i] = new int[Columna2];
  //Se pide que ingresen los datos de la Matriz B
  for(int i=0; i<Fila2; i++)
  {
    for(int j=0; j<Columna2; j++)
    {
      //cout<<"Datos de la Fila "<<i<<" Columna "<<j;
      gotoxy(5+3*j,9+i);
      cin>>Matriz2[i][j];
    }
  }
  /*Esto se realiza para verificar que la cantidad de Columnas de la matriz A
    sea igual a la cantidad de columnas de la matriz B, si esto no se cumple se 
    sale del programa sin hacer nada*/
  if(Columna1 != Fila2)
  {
    system("CLS");
    cout<<"No se puede ejecutar la multiplicacion porque NO";
    getch();
    return;
  }
  //Reservamos espacio de memoria para la matriz R (resultante)
  MatrizR = new int*[Fila1];
  for(int i=0; i<Fila1; i++)
    MatrizR[i] = new int[Columna2];
  //Entonces se procede a realizar la multiplicacion de las 2 matrices      
  for(int i=0; i<Fila1; i++)
    for(int j=0; j<Columna2; j++)
    {
      int Suma=0;
      //Columna1==Fila2 
      for(int k=0; k<Columna1; k++)
        Suma+= Matriz1[i][k] * Matriz2[k][j];
      //La suma de la matriz se guarda en la matriz resultante
      MatrizR[i][j]=Suma;
    }
  /*Posteriormente se despliegan los datos, tanto de la matriz A y B, como la
    Resultante MatrizR*/
  system("CLS");
  cout<<setw(11)<<"Datos de la Matriz A \n";
  for(int i=0; i<Fila1; i++)
  {
    cout<<endl;
    for(int j=0; j<Columna1; j++)
      cout<<setw(5)<<Matriz1[i][j];
  }
  cout<<"\n\n"<<setw(11)<<"Datos de la Matriz B \n";
  for(int i=0; i<Fila2; i++)
  {
    cout<<endl;
    for(int j=0; j<Columna2; j++)
      cout<<setw(5)<<Matriz2[i][j];
  }
  cout<<"\n\n"<<setw(11)<<"Datos de la Matriz Resultante \n";
  for(int i=0; i<Fila1; i++)
  {
    cout<<endl;
    for(int j=0; j<Columna2; j++)
      cout<<setw(5)<<MatrizR[i][j];
  }
  //Para no dejar basura en la memoria la liberamos
  for(int i=0; i<Fila1; i++)
  {
    delete[] Matriz1[i];
    delete[] MatrizR[i];
  }
  for(int i=0; i<Fila2; i++)
   delete[] Matriz2[i];
  delete[] Matriz1, Matriz2, MatrizR;
  getch();
}