Jump to content
Fórum Script Brasil
  • 0

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


Question

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 to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      149403
    • Total Posts
      645891
×
×
  • Create New...