#include #include #include typedef double elemento; /* In questo modo se dovremo riusare il codice per allocare ad esempio delle matrici di long double bastera' cambiare la definizione di "elemento" come long double e tutto il resto del codice sara' riutilizzabile */ typedef elemento ** Matrice; Matrice CreaMatrice(const int nrighe, const int ncol); Matrice RiempiMatrice(FILE *ifp,const int nrighe,const int ncol); elemento Determinante(const Matrice mat, const int nrighe, const int ncol); void DeallocaMatrice(Matrice a, const int nrighe); int main(int argc, char *argv[]) { int n=0; FILE *ifp; Matrice M; elemento det; if (argc<2) { fprintf(stderr,"Uso: >> determinante nome_file_dati \n"); exit(1); } ifp=fopen(argv[1],"r"); if(ifp == NULL){ fprintf(stderr,"Impossibile aprire il file %s \n",argv[1]); exit(1); } /* In vista di un'estensione a matrici n X n chiede in inpt la dimensione della matrice */ printf("Inserisci la dimensione della matrice\n"); scanf("%d",&n); /* Riempie la matrice M con i punti letti dal file in input; la matrice viene allocata e inizializzata in RiempiMatrice */ M = RiempiMatrice(ifp,n,n); fclose(ifp); /* Calcola il determinante */ det = Determinante(M,n,n); /* Lo stampa in output */ printf("Il determinante della matrice inserita in %s vale %lf\n",argv[1],det); /* E' buona abitudine deallocare le cose allocate quando non le utilizziamo piu' */ DeallocaMatrice(M,n); return(0); } Matrice CreaMatrice(const int nrighe,const int ncol){ Matrice p; int i; /* Alloca il puntatore alla matrice, cioe' ad un vettore di puntatori, uno per ciascuna riga */ p=(Matrice)malloc(nrighe*sizeof(elemento*)); /* Controlla che l'allocazione abbia avuto successo */ if(p==NULL) { fprintf(stderr,"Non ho abbastanza spazio per allocare una matrice\n"); exit(1); } for(i=0; ii){ Minori[i][j-1][k-1] = M[j][k]; } } } } /* Quindi calcolo il determinante ricorsivamente: invoco ancora la funzione Determinante, ma con dimensione minore; non appena ho raggiunto dei minori di dimensione pari a 3 la ricorsione termina, essendomi ricondotto ad un "caso base" che non necessita di invocare ulteriormente Determinante ma puo' essere calcolato direttamente. */ for(i=0;i