//Matrices - Proyecto N°4
/* Elabora una calculadora de matrices | Sumas, Resta, Multiplicación, Tranpuesta, Inversa, Adjunta y Determinante
------------------------------------------------------------------------------------------------------------------*/
#include<iostream>
#include<locale.h>
#include<conio.h>
int main(){
setlocale(LC_CTYPE, "Spanish");
/*Variables enteras: opt(Hará terminar o volver al programa), elec(establecerá el máximo de elegir una opción a resolver), i-j-k(itiradores para los ciclos FOR), f-cl(Filas y columnas de la primera matriz), f1-cl1(Filas y columnas de la segunda matriz)*/
int opt = 0, elec = 0, i = 0, j = 0, k = 0, f = 0, cl = 0, f1 = 0, cl1 = 0;
/*Variables double: rta2(Resolución de la determinante), det(Primer paso de resolver la determinante de N X N matriz), det1(Segundo paso de resolver la determinante de N X N matriz), det2(Tercer paso de resolver la determinante de N X N matriz) */
double rta2 = 0, det = 0, det1 = 0, det2 = 0;
//Introducción del programa
std::cout<<"CALCULADORA DE MATRICES"<<std::endl<<std::endl<<"-------------------------------------------------"<<std::endl<<"1.-Sumar matrices |"<<std::endl<<"2.-Restar matrices |"<<std::endl<<"3.-Multiplicar matrices |"<<std::endl<<"4.-Sacar la inversa de la matriz (máximo 3 x 3) |"<<std::endl<<"5.-Adjunta de la matriz |"<<std::endl<<"-------------------------------------------------"<<std::endl<<std::endl;
do{ //Ciclo DO WHILE para que se elija lo disponible en el programa
std::cout<<"Elección = "; std::cin>>elec;
if(elec > 5 || elec<=0){
std::cout<<std::endl<<"-----ERROR: Solo puede elegir del 1 hasta el 5-----"<<std::endl<<std::endl;
}
}while(elec > 5 || elec<=0);
//IF para la resolución de dos matrices
if(elec == 1 || elec == 2 || elec == 3){
std::cout<<std::endl<<"Número de filas de la primera matriz = "; std::cin>>f;
std::cout<<"Número de columnas de la primera matriz = "; std::cin>>cl;
std::cout<<"Número de filas de la segunda matriz = "; std::cin>>f1;
std::cout<<"Número de columnas de la segunda matriz = "; std::cin>>cl1;
} else{ //ELSE para la resolución de una matriz
std::cout<<std::endl<<"Número de filas = "; std::cin>>f;
std::cout<<"Número de columnas = "; std::cin>>cl;
}
/*Matrices double: ms(Primera matriz), ms1(Segunda matriz), rta(Cotendrá la suma o resta de las matrices), rtam(Cotendrá la multiplicación de las matrices), ms2(Cotendrá la adjunta de la martriz)*/
double ms[f][cl] = {}, ms1[f1][cl1] = {}, rta[f][cl] = {}, rtam[f][cl1] = {}, ms2[f][cl] = {};
system("cls");
switch(elec){
//Suma de matrices
case 1:
if(f + cl == f1 + cl1){
std::cout<<"Ingreso de datos - Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Ingreso de datos de la primera matriz.
for(j = 0; j<cl; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Ingreso de datos - Matriz N°2 -"<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f1; i++){ //Ingreso de datos de la segunda matriz.
for(j = 0; j<cl1; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms1[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la primera matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°2 - "<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la segunda matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms1[i][j]<<" | ";
}
std::cout<<std::endl;
}
for(int i = 0; i<f; i++){ //Ciclo FOR para sumar las matrices.
for(int j = 0; j<cl; j++){
rta[i][j] = (ms[i][j]+ms1[i][j]);
}
}
std::cout<<std::endl<<"Matrices sumadas"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de las matrices sumadas.
std::cout<<" | ";
for(int j = 0; j<cl; j++){
std::cout<<rta[i][j]<<" | ";
}
std::cout<<std::endl;
}
} else{ //ELSE para matrices que no cumplen en ser sumadas.
std::cout<<"-----No se pueden sumar matrices que tengan diferente orden-----"<<std::endl<<std::endl;
return main();
}
break;
//Resta de matrices
case 2:
if(f + cl == f1 + cl1){
std::cout<<"Ingreso de datos - Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Ingreso de la datos de la primera matriz.
for(j = 0; j<cl; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<"Ingreso de datos - Matriz N°2 - "<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f1; i++){ //Ingreso de la datos de la segunda matriz.
for(j = 0; j<cl1; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms1[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la primera matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°2 - "<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f1; i++){ //Presentación de la segunda matriz.
std::cout<<" | ";
for(j = 0; j<cl1; j++){
std::cout<<ms1[i][j]<<" | ";
}
std::cout<<std::endl;
}
for(int i = 0; i<f; i++){ //Ciclo FOR para restar las matrices.
for(int j = 0; j<cl; j++){
rta[i][j] = (ms[i][j]-ms1[i][j]);
}
}
std::cout<<std::endl<<"Matrices restadas"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de las matrices restadas.
std::cout<<" | ";
for(int j = 0; j<cl; j++){
std::cout<<rta[i][j]<<" | ";
}
std::cout<<std::endl;
}
} else{ //ELSE para matrices que no cumplen en ser restadas.
std::cout<<"-----No se pueden restar matrices que tengan diferente orden-----"<<std::endl<<std::endl;
return main();
}
break;
//Producto de matrices
case 3:
if(cl == f1){ //IF para matrices que cumplen al ser multiplicadas.
std::cout<<"Ingreso de datos - Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Ingreso de datos de la primera matriz.
for(j = 0; j<cl; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<"Ingreso de datos - Matriz N°2 - "<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f1; i++){ //Ingreso de datos de la segunda matriz.
for(j = 0; j<cl1; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms1[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°1 - "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la primera matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz N°2 - "<<f1<<" x "<<cl1<<std::endl;
for(i = 0; i<f1; i++){ //Presentación de la segunda matriz.
std::cout<<" | ";
for(j = 0; j<cl1; j++){
std::cout<<ms1[i][j]<<" | ";
}
std::cout<<std::endl;
}
for(int i = 0; i<f; i++){ //Ciclo FOR para multiplicar las matrices.
for(int j = 0; j<cl1; j++){
rta[i][j] = 0;
for(int k = 0; k<cl; k++)
rta[i][j] += (ms[i][k]*ms1[k][j]);
}
}
std::cout<<std::endl<<"Matrices multiplicadas"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de las matrices multiplicadas.
std::cout<<" | ";
for(int j = 0; j<cl1; j++){
std::cout<<rta[i][j]<<" | ";
}
std::cout<<std::endl;
}
} else{ //ELSE para matrices que no cumplen en ser multiplicadas.
std::cout<<"-----Las matrices se pueden mutiplicar cuando el númeo de filas de la primera matriz[N°1] sea igual al número de columnas de segunda matriz[2]-----"<<std::endl<<std::endl;
return main();
}
break;
//Matriz inversa
case 4:
//Para matrices de 1 x 1 :v
if(f * cl == 1){
std::cout<<"Datos de la matriz 1 x 1"<<std::endl<<std::endl<<"Ubicación de datos en la matriz"<<std::endl<<"|[1][1]"<<std::endl<<std::endl<<"Ingreso de datos de la matriz 1 x 1"<<std::endl<<"[1][1] = "; std::cin>>ms[0][0];
std::cout<<std::endl<<"Matriz 1 x 1"<<std::endl<<"|"<<ms[0][0]<<"|"<<std::endl<<std::endl<<"La determinante de su matriz es = "<<ms[0][0]<<std::endl<<std::endl<<"Matriz traspuesta"<<std::endl<<"|"<<ms[0][0]<<"|"<<std::endl;
} else if(f * cl == 4){ //ELSE IF para matrices 2 x 2
std::cout<<"Datos de la matriz 2 x 2"<<std::endl<<std::endl<<"Ubicación de datos en la matriz"<<std::endl<<"|[1][1] [1][2]|"<<std::endl<<"|[2][1] [2][2]|"<<std::endl<<std::endl;
for(i = 0; i<f; i++){ //Ingreso de datos de la matriz.
for(j = 0; j<cl; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
//Resolución de la determinante de la matriz 2 x 2.
det = ((ms[0][0])*(ms[1][1]))-((ms[0][1])*ms[1][0]);
std::cout<<std::endl<<"La determinante de su matriz es = "<<det<<std::endl; //´Presentación de la determinante.
if(det==0){
std::cout<<"Su matriz no tiene inversa"<<std::endl;
} else{
//Matriz adjunta de matriz 2 x 2.
double ms2[f][cl] = {{ms[1][1], -(ms[0][1])}, {-(ms[1][0]), ms[0][0]}};
std::cout<<std::endl<<"-Matriz adjunta 2 x 2"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de la matriz adjunta.
std::cout<<" | ";
for(int j = 0; j<cl; j++){
std::cout<<ms2[i][j]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"-Matriz inversa 2 x 2"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de la matriz inversa.
std::cout<<"| ";
for(int j = 0; j<cl; j++){
std::cout<<((ms2[i][j])/det)<<" | ";
}
std::cout<<std::endl;
}
}
} else if(f * cl == 9){ //ELSE IF para matrices 3 x 3
std::cout<<"Datos de la matriz 3 x 3"<<std::endl<<std::endl<<"Ubicación de datos en la matriz"<<std::endl<<"|[1][1] [1][2] [1][3]|"<<std::endl<<"|[2][1] [2][2] [2][3]|"<<std::endl<<"|[3][1] [3][2] [3][3]|"<<std::endl<<std::endl;
for(i = 0; i<f; i++){ //Ingreso de datos de la matriz.
for(j = 0; j<cl; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"Matriz "<<f<<" x "<<cl<<std::endl;
for(i = 0; i<f; i++){ //Presentación de la matriz.
std::cout<<" | ";
for(j = 0; j<cl; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
//Resolución de la determinante de la matriz 3 x 3.
det = (ms[0][0])*(((ms[1][1])*(ms[2][2]))-((ms[1][2])*(ms[2][1])));
det1 = (ms[0][1])*(((ms[0][1])*(ms[2][2]))-((ms[1][2])*(ms[2][0])));
det2 = (ms[0][2])*(((ms[0][1])*(ms[2][1]))-((ms[1][1])*(ms[2][0])));
rta2 = det - (det1) + (det2);
std::cout<<std::endl<<"La determinante de su matriz es = "<<rta2<<std::endl; //Presentación de la determinante.
if(rta2 == 0){ //IF para determinante igual a 0
std::cout<<"Su matriz no tiene inversa"<<std::endl;
} else{ //ELSE para calcular la determinantes mayor o menor a 0.
//Resolución de la adjunta de la matriz 3 x 3.
ms2[0][0] = +(((ms[1][1])*(ms[2][2]))-((ms[1][2])*(ms[2][1])));
ms2[0][1] = -(((ms[1][0])*(ms[2][2]))-((ms[1][2])*(ms[2][0])));
ms2[0][2] = +(((ms[1][0])*(ms[2][1]))-((ms[1][1])*(ms[2][0])));
ms2[1][0] = -(((ms[0][1])*(ms[2][2]))-((ms[0][2])*(ms[2][1])));
ms2[1][1] = +(((ms[0][0])*(ms[2][2]))-((ms[0][2])*(ms[2][0])));
ms2[1][2] = -(((ms[0][0])*(ms[2][1]))-((ms[0][1])*(ms[2][0])));
ms2[2][0] = +(((ms[0][1])*(ms[1][2]))-((ms[0][2])*(ms[1][1])));
ms2[2][1] = -(((ms[0][0])*(ms[1][2]))-((ms[0][2])*(ms[1][0])));
ms2[2][2] = +(((ms[0][0])*(ms[1][1]))-((ms[0][1])*(ms[1][0])));
std::cout<<std::endl<<"-Matriz adjunta 3 x 3"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de la matriz adjunta.
std::cout<<" | ";
for(int j = 0; j<cl; j++){
std::cout<<ms2[j][i]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl<<"-Matriz inversa 3 x 3"<<std::endl;
for(int i = 0; i<f; i++){ //Presentación de la matriz inversa.
std::cout<<"| ";
for(int j = 0; j<cl; j++){
std::cout<<((ms2[j][i])/rta2)<<" | ";
}
std::cout<<std::endl;
}
}
} else{ //ELSE por si se pone una matriz N x M o N x N mayor a 3 x 3.
std::cout<<"-----ERROR: La matriz no está en el margen de posible cálculo-----"<<std::endl<<std::endl;
return main();
}
break;
//Matriz traspuesta
case 5:
std::cout<<"Ingreso de datos de matriz "<<f<<" x "<<cl<<std::endl;
for(int i = 0; i<=f-1; i++){ //Ciclo FOR anidado para ingreso de la matriz.
for(int j = 0; j<=cl-1; j++){
std::cout<<"["<<i+1<<"] ["<<j+1<<"] = "; std::cin>>ms[i][j];
}
std::cout<<std::endl;
}
std::cout<<"Matriz "<<f<<" x "<<cl<<std::endl;
for(int i = 0; i<=f-1; i++){ //Ciclo FOR para la presentación de la matriz.
std::cout<<"| ";
for(int j = 0; j<=cl-1; j++){
std::cout<<ms[i][j]<<" | ";
}
std::cout<<std::endl;
}
std::cout<<std::endl;
if(f<cl){ //IF para matrices traspuesta que el número de filas sea menor al número de columnas.
std::cout<<"Matriz tranpuesta "<<cl<<" x "<<f<<std::endl;
for(int i = 0; i<=cl-1; i++){
std::cout<<"| ";
for(int j = 0; j<=f-1; j++){
std::cout<<ms[j][i]<<" | ";
}
std::cout<<std::endl;
}
} else if(f>cl){ //ELSE IF para matrices con número de filas mayor al número de columnas.
std::cout<<"Matriz tranpuesta "<<cl<<" x "<<f<<std::endl;
for(int i = 0; i<cl; i++){
std::cout<<"| ";
for(int j = 0; j<f; j++){
std::cout<<ms[j][i]<<" | ";
}
std::cout<<std::endl;
}
} else{ //ELSE para matrices igual tamaño.
std::cout<<"Matriz tranpuesta "<<f<<" x "<<cl<<std::endl;
for(int i = 0; i<=f-1; i++){
std::cout<<"| ";
for(int j = 0; j<=cl-1; j++){
std::cout<<ms[j][i]<<" | ";
}
std::cout<<std::endl;
}
}
break;
}
do{ //Ciclo DO WHILE para volver o terminar el programa.
std::cout<<std::endl<<"Volver al menú[1] || Salir del programa[2]"<<std::endl<<"Opción = "; std::cin>>opt;
if(opt == 1){ //Vuelve al inicio del programa.
system("cls");
return main();
} else if(opt > 2 || opt<=0){ //Error de elegir 3 o mayor a este, o elegir 0 o menor a este.
std::cout<<std::endl<<"-----ERROR: Solo puede elegir el 1 o el 2-----"<<std::endl;
} else{ //Termina el programa.
std::cout<<std::endl<<"Gracias por usar este programa :D";
getch();
return 0;
}
}while(opt > 2 || opt<=0);
return 0;
}