Ir para conteúdo
Fórum Script Brasil
  • 0

C++ arredondando valores que não deveria, como resolver?


DanteAndante

Pergunta

Boa Tarde

eu estou fazendo um codigo em c++ para calcular a matriz inversa, está tudo certo se eu colocar valores inteiros, porém quando eu coloco valores decimais em uma matriz 3x3  a função que calcula o determinante está arredondando o resultado causando um erro no resultado final, alguém sabe como resolver isso?

codigo abaixo:

#include<iostream>
#include <cmath>
#define MAX 25


using namespace std;

double cofator(double matriza[MAX][MAX], int m, int linha, int coluna);
double determinante(double matriza[MAX][MAX], int m);
 

int main(){
    int i,j,m,a,b,n,h,w;
    int l=0,c=0;
    double matriza[MAX][MAX], matrizb[MAX][MAX],cofatores[MAX][MAX],inversa[MAX][MAX],transposta[MAX][MAX],det;

    cout << "\t\t\t\tPROGRAMA DE CALCULO DE MATRIZ INVERSA\n\n";


    cout<< "Digite a ordem da matriz quadrada: ";
    cin >> m;
    cout << "\n\nDigite a matriz A: \n";
    for(i=0;i<m;i++){
        for(j=0;j<m;j++){
            cin >> matriza[i][j];
        }
    }
    cout << "\n\nA matriz digitada foi: \n";
        for(i=0;i<m;i++){
            for(j=0;j<m;j++){
                cout<< "\t" << matriza[i][j];
            }
            cout <<"\n";
        }
        if(m==2){
        //CALCULO DO  DETERMINANTE

        det=(matriza[0][0]*matriza[1][1])-(matriza[0][1]*matriza[1][0]);

        cout << "\n\n Determinante: " << det<<"\n";

        if(det==0){
            cout << "A MATRIZ não PODE SER INVERTIDA!!";
        }else{

        //calculo dos cofatores
        for (h=0;h<m;h++)
        for (w=0;w<m;w++){
            l=0;
            c=0;
        //n=m-1;
        for(i=0;i<m;i++)
            for(j=0;j<m;j++)
                if(i!=h && j!=w){
                    matrizb[l][c]=matriza[i][j];

                    if(c<(m-2))
                        c++;
                        else{
                            c=0;
                            l++;
                        }
                    }
                   //cout<< "Matriz B: " <<matrizb[0][0];
                   cofatores[h][w]=matrizb[0][0];
                }

                for(h=0;h<m;h++){
                    for(w=0;w<m;w++){
                        cofatores[h][w]=pow(-1,(h+w+2))*cofatores[h][w];
                    }
                }


                cout << "\n\nA matriz dos cofatores: \n";
        for(h=0;h<m;h++){
            for(w=0;w<m;w++){
                cout<< "\t"  <<cofatores[h][w];
            }
            cout <<"\n";
        }

        //TRANSPONDO A MATRIZ DOS COFATORES

            for(h=0;h<m;h++){
                for(w=0;w<m;w++){
                    transposta[w][h]=cofatores[h][w];
                }
            }
            cout << "\n\nA matriz transposta dos cofatores: \n";
        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                cout<< "\t"  <<transposta[w][h];


            }
            cout <<"\n";
        }
        // CALCULO DA MATRIZ INVERSA


        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                inversa[w][h]=transposta[w][h]/det;


            }
        }
        cout << "\n\nA matriz inversa: \n";
        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                cout<< "\t"  <<inversa[w][h];


            }
            cout <<"\n";
        }

        }
        }if(m==1){
            matriza[0][0]=pow(matriza[0][0],-1);
            cout << "\n\nA matriz inversa: \n" << matriza[0][0];


        }if(m>=3){

             cout << "\n\n Determinante: " <<determinante(matriza,m)<<"\n";
             //cout << det;
             if(determinante==0){
                cout << "\n\nA MATRIZ não PODE SER INVERTIDA!!";
             }else{   //calculo dos cofatores
          

        for(i=0;i<m;i++){
             for(j=0;j<m;j++){
                cofatores[i][j] = cofator(matriza,m,i,j);
            }
            cout << "\n";
        }


         cout << "matriz dos cofatores: \n";
        for(i=0;i<m;i++){
             for(j=0;j<m;j++){
                //cout<<"\t" << cofator(matriza,m,i,j);
                cout << "\t" << cofatores[i][j];
            }
            cout << "\n";
        }
        //TRANSPONDO A MATRIZ DOS COFATORES

            for(h=0;h<m;h++){
                for(w=0;w<m;w++){
                    transposta[w][h]=cofatores[h][w];
                }
            }
            cout << "\n\nA matriz transposta dos cofatores: \n";
        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                cout<< "\t"  <<transposta[w][h];


            }
            cout <<"\n";
        }
        // CALCULO DA MATRIZ INVERSA


        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                inversa[w][h]=transposta[w][h]/determinante(matriza,m);


            }
        }
        cout << "\n\nMatriz inversa: \n";
        for(w=0;w<m;w++){
            for(h=0;h<m;h++){
                cout << "\t" << inversa[w][h];
            }
            cout << "\n";
        }


             }


        }else{
            cout<< "\n\n\t\tCALCULO DA MATRIZ INVERSA AINDA não PROGRAMADO\n\n";
        }


    return 0;
}
double determinante(double matriza[MAX][MAX], int m)
{
    int det=0.0;
    if (m == 1){
        det = matriza[0][0];
    }else{
        for(int j=0; j<m; j++){
            det = det + matriza[0][j] * cofator(matriza,m, 0, j);
        }
    }

    return det;

}
double cofator(double matriza[MAX][MAX], int m, int linha, int coluna)
{
   double  submatriz[MAX][MAX];
   int n=m-1;
   int a=0;
   int b=0;
    //int j;
   for (int i=0; i<m; i++){
    for (int j=0; j<m; j++){
        if (i !=linha && j !=coluna){
            submatriz[a][b] = matriza[i][j];
            b++;
            if (b >= n){
                a++;
                b=0;
            }
        }
     }
   }

   return pow(-1,linha+coluna)*determinante(submatriz, n);
}


 

imagem_2021-05-06_130035.png

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...