Advertisement
MagnusArias

PO1 | Wyznacznik

Oct 27th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. double det(double **, int);
  5. double ** matrix_alloc( int );
  6. void matrix_free( double** , int);
  7.  
  8. int main()
  9. {
  10.     FILE* plik;
  11.     if ((plik = fopen("mat5.txt", "r")) == NULL)
  12.         printf("blad z otwarciem pliku");
  13.  
  14.     int N = -1;
  15.     fscanf(plik, "%d\n", &N);
  16.     printf("%d\n", N);
  17.  
  18.     double** tab = matrix_alloc(N);
  19.  
  20.     for (int i = 0; i < N; i++){
  21.         for (int j = 0; j < N; j++){
  22.             fscanf(plik, "%lf ", &tab[i][j]);
  23.         }
  24.         fscanf(plik, "\n");
  25.     }
  26.  
  27.     fclose(plik);
  28.  
  29.     for (int i = 0; i < N; i++){
  30.         for (int j = 0; j < N; j++){
  31.             printf("%.2lf    \t", tab[i][j]);
  32.         }
  33.         printf("\n");
  34.     }
  35.  
  36.     printf("Wyznacznik wynosi: %f", det((double**)tab, N));
  37.  
  38.     matrix_free(tab, N);
  39.     getchar();
  40.     return 0;
  41. }
  42.  
  43. double ** matrix_alloc( int N ){
  44.     double **tab = (double**)malloc(sizeof(double*) * N);
  45.     for (int i = 0; i < N; i++)
  46.         tab[i] = (double*)malloc(sizeof(double) * N);
  47.  
  48.     return tab;
  49. }
  50.  
  51.  
  52. void matrix_free (double ** tab, int N){
  53.     for (int i = 0; i < N; i++)
  54.         free(tab[i]);
  55.  
  56.     free(tab);
  57. }
  58.  
  59. double det(double ** matrix, int n)
  60. {
  61.     double** minor;
  62.     double sum = 0.0;
  63.     double sign = 1.0;
  64.     int i;
  65.  
  66.     if (n == 1) return matrix[n-1][n-1];
  67.     if (n == 2) return matrix[n - 1 - 1][n - 1 - 1] * matrix[n - 1][n - 1] - matrix[n - 1][n - 1 - 1] * matrix[n - 1 - 1][n - 1];
  68.    
  69.     minor = matrix_alloc(n-1);
  70.  
  71.     for (i = 0; i < n; i++)
  72.     {
  73.         for (register int k = 1, mi = 0; k < n; k++, mi++)
  74.         {
  75.             for (register int j = 0, mj = 0; j < n; j++, mj++)
  76.             {
  77.                 if (j == i) mj--;
  78.                 else minor[mi][mj] = matrix[k][j];
  79.             }
  80.         }
  81.     }
  82.  
  83.     sum += sign * matrix[0][i] * det(minor,n-1);
  84.  
  85.     sign = -sign;
  86.  
  87.     matrix_free(minor,n-1);
  88.     return sum;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement