×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Language: C
Posted by: Damian Pytkowski
Added: Oct 13, 2016 10:44 PM
Views: 2126
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. double ** alokujMacierz(int n){
  5.         int i=0;
  6.         double ** matrix;
  7.         matrix = (double **)malloc(n*sizeof(double *));
  8.         for(i=0;i<n;i++)
  9.                 matrix[i]=(double *)malloc(n*sizeof(double));
  10.         return matrix;
  11. }
  12.  
  13. double ** wczytaj(int * dlugosc){
  14.         FILE * fr;
  15.         int i,j;
  16.         double ** tab=NULL;
  17.        
  18.         fr=fopen("dane.txt","r");
  19.         fscanf(fr,"%d",dlugosc);
  20.        
  21.         tab=alokujMacierz(*dlugosc);
  22.        
  23.         for(i=0;i<*dlugosc;i++)
  24.                 for(j=0;j<*dlugosc;j++)
  25.                         fscanf(fr,"%lf",&tab[i][j]);
  26.         fclose(fr);
  27.         return tab;
  28. }
  29. void wyswietl(double ** tab,int dlugosc){
  30.         int i,j;
  31.         for(i=0;i<dlugosc;i++){
  32.                 for(j=0;j<dlugosc;j++)
  33.                         printf("%4.1lf\t",tab[i][j]);
  34.                 printf("\n");
  35.         }
  36. }
  37. void czysc(double ** tab,int dlugosc){
  38.         int i;
  39.         for(i=0;i<dlugosc;i++)
  40.                 free(tab[i]);
  41.         free(tab);
  42.         tab=NULL;
  43. }
  44.  
  45. double liczWyznacznik(double ** matrix, int n)
  46. {
  47.         double** minor;
  48.         double sum=0.0;
  49.         double sign=1.0;
  50.         int i,p,q,s=0;
  51.         if(n==1) return matrix[0][0];
  52.         if(n==2) return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
  53.         minor=alokujMacierz(n-1);
  54.         for(i=0;i<n;i++){
  55.                
  56.                 for(p=0;p<n-1;p++){
  57.                         s=0;
  58.                         for(q=0;q<n-1;q++)
  59.                                 if(q!=i){
  60.                                         minor[p][q]=matrix[p+1][q+s];
  61.                                 }
  62.                                 else{
  63.                                         s=1;
  64.                                         minor[p][q]=matrix[p+1][q+s];
  65.                                 }
  66.                 }
  67.                
  68.                 sum+=sign*matrix[0][i]*liczWyznacznik(minor,n-1);
  69.                 sign = -sign;
  70.         }
  71.         czysc(minor,n-1);
  72.         return sum;
  73. }
  74. int main(){
  75.         double ** tab=NULL,wynik;
  76.         int dl;
  77.         tab = wczytaj(&dl);
  78.         wynik=liczWyznacznik(tab,dl);
  79.         wyswietl(tab,dl);
  80.         printf("Wyznacznik = %.2lf\n",wynik);
  81.         czysc(tab,dl);
  82. }