Dúvida: Linguagem C - Inversão de matrizes

migvas99

Membro
Boas, estou a fazer um trabalho e surgiu-me um problema que não consigo resolver, por mais voltas que dê a isto.

Tive que fazer um programa que tendo 2 matrizes, visse se a 2ª era a inversa da 1ª. Quando as matrizes são fornecidas por teclado não houve problema, e o programa ficou a funcionar. Mas quando é para ler as matrizes a partir de ficheiros, e quando a matriz não é de ordem 2, isto não bate certo e diz sempre que não é a inversa, mesmo quando é. Já tive a fazer uns testes e consegui descobrir que o erro dá-se ao calcular a inversa da 1ª matriz, que depois naturalmente não irá bater certo com a 2ª.

Usei o mesmo método para calcular a inversa que usei na outra parte do programa, onde funciona perfeitamente, por isso não estou a conseguir perceber onde está o erro. Se alguém me conseguisse indicar a falha, ficaria agradecido.

Código:
#include<stdio.h>#include<stdlib.h>
#include <string.h>
#include <math.h>


int main() 
{
	FILE *FICH; 
	FILE *FICH1;
	char nome[100]="", drive[100]="", code[10]=":\\", extensao[10]=".txt",nome1[100]="", drive1[100]="", code1[100]=":\\", extensao1[10]=".txt";
	int **matriza, l, i, j, c, matrizb[10][10], matrizc[10][10], d, **matriza1, l1, i1, j1, c1,n, n1, flag=1, m;
	void arg(int *,int *, int *,int ,int );
	int det(int *,int *);


	FILE *FICHEIRO;
FICHEIRO=fopen("D:\\output-trabalho-fp.txt","w");


	printf("\nQual a drive onde reside o ficheiro com a primeira matriz?\n");
		scanf("%s", &drive);
	
	strcat(drive,code);
		
		printf("Qual o nome do ficheiro de texto que tem a primeira matriz?\n");
	scanf("%s", &nome);
	
	strcat(drive,nome);
	strcat(drive,extensao);




	FICH=fopen(drive, "r");
	if (FICH==NULL)
		{
			printf("\nFicheiro nao localizado\n\n");
			return main (); }
	else
	
fscanf(FICH, " %d", &n);
	c=n;
	l=n;
                matriza=(int**)malloc(l*sizeof(int *));
                for(i=0; i<l; i++)
                        matriza[i]=(int *)malloc(c*sizeof(int));
                        i=0;
                        j=0;
                        while(!feof(FICH)) {
                                fscanf(FICH, " %d", &matriza[i][j]);
                                if(j<c-1)
                                        j++;
                                else {
                                        i++;
                                        j=0;
                                }
                        }


printf("\nQual a drive onde reside o ficheiro com a segunda matriz?\n");
		scanf("%s", &drive1);
	
	strcat(drive1,code1);
		
		printf("Qual o nome do ficheiro de texto que tem a segunda matriz?\n");
	scanf("%s", &nome1);
	
	strcat(drive1,nome1);
	strcat(drive1,extensao1);




	FICH1=fopen(drive1, "r");
	if (FICH1==NULL)
		{
			printf("\nFicheiro nao localizado\n\n");
			return main (); }
	else
	
	fscanf(FICH1, " %d", &n1);
	c1=n1;
	l1=n1;
                matriza1=(int**)malloc(l1*sizeof(int *));
                for(i1=0; i1<l1; i1++)
                        matriza1[i1]=(int *)malloc(c1*sizeof(int));
                        i1=0;
                        j1=0;
                        while(!feof(FICH1)) {
                                fscanf(FICH1, " %d", &matriza1[i1][j1]);
                                if(j1<c1-1)
                                        j1++;
                                else {
                                        i1++;
                                        j1=0;
                                }
                        }
		
	
if(n == 2)
{
matrizc[0][0]=matriza[1][1];
matrizc[1][1]=matriza[0][0];
matrizc[0][1]=-matriza[0][1];
matrizc[1][0]=-matriza[1][0];
d=matriza[0][0]*matriza[1][1]-matriza[0][1]*matriza[1][0];
{
if(d==0)
{
printf("\n\n\n11A matriz B nao eh inversa da matriz A, porque a matriz A nao tem inversa.\n\n");
fprintf(FICH,"\n\n\nA matriz B nao eh inversa da matriz A, porque a matriz A nao tem inversa.\n\n");
}






else
	{
		if(n == n1 )
   {
    	for(i=0; i<n; i++)
    	{
     		for(j=0; j<n1; j++)
     		{
			if(matrizc[i][j] != matriza1[i][j])
			{
	   			flag = 0;
	   			break;
			}
     		}
   	}
		   if(flag == 1 )
	{printf("\n\n\n22A matriz B eh a inversa da matriz A.\n\n");
		   fprintf(FICH,"\n\n\nA matriz B eh a inversa da matriz A.\n\n");
		   }    else
	{printf("\n\n\n33A matriz B nao eh a inversa da matriz A.\n\n");
		   fprintf(FICH,"\n\n\nA matriz B nao eh a inversa da matriz A.\n\n");}
    }
   
    else {
    printf("\n\n\n44A matriz B nao eh a inversa da matriz A.\n\n");
	fprintf(FICH,"\n\n\nA matriz B nao eh a inversa da matriz A.\n\n"); }
}
}
return main();}


else
{
m=n;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
n=m;
arg(&matriza[0][0],&matrizb[0][0],&n,i,j);
matrizc[j][i]=pow(-1.0,(i+j))*det(&matrizb[0][0],&n);
}
}
n=m;
d=det(&matriza[0][0],&n);


{
	if(d==0)
{
printf("\n\n\n55A matriz B nao eh inversa da matriz A, porque a matriz A nao tem inversa.\n\n");
fprintf(FICH,"\n\n\nA matriz B nao eh inversa da matriz A, porque a matriz A nao tem inversa.\n\n");
}
	else
		{
		if(m == n1 )
   {
    	for(i=0; i<m; i++)
    	{
     		for(j=0; j<n1; j++)
     		{
			if(matrizc[i][j] != matriza1[i][j])
			{
	   			flag = 0;
	   			break;
			}
     		}
   	}
		if(flag == 1 )
	{printf("\n\n\n2A matriz B eh a inversa da matriz A.\n\n");
		fprintf(FICH,"\n\n\nA matriz B eh a inversa da matriz A.\n\n");}
    else {
	printf("\n\n\n3A matriz B nao eh a inversa da matriz A.\n\n");
	fprintf(FICH, "\n\n\nA matriz B nao eh a inversa da matriz A.\n\n"); 
	}
	
	}
    
	
    else {
    printf("\n\n\n4A matriz B nao eh a inversa da matriz A.\n\n");
	fprintf(FICH,"\n\n\nA matriz B nao eh a inversa da matriz A.\n\n"); }
    
} return main ();
}
}
free(FICH);
FICH=NULL;
free(FICH1);
FICH1=NULL;
printf("\n\n\n");
fprintf(FICH, "\n\n\n");
}


void arg(int *a,int *b,int *n,int x,int y)
{
int k,l,i,j;
for(i=0,k=0;i<*n;i++,k++)
{
for(j=0,l=0;j<*n;j++,l++)
{
if(i==x)
i++;
if(j==y)
j++;
*(b+10*k+l)=*(a+10*i+j);


}
}
*n=*n-1;
}


int det(int *p,int *n)
{
int d[10][10],i,j,m,sum=0;
m=*n;
if(*n==2)
return(*p**(p+11)-*(p+1)**(p+10));
for(i=0,j=0;j<m;j++)
{
*n=m;
arg(p,&d[0][0],n,i,j);
sum=sum+*(p+10*i+j)*pow(-1.0,(i+j))*det(&d[0][0],n);
}


return(sum);
}
 
isto é programação AND matemática. já nao me lembro de como inverter matrizes e olhar para esse código para descobrir...

faz prints, muitos prints!!!!
 
Back
Topo