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
Circonferenza - Sistema.c

Sistema.c

Caricato da: Poggi Marco
Scarica il programma completo

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "Sistema.h"
  5.  
  6. void inizializzaMatrice(Tmatrice *nuova, int dimensione)
  7. {
  8.         nuova->lato=abs(dimensione);
  9.         int elementi, i;
  10.         elementi=nuova->lato * nuova->lato;
  11.         nuova->elementi=(double *) malloc(elementi * sizeof(double));
  12.         for (i = 0; i < elementi; i++)
  13.                 nuova->elementi[i]=0.0;
  14. }
  15.  
  16. void deallocaMatrice(Tmatrice *vecchia)
  17. {
  18.         if (vecchia->elementi != NULL)
  19.         {
  20.                 int i, j;
  21.                 i=0;
  22.                 while (i < vecchia->lato)
  23.                 {
  24.                         j=0;
  25.                         while (j < vecchia->lato)
  26.                         {
  27.                                 setElemento(*vecchia, i, j, 0.0);
  28.                                 j++;
  29.                         }
  30.                         i++;
  31.                 }
  32.                 free(vecchia->elementi);
  33.                 vecchia->elementi=NULL;
  34.                 vecchia->lato=0;
  35.         }
  36. }
  37.  
  38. void setElemento(Tmatrice matrix, int riga, int colonna, double valore)
  39. {
  40.         int posizione;
  41.         posizione=riga * matrix.lato + colonna;
  42.         if (posizione<0 || posizione >= (matrix.lato * matrix.lato))
  43.                 return;
  44.         matrix.elementi[posizione]=valore;
  45. }
  46.  
  47. double getElemento(Tmatrice matrix, int riga, int colonna)
  48. {
  49.         int posizione;
  50.         posizione=riga * matrix.lato + colonna;
  51.         if (posizione<0 || posizione >= (matrix.lato * matrix.lato))
  52.                 return 0.0;
  53.         return matrix.elementi[posizione];
  54. }
  55.  
  56. void stampaMatrice(Tmatrice matrix)
  57. {
  58.         int i, j;
  59.         double valore;
  60.         printf("\nStampa della matrice:\n");
  61.         for (i=0; i < matrix.lato; i++)
  62.         {
  63.                 for (j=0; j < matrix.lato; j++)
  64.                 {
  65.                         valore=getElemento(matrix, i, j);
  66.                         printf("%8.3lf  ", valore);
  67.                 }
  68.                 printf("\n");
  69.         }
  70. }
  71.  
  72. double determinante(Tmatrice matrix)
  73. {
  74.         if (matrix.lato == 1)
  75.                 return getElemento(matrix, 0, 0);
  76.         if (matrix.lato == 2)
  77.                 return getElemento(matrix, 1, 1) * getElemento(matrix, 0, 0) - getElemento(matrix, 1, 0) * getElemento(matrix, 0, 1);
  78.         Tmatrice subMatrix;
  79.         double det=0.0, segno=0.0;
  80.         int passo, perno;
  81.         perno=1;
  82.         inizializzaMatrice(&subMatrix, matrix.lato - 1);
  83.         for (passo = 0; passo < matrix.lato; passo++)
  84.         {
  85.                 segno=complemento(matrix, subMatrix, passo, perno);
  86.                 det += segno * getElemento(matrix, passo, perno) * determinante(subMatrix);
  87.         }
  88.         deallocaMatrice(&subMatrix);
  89.         return det;
  90. }
  91.  
  92. double complemento(Tmatrice originale, Tmatrice travaso, int riga, int colonna)
  93. {
  94.         int i, j, subRiga, subColonna;
  95.         for (i = 0; i < travaso.lato; i++)
  96.                 for (j = 0; j < travaso.lato; j++)
  97.                 {
  98.                         subRiga=i < riga ? i: i + 1;
  99.                         subColonna=j < colonna ? j: j + 1;
  100.                         setElemento(travaso, i, j, getElemento(originale, subRiga, subColonna));
  101.                 }
  102.         return ((riga + colonna) % 2) == 0 ? 1.0: -1.0;
  103. }
  104.  
  105. int invertibile(Tmatrice matrix, Tmatrice risultato)
  106. {
  107.         double det, segno, subDet;
  108.         int i, j;
  109.         Tmatrice subMatrix;
  110.         if ((matrix.lato != risultato.lato) || (matrix.lato < 1))
  111.                 return 0;
  112.         det=determinante(matrix);
  113.         if (fabs(det) < 1e-80)
  114.         {
  115.                 return 0;
  116.         }
  117.         inizializzaMatrice(&subMatrix, matrix.lato - 1);
  118.         for (i=0; i < matrix.lato; i++)
  119.         {
  120.                 for (j=0; j < matrix.lato; j++)
  121.                 {
  122.                         segno=complemento(matrix, subMatrix, i, j);
  123.                         subDet=segno * determinante(subMatrix) * (1.0 / det);
  124.                         setElemento(risultato, j, i, subDet);
  125.                 }
  126.         }
  127.         deallocaMatrice(&subMatrix);
  128.         return 1;
  129. }