Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - programma calcolo determinante
Forum - C/C++ - programma calcolo determinante

Avatar
alexanderc88 (Normal User)
Newbie


Messaggi: 1
Iscritto: 22/01/2008

Segnala al moderatore
Postato alle 23:30
Martedì, 22/01/2008
Cercasi con urgenza programma in ANSI c che calcoli il determinante di una qualsiasi matrice quadrata.Spero che possiate rispondere a questa mia richiesta........
:asd:

PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 15:25
Mercoledì, 23/01/2008
Io per cose scolastiche ho dovuto fare n programma che triangolarizzasse una matrice e poi che calcolasse di deterninante dalla matrice triangolarizzata.
Calcolare il det di una matrice triangolare è molto + facile ke calcolare il det di una matrice nn triangolare.
PS: il det della matrice e il det della matrice triangolarizzata sono uguali in modulo
Il segno può cambiare a causa dei cambiamenti di riga.
Codice sorgente - presumibilmente C/C++

  1. /**
  2. Tringolizza A e calcola il det
  3.  
  4. dimensioni di A: N x N
  5.  
  6. A va inizializzato nell'array di array "matrice"
  7. ESEMPIO:
  8.                 se A è:
  9.                   1 2 3
  10.                   4 5 6
  11.                   7 8 9
  12.                 la matrice sarà inizializzata così:
  13.                 #define N 3
  14.                 [...parte di codice...]
  15.                 float matrice[N][M] = {
  16.                     {1, 2, 3},
  17.                     {4, 5, 6},
  18.                     {7, 8, 9}
  19.                   };
  20.  
  21.  
  22. **/
  23.  
  24. #include <stdio.h>
  25.  
  26. #define N 4 /*dimensione A*/
  27. #define M N
  28. void print(float [][M]);
  29. void triangola(float [][M]);
  30. void swap(float [], float []);
  31. float detT(float [][M]);
  32.  
  33. int main() {
  34.   /*float matrice[N][M] = {
  35.     {0, 1, 5},
  36.     {4, 1, 6},
  37.     {2, 9, 8},
  38.   };*/
  39.   float matrice[N][M] = {
  40.     {0, 5, 1, 5},
  41.     {4, 10, 1, 6},
  42.     {2, 6, 9, 8},
  43.     {5, 89, 3, 96}
  44.   };
  45.  
  46.   print(matrice);
  47.   triangola(matrice);
  48.   print(matrice);
  49.   printf("Determinante della triangolare: %.4f\n",detT(matrice));
  50.   return 0;
  51. }
  52.  
  53. void print(float matrice[][M]) {
  54.   int i, j;
  55.   printf("\n -------------------------------------------------------\n");
  56.   for (i=0;i<N;i++) {
  57.     printf(" |");
  58.     for (j=0;j<M;j++) printf("%10.3f   ", *(*(matrice+i)+j));
  59.     printf(" |\n");
  60.   }
  61.   printf(" -------------------------------------------------------\n");
  62. }
  63.  
  64. void triangola(float a[][M]) {
  65.   int j=0, i=0, k=0, k2, l, noskip;
  66.   float alfa;
  67.   for (k=1;k<N;k++) {
  68.     noskip=0;
  69.     for (i=k;i<N;i++) {
  70.       if (a[k-1][j] == 0) {
  71.         for (l=k;l<N;l++)
  72.           if (a[l][j]!=0) {
  73.             noskip=1;
  74.             break;
  75.           }
  76.         /*printf("a[l][j] è %.3f\n", a[l][j]);*/
  77.         if (noskip==0) break; /*significa ke tutta la colonna
  78.               (da pivot in giù è uguale a 0) quindi di può passare alla prossima colonna*/
  79.         swap((a[l]), (a[k-1]));
  80.         /*a[k][j]=0;*/ /*utile poichè il computer sbaglia a fare i calcoli*/
  81.       }
  82.  
  83.       alfa=-(a[i][j]/a[k-1][j]);
  84.       /*printf("alfa: %.3f = -( %.3f / %.3f )\n", alfa, a[i][j], a[k-1][j]);*/
  85.       for (k2=j;k2<M;k2++) {
  86.         a[i][k2] = a[i][k2] + alfa*a[k-1][k2];
  87.         /*print(a);*/
  88.       }
  89.     }
  90.     j++;
  91.   }
  92. }
  93.  
  94. void swap(float a[], float b[]) {
  95.   int i=0;
  96.   float tmp;
  97.   for (i=0;i<M;i++) {
  98.     tmp=a[i];
  99.     a[i]=b[i];
  100.     b[i]=tmp;
  101.   }
  102. }
  103. float detT(float a[][M]) {
  104.   int i=0;
  105.   float det=1;
  106.   for (i=0;i<N;i++)
  107.     det*=a[i][i];
  108.   return det;
  109. }


PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 21:30
Mercoledì, 23/01/2008
Adesso mi sono reso conto che aggiungendo una semplice variabile posso fare in modo ke il segno rimanga giusto.
Riecco il codice senza problemi di segno.
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. #define N 4 /*dimensione A*/
  4. #define M N
  5.  
  6. int scambi=0;
  7.  
  8. void print(float [][M]);
  9. void triangola(float [][M]);
  10. void swap(float [], float []);
  11. float detT(float [][M]);
  12.  
  13. int main() {
  14.   /*float matrice[N][M] = {
  15.     {0, 1, 5},
  16.     {4, 1, 6},
  17.     {2, 9, 8},
  18.   };*/
  19.   float matrice[N][M] = {
  20.     {0, 5, 1, 5},
  21.     {4, 10, 1, 6},
  22.     {2, 6, 9, 8},
  23.     {5, 89, 3, 96}
  24.   };
  25.  
  26.   print(matrice);
  27.   triangola(matrice);
  28.   print(matrice);
  29.   printf("Determinante della triangolare: %.4f\n",detT(matrice));
  30.   return 0;
  31. }
  32.  
  33. void print(float matrice[][M]) {
  34.   int i, j;
  35.   printf("\n -------------------------------------------------------\n");
  36.   for (i=0;i<N;i++) {
  37.     printf(" |");
  38.     for (j=0;j<M;j++) printf("%10.3f   ", *(*(matrice+i)+j));
  39.     printf(" |\n");
  40.   }
  41.   printf(" -------------------------------------------------------\n");
  42. }
  43.  
  44. void triangola(float a[][M]) {
  45.   int j=0, i=0, k=0, k2, l, noskip;
  46.   float alfa;
  47.   for (k=1;k<N;k++) {
  48.     noskip=0;
  49.     for (i=k;i<N;i++) {
  50.       if (a[k-1][j] == 0) {
  51.         for (l=k;l<N;l++)
  52.           if (a[l][j]!=0) {
  53.             noskip=1;
  54.             break;
  55.           }
  56.         /*printf("a[l][j] è %.3f\n", a[l][j]);*/
  57.         if (noskip==0) break; /*significa ke tutta la colonna
  58.               (da pivot in giù è uguale a 0) quindi di può passare alla prossima colonna*/
  59.         swap((a[l]), (a[k-1]));
  60.         scambi++;
  61.         /*a[k][j]=0;*/ /*utile poichè il computer sbaglia a fare i calcoli*/
  62.       }
  63.  
  64.       alfa=-(a[i][j]/a[k-1][j]);
  65.       /*printf("alfa: %.3f = -( %.3f / %.3f )\n", alfa, a[i][j], a[k-1][j]);*/
  66.       for (k2=j;k2<M;k2++) {
  67.         a[i][k2] = a[i][k2] + alfa*a[k-1][k2];
  68.         /*print(a);*/
  69.       }
  70.     }
  71.     j++;
  72.   }
  73. }
  74.  
  75. void swap(float a[], float b[]) {
  76.   int i=0;
  77.   float tmp;
  78.   for (i=0;i<M;i++) {
  79.     tmp=a[i];
  80.     a[i]=b[i];
  81.     b[i]=tmp;
  82.   }
  83. }
  84. float detT(float a[][M]) {
  85.   int i=0;
  86.   float det=1;
  87.   for (i=0;i<N;i++)
  88.     det*=a[i][i];
  89.   if (scambi%2!=0) det = det *(-1);
  90.   return det;
  91. }


PM Quote