1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por migvas99, 11 de Janeiro de 2013. (Respostas: 1; Visualizações: 1862)

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

    dropko Power Member

    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!!!!
     

Partilhar esta Página