Advertisement
Guest User

calcolodeldeterminante

a guest
Aug 28th, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <QCoreApplication>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. /*
  6.  *
  7.  * http://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/767-calcolo-del-determinante.html
  8.  *
  9.  */
  10. #define colonne 3
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14.     QCoreApplication a(argc, argv);
  15.     int matrix[colonne][colonne];
  16.     //chiedo all'utente di inserirmi i valori della matrice
  17.     for(int I(0);I<colonne; I++){
  18.         for(int H(0); H<colonne; H++){
  19.             cout<<"matrix["<<I<<"]["<<H<<"] = ";
  20.             cin>>matrix[I][H];
  21.             cout<<endl;
  22.         }
  23.     }
  24.  
  25.     //inizializzo la diagonale e l'antidiagonale
  26.  
  27.     int diagonale(0);
  28.     int antidiagonale(0);
  29.  
  30.     //appoggio mi serve per moltiplicare tra di loro i membri di una diagonale
  31.     //lo sommo a "diagonale" che sarà la somma di tutti i prodotti delle diagonali
  32.     // e poi lo reimposto a 1 per l'iterazione successiva.
  33.     int appoggio = 1;
  34.  
  35.  
  36.     for(int H(0); H<colonne; H++){
  37.  
  38.         appoggio = 1;
  39.         /*
  40.          * Questo for serve per prendere gli elementi della diagonale maggiore
  41.          * e moltiplicarli tra di loro.
  42.          * la H serve per spostarmi di diagonale poichè le diagonali parallele
  43.          * si differenziano con l'indice della colonna aumentato di n
  44.          *
  45.          * il % lo utilizzo per resettare a 0 la colonna quando la somma di
  46.          * I+H raggiunge l'indice piu alto della colonna
  47.          * per esempio se ho una matrice 3x3 il limite massimo è 2
  48.          * quindi quando H+I arrivano a 3 a me servirebbe in realtà 0
  49.          * quindi -> 3%3 = 0   4%3 = 1
  50.          *
  51.          *
  52.          * questo perchè la regola di sarrus dice che bisogna riproporre le prime
  53.          * colonne della matrice accanto alle ultime per poter ottenere n diagonali
  54.          * complete dove n è le dimensioni della riga e della colonna ( una 3x3 avrà
  55.          * 3 diagonali  e cosi via)
  56.          *
  57.          */
  58.         for(int I(0);I<colonne; I++){
  59.             appoggio = appoggio *matrix[I][(I+H)%colonne];
  60.         }
  61.  
  62.         diagonale += appoggio;
  63.     }
  64.  
  65.     cout<<diagonale<<endl;
  66.  
  67.     //anti
  68.     for(int t(0); t<colonne;t++){
  69.  
  70.         appoggio = 1;
  71.         /*
  72.          * l'antidiagonale a differenza della diagonale
  73.          * ha l'indice di colonna e di riga inversamente
  74.          * proporzionali
  75.          * all'aumentare di uno diminuisce l'altro
  76.          * quindi utilizzo un for con due variabili
  77.          * una che aumenta fino al limite massimo
  78.          * e una che dal limite massimo decrementa fino a 0
  79.          *
  80.          *
  81.          * e con lo stesso principio di prima mi avvalgo di un ulteriore
  82.          * for a monte per farmi traslare da una diagonale all'altra. (t)
  83.          *
  84.          */
  85.         for(int I(colonne-1), H(0); I>=0; I--,H++){
  86.             appoggio = appoggio * matrix[I][(H+t)%colonne];
  87.         }
  88.  
  89.         antidiagonale += appoggio;
  90.     }
  91.  
  92.     cout<<"anti = "<<antidiagonale<<endl;
  93.     cout<< "determinante = "<<diagonale-antidiagonale<<endl;
  94.     return a.exec();
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement