import java.io.*;
import java.text.*;
class matrices{
	public static void main(String[]args) throws IOException{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		int n;
		
	//Presentacion mia y del programa
	

		System.out.println("");
		System.out.println("");
		System.out.println("*******************************************************");
		System.out.println("***  Alumno: Daniel Aldea                           ***");
		System.out.println("***  Profesor: Carlos cuevas                        ***");
		System.out.println("***  Ayudante: Felipe Anic                          ***");
		System.out.println("***  Tema: Operaciones Matriciales                  ***");
		System.out.println("*******************************************************");
		System.out.println("");
		System.out.println("");
		System.out.println("");
		System.out.println("");
	
		
	// preguntamos el orden de la matriz cuadrada
	
	System.out.println("¿De orden va a ser la matriz cuadrada?");
		n=Double.valueOf(in.readLine().trim()).intValue();
		
	
	
	/***********************************************************************
	*****************  Datos de algunas variables **************************
	***********************************************************************/
	
	
	// creamos variable texto y resultado, con los cuales mostraremos las respuestas
	String texto;
	double[][] resultado=new double[n][n];
	
	// la variable real es un double con que guardaremos la traza y el determinante
	double real;
	
	// creamos variable x para nuestro menu
	int x;
		
	
	
	
	/***********************************************************************
	********* Ingreso, muestra y verificacion de matrices A y B ************
	***********************************************************************/
	
	
	
	// creamos la matriz A
		
		double[][] a= new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
               a[i][j]=0.0;
            }
        }
        
        
   // preguntamos y llenamos los datos de la matriz A
        System.out.println("ingrese los datos de la matriz A");
        for (int i=0;i<n;i++){
			for (int j=0;j<n;j++){
				System.out.println("ingrese el valor A["+i+"]["+j+"]");
				a[i][j]=Double.valueOf(in.readLine().trim()).doubleValue();
			}
		}
		
		
	// bucle de verificacion de matriz A
		
		while (true){
			
		// mostramos la matriz A
			System.out.println("La mariz A es:");
			texto=metodos.mostrar(a);
			System.out.println(texto);
			
		//confirmamos los datos
			System.out.println("Son correctos los datos? para si=0, para no=1");
			x=Double.valueOf(in.readLine().trim()).intValue();
			// si es falso volvemos a ingresar los datos
			if (x==1){
				System.out.println("ingrese los datos de la matriz A");
        		for (int i=0;i<n;i++){
					for (int j=0;j<n;j++){
						System.out.println("ingrese el valor A["+i+"]["+j+"]");
						a[i][j]=Double.valueOf(in.readLine().trim()).doubleValue();
					}
				}
			}
			
		// si es verdadero seguimos con el programa
			else
			break;
		}
				
        
     // creamos la matriz B
        
        double[][] b= new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
               b[i][j]=0.0;
            }
        }
        
     
	//preguntamos y llenamos los datos de la matriz B
		
		System.out.println("ingrese los datos de la matriz B");
        for (int i=0;i<n;i++){
			for (int j=0;j<n;j++){
				System.out.println("ingrese el valor B["+i+"]["+j+"]");
				b[i][j]=Double.valueOf(in.readLine().trim()).doubleValue();
			}
		}
		
		
  				
  	// bucle de verificacion de matriz B
		
		while (true){
			
		// mostramos la matriz B
			System.out.println("La mariz B es:");
			texto=metodos.mostrar(b);
			System.out.println(texto);
			
		//confirmamos los datos
			System.out.println("Son correctos los datos? para si=0, para no=1");
			x=Double.valueOf(in.readLine().trim()).intValue();
			// si es falso volvemos a ingresar los datos
			if (x==1){
				System.out.println("ingrese los datos de la matriz B");
        		for (int i=0;i<n;i++){
					for (int j=0;j<n;j++){
						System.out.println("ingrese el valor B["+i+"]["+j+"]");
						b[i][j]=Double.valueOf(in.readLine().trim()).doubleValue();
					}
				}
			}
			
		// si es verdadero seguimos con el programa
			else
			break;
		}
	
		
		
	
		
	/***********************************************************************
	******** Llamada a los metodos de las Operaciones Matriciales **********
	***********************************************************************/
	
	
	/************************** Pequeño Menu ******************************/
	
	
	System.out.println("************************************************************");
	System.out.println("¿ Que desea hacer? (responda con el numero de opcion)");
	System.out.println("");
	System.out.println("[0] Salir");
	System.out.println("[1] Mostrar la matriz A");
	System.out.println("[2] Mostrar la matriz B");
	System.out.println("[3] Inverso aditivo de A");
	System.out.println("[4] Inverso aditivo de B");
	System.out.println("[5] Traza de A");
	System.out.println("[6] Traza de B");
	System.out.println("[7] Trasponer A");
	System.out.println("[8] Trasponer B");
	System.out.println("[9] Triangular superior de A");
	System.out.println("[10] Triangular inferior de A");
	System.out.println("[11] Triangular superior de B");
	System.out.println("[12] Triangular inferior de B");
	System.out.println("[13] A+B");
	System.out.println("[14] A-B");
	System.out.println("[15] B-A");
	System.out.println("[16] A*B");
	System.out.println("[17] B*A");
	System.out.println("[18] Determinante de A (solo orden 1,2 y 3");
	System.out.println("[19] Determinante de B (solo orden 1,2 y 3");
	System.out.println("[20] Ponderar A por un escalar");
	System.out.println("[21] Ponderar B por un escalar");
	
	/********************** Cierre del Pequeño menu **********************/
	
	while (true){
	System.out.println("************************************************************");
	System.out.println("");
	System.out.println("Escriba su opcion(0-17)");
	System.out.println("Para volver a ver el menu presiona 666");
	System.out.println("");
	x=Double.valueOf(in.readLine().trim()).intValue();
	
	if (x==0)
		break;
		
		
	else if(x==1){
		
		// mostramos la matriz A
			System.out.println("La mariz A es:");
			texto=metodos.mostrar(a);
			System.out.println(texto);
			
	}
		
	else if(x==2){
		
		// mostramos la matriz B
			System.out.println("La mariz B es:");
			texto=metodos.mostrar(b);
			System.out.println(texto);
		
	}
	
	else if(x==3){
		// inversa aditiva de A
			System.out.println("Inversa Aditiva de A");
			resultado=metodos.inversa(a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
			
	}
	
	
	else if(x==4){
		// inversa aditiva de B
		System.out.println("Inversa Aditiva de B");
		resultado=metodos.inversa(b);
		texto=metodos.mostrar(resultado);
		System.out.println(texto);
	}
	
	else if(x==5){
		// traza de A
			System.out.println("Traza de A");
			real=metodos.traza(a);
			System.out.println(real);
			
	}
	
	else if(x==6){
		
		// traza de B
			System.out.println("Traza de B");
			real=metodos.traza(b);
			System.out.println(real);
	}
	
	else if(x==7){
		
		// Traspuesta de A
			System.out.println("Traspuesta de A");
			resultado=metodos.trasponer(a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
	}
	
	else if(x==8){
		// Traspuesta de B
			System.out.println("Traspuesta de B");
			resultado=metodos.trasponer(b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
	}
	
	else if(x==9){
		// Triangular superior de A
			System.out.println("Triangular superior de A");
			resultado=metodos.triansup(a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
	}
	
	else if(x==10){
		// Triangular inferior de A
			System.out.println("Triangular inferior de A");
			resultado=metodos.trianinf(a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
	}
	
	else if(x==11){
		// Triangular superior de B
			System.out.println("Triangular superior de B");
			resultado=metodos.triansup(b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
		}		
		
	else if(x==12){
		// Triangular inferior de B
			System.out.println("Triangular inferior de B");
			resultado=metodos.trianinf(b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
			
	}
	
	else if(x==13){
		// Suma de A con B
			System.out.println("Suma A+B");
			resultado=metodos.sumar(a,b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
			
	}
	
	else if(x==14){
		
		// Resta de A con B
			System.out.println("Resta A-B");
			resultado=metodos.restar(a,b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
			
	}
	
	else if(x==15){
		// Resta de B con A
			System.out.println("Resta B-A");
			resultado=metodos.restar(b,a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
			
	}
	
	else if(x==16){
	
		// Multiplicacion de A con B
			System.out.println("Multiplicacion de A con B");
			resultado=metodos.multiplicar(a,b);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
		
	}
	
	else if(x==17){
		// Multiplicacion de B con A
			System.out.println("Multiplicacion de B con A");
			resultado=metodos.multiplicar(b,a);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
		
	}
	
	else if(x==18){
		// Determinante de A
			System.out.println("Determinante de A");
			real=metodos.determinante(a);
			System.out.println(real);
		
	}
	
	else if(x==19){
		// Determinante de B
			System.out.println("Determinante de B");
			real=metodos.determinante(b);
			System.out.println(real);
		
	}
	
	
	else if(x==20){
		// Ponderar A por un escalar
			System.out.println("Ponderar A por un escalar");
			System.out.println("¿Por que escalar desea ponderar?");
			real=Double.valueOf(in.readLine().trim()).intValue();
			resultado=metodos.ponderar(a,real);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
		
	}
	
	
	else if(x==21){
		// Ponderar B por un escalar
			System.out.println("Ponderar B por un escalar");
			System.out.println("¿Por que escalar desea ponderar?");
			real=Double.valueOf(in.readLine().trim()).intValue();
			resultado=metodos.ponderar(b,real);
			texto=metodos.mostrar(resultado);
			System.out.println(texto);
		
	}
	
	
	else if (x==666){
		
		/************************** Pequeño Menu ******************************/
	
	
	System.out.println("************************************************************");
	System.out.println("[0] Salir");
	System.out.println("[1] Mostrar la matriz A");
	System.out.println("[2] Mostrar la matriz B");
	System.out.println("[3] Inverso aditivo de A");
	System.out.println("[4] Inverso aditivo de B");
	System.out.println("[5] Traza de A");
	System.out.println("[6] Traza de B");
	System.out.println("[7] Trasponer A");
	System.out.println("[8] Trasponer B");
	System.out.println("[9] Triangular superior de A");
	System.out.println("[10] Triangular inferior de A");
	System.out.println("[11] Triangular superior de B");
	System.out.println("[12] Triangular inferior de B");
	System.out.println("[13] A+B");
	System.out.println("[14] A-B");
	System.out.println("[15] B-A");
	System.out.println("[16] A*B");
	System.out.println("[17] B*A");
	System.out.println("[18] Determinante de A (solo orden 1,2 y 3");
	System.out.println("[19] Determinante de B (solo orden 1,2 y 3");
	System.out.println("[20] Ponderar A por un escalar");
	System.out.println("[21] Ponderar B por un escalar");
}
}
}	
	

	

	

	
}	
	
	
	
	
