Cita:
Iniciado por Fw190 No es igual. Estás invadiendo zonas de memoria que no corresponden, por ejemplo la correspondiente a otras variables de tu programa (cuyo valor ya no será el que debe), o, incluso, áreas de memoria correspondientes a otros programas o procesos que estén presentes en tu sistema en un momento dado. Lo normal es que te encuentres desde un error de violación de segmento hasta el más absoluto de los cuelgues.
Sisi está todo corregido, muchas gracias.
Por cierto me podrías recomendar algún libro bueno sobre c++?
Por si a alguien le interesa quedo esto:
Código C++:
Ver original#include <iostream>
using namespace std;
int main ()
/*Este programa pide al usuario una matriz de orden n la diagonaliza por el
metodo de Gauss-Jordan sin pivote y calcula su inversa*/
{
//Genero las variables, la matriz, la pido al usuario y la muestro por pantalla
int n;double long t;int w;
cout<<"Introduzca el orden de la matriz:"<<endl;
cin>>n;int q=n;
double A[n][(2*n)];double B[n][n];
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
cout<<"Introduzca el elemento de la fila "<<i+1<<" y la columna "<<k+1<<endl;
cin>>A[i][k];
}
}
cout<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
cout<<A[i][k]<<" ";
if(k==n-1){cout<<endl;}
}
}
//Genero la matriz identidad
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==i){B[i][j]=1.0;}
else{B[i][j]=0.0;}
}
}
//Acoplo la matriz identidad para trabajar con ella
for(int j=0;j<n;j++){
int a=0;
for(int i=n;i<2*n;i++){
A[j][i]=B[j][a];
a++;
}
}
//Muestro la matriz con la que voy a trabajar
cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
//Triangulo la matriz
int u=2;
for(int i=0;i<n;i++){
for(int k=i+1;k<n;k++){
//Activo este bucle para evitar que el programa divida por 0 (el pivote sea 0)
if(A[i][i]==0){
double sum =0.0;
for(int x=i+1;x<n;x++){
if(A[x][i]!=0){sum=1;break;}
sum=sum+A[x][i];
}
if(sum==0){u=1;break;}
}
if(u==1){break;}
int a=i+1;
//Permutamos las filas mientras el pivote sea 0
while(A[i][i]==0){
for(int s=0;s<2*n;s++){
int p = A[i][s];A[i][s]=A[a][s];A[a][s]=p;
}
a++;
}
t=A[k][i]/A[i][i];
for(int j=0;j<2*n;j++){
if(u==1){break;}
A[k][j]=A[k][j]-t*A[i][j];
}
}
}
cout<<endl<<endl;
//Muestro la matriz triangulada
cout<<"La matriz triangulada es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
//Aplico Gauss-Jordan
for(int i=0;i<n;i++){
q--;w=q;
for(int k=i+1;k<n;k++){
w--;
t=A[w][q]/A[q][q];
for(int j=0;j<2*n;j++){
A[w][j]=A[w][j]-t*A[q][j];
}
}
}
for(int i=0;i<n;i++){
for(int j=n;j<2*n;j++){
A[i][j]=A[i][j]/A[i][i];
}
A[i][i]=1;
}
//Muestro la matriz diagonalizada y la inversa:
cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
}