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.
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);
}