#include <iostream.h>
#include <conio.h>
class matriz {
double **tabla,**tabla2;
int dim;
public:
enum tipo_tabla{coef,ampliada,inversa};
matriz(int);
~matriz();
void llenar();
void imprimir(int);
bool invertir(int,bool);
};
matriz::matriz(int n) {
int i;
dim=n;
tabla=new double *[dim];
for (i=0;i<dim;i++) *(tabla+i)=new double[dim*2];
}
matriz::~matriz() {
int i;
for (i=0;i<dim;i++) delete [] *(tabla+i);
delete [] tabla;
for (i=0;i<dim;i++) delete [] *(tabla2+i);
delete [] tabla2;
}
void matriz::llenar() {
int i,j;
double num;
for (i=0;i<dim;i++) {
for (j=0;j<dim;j++) {
cout<<"Ingresa un numero en la posicion ["<<i+1<<","<<j+1<<"]: ";
cin>>num;
*(*(tabla+i)+j)=num;
}
for (j=dim;j<dim*2;j++) *(*(tabla+i)+j)=(i==(j-dim))?(double)1:(double)0;
}
tabla2=new double *[dim];
for (i=0;i<dim;i++) *(tabla2+i)=new double[dim*2];
for (i=0;i<dim;i++)
for (j=0;j<dim*2;j++) *(*(tabla2+i)+j)=*(*(tabla+i)+j);
}
void matriz::imprimir(int t_tabla) {
int i,j;
if (t_tabla==coef) {
for (i=0;i<dim;i++,cout<<endl)
for (j=0;j<dim;j++) cout<<*(*(tabla+i)+j)<<"t";
}
else if (t_tabla==ampliada) {
for (i=0;i<dim;i++,cout<<endl)
for (j=0;j<dim*2;j++) cout<<*(*(tabla+i)+j)<<"t";
}
else {
for (i=0;i<dim;i++,cout<<endl)
for (j=dim;j<dim*2;j++) cout<<*(*(tabla2+i)+j)<<"t";
}
}
bool matriz::invertir(int pivote=0,bool ida=true) {
int i,j;
double k;
if (!*(*(tabla2+pivote)+pivote)) return false;
else if (ida) {
if (pivote==dim-1) return invertir(pivote,false);
else {
for (i=pivote;i<dim-1;i++) {
k=*(*(tabla2+i+1)+pivote)/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+i+1)+j)=*(*(tabla2+i+1)+j)-*(*(tabla2+pivote)+j)*k;
}
return invertir(++pivote);
}
}
else {
if (pivote==0) { //Se llega al elemento a[1,1]
k=1/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+pivote)+j)*=k;
return true;
}
else {
for (i=pivote;i>0;i--) {
k=*(*(tabla2+i-1)+pivote)/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+i-1)+j)=*(*(tabla2+i-1)+j)-*(*(tabla2+pivote)+j)*k;
k=1/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+pivote)+j)*=k;
}
return invertir(--pivote,false);
}
}
}
int main() {
int dim, cont;
matriz *tabla;
cout<<"tttPROGRAMA QUE GENERA LA MATRIZ INVERSAnn";
while (cont!=1){
cout<<"1.- Ingresar Matrizn";
cout<<"2.-Salirn";
cout<<"Ingrese la opcion deseada:n ";
cin>>cont;
switch (cont){
case 1:
void matriz::llenar();
cout<<"Ingrese la dimension de la matriz: ";
cin>>dim;
tabla=new matriz(dim);
tabla->llenar();
cout<<endl<<"La matriz ingresada es:"<<endl;
tabla->imprimir(matriz::coef);
cout<<endl<<"La matriz ampliada es:"<<endl;
tabla->imprimir(matriz::ampliada);
if (tabla->invertir()) {
// Si la matriz se pudo invertir la muestra
cout<<endl<<"La matriz Inversa es:"<<endl;
tabla->imprimir(matriz::inversa);
}
else cout<<endl<<"DISCULPA, ***La matriz no tiene inversa***"<<endl;
getch();
}
}
}