Guest User

Untitled

a guest
Nov 2nd, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. int int_pow(int base, int exp)
  6. {
  7.     int result = 1;
  8.     while (exp)
  9.     {
  10.         if (exp & 1)
  11.             result *= base;
  12.         exp /= 2;
  13.         base *= base;
  14.     }
  15.     return result;
  16. }
  17.  
  18. int WierszeMacierzy(char* skad ){
  19.  
  20.     FILE *fp;
  21.  
  22.     int i;
  23.  
  24.     if((fp=fopen(skad,"r"))==NULL){
  25.         printf("Blad otwarcia pliku.\n");
  26.         exit(1);
  27.     }
  28.  
  29.     fscanf(fp,"%d",&i);
  30.  
  31.  
  32.  fclose(fp);
  33.  
  34.  return i;
  35. }
  36.  
  37. int KolumnyMacierzy(char* skad ){
  38.  
  39.     FILE *fp;
  40.  
  41.     int i;
  42.  
  43.     if((fp=fopen(skad,"r"))==NULL){
  44.         printf("Blad otwarcia pliku.\n");
  45.         exit(1);
  46.     }
  47.  
  48.     fseek(fp,2,0);
  49.     fscanf(fp,"%d",&i);
  50.  
  51.  
  52.  fclose(fp);
  53.  
  54.  return i;
  55. }
  56.  
  57. int ** alokuj(int wiersze, int kolumny){
  58.     int ** tablica = NULL;
  59.     int w, k;
  60.  
  61.     tablica = (int **)calloc(wiersze, sizeof(int *));
  62.     for (w=0; w<wiersze; w++)
  63.         *(tablica+w) = (int*) calloc(kolumny, sizeof(int));
  64.  
  65.  return tablica;
  66. }
  67.  
  68. void wypelnij(int** tablica, int wiersze, int kolumny, char* skad){
  69.  
  70.     FILE *fp;
  71.  
  72.  
  73.  
  74.  
  75.     if((fp=fopen(skad,"r"))==NULL){
  76.         printf("Bladd otwarcia pliku.\n");
  77.         exit(1);
  78.     }
  79.  
  80.     fseek(fp,3,0);
  81.     int w, k;
  82.  
  83.         for (w=0; w<wiersze; w++){
  84.  
  85.             for(k=0; k<kolumny; k++){
  86.  
  87.             fscanf(fp,"%d",&*(*(tablica+w)+k) );
  88.  
  89.             }
  90.  
  91.         }
  92.  fclose(fp);
  93.  return;
  94. }
  95.  
  96. void drukuj(int** tablica, int wiersze, int kolumny){
  97.  int w, k;
  98.  
  99.     for (w=0; w<wiersze; w++){
  100.         for(k=0; k<kolumny; k++){
  101.             printf("%d ", *(*(tablica+w)+k));
  102.             }
  103.         printf("\n");
  104.         }
  105.  
  106.         return;
  107. }
  108.  
  109. void zwolnij(int ***tablica, int wiersze){
  110.  int w;
  111.  
  112.     for (w=0; w<wiersze; w++){
  113.         free(*((*tablica)+w));
  114.     }
  115.  
  116.  free(*tablica);
  117.  *tablica = NULL;
  118.  
  119.  return;
  120. }
  121.  
  122. int ObliczWyznacznik(int **tab, int rozmiar){
  123.     int det=0, **minor;
  124.     int i,kolumna,wers,kolumna_minor,kolumna_2;
  125.    
  126.     if(rozmiar==1) return det = *(*(tab+0)+0);
  127.     if(rozmiar==2) return det = ((*(*(tab+0)+0) * *(*(tab+1)+1)) - (*(*(tab+0)+1) * *(*(tab+1)+0)));
  128.    
  129.     minor=(int **)calloc(rozmiar-1, sizeof(int*));
  130.     for(i=0;i<rozmiar-1;i++)
  131.         *(minor+i)=(int*)calloc(rozmiar-1, sizeof(int));
  132.     for(kolumna=0;kolumna<rozmiar;kolumna++){
  133.         for(kolumna_minor=0,kolumna_2=0;kolumna_minor<rozmiar-1;kolumna_minor++,kolumna_2++){
  134.             for(wers=0;wers<rozmiar-1;wers++){
  135.                 *(*(minor+wers)+kolumna_minor)=*(*(tab+(wers+1))+kolumna_2);
  136.             }
  137.         }
  138.         det+=( (*(*(tab+0)+kolumna)) * int_pow(-1,kolumna) * ObliczWyznacznik(minor,rozmiar-1) );
  139.     }
  140.     for(i=0; i<rozmiar-1; i++)
  141.         free(*(minor+i));
  142.     free(minor);
  143.     return det;
  144. }
  145.  
  146. int main(){
  147.  
  148.     int wiersze, kolumny, wynik;
  149.     char sciezka[10];
  150.     printf("Podaj sciezke pliku:\n");
  151.     scanf("%s",&*sciezka);
  152.  
  153.  
  154.     wiersze=WierszeMacierzy(sciezka);
  155.     kolumny=KolumnyMacierzy(sciezka);
  156.  
  157.  
  158.     int ** tab = alokuj(wiersze, kolumny);
  159.             wypelnij(tab, wiersze, kolumny, sciezka);
  160.             drukuj(tab, wiersze, kolumny);
  161.             zwolnij(&tab, wiersze);
  162.             wynik=ObliczWyznacznik(tab, wiersze);
  163.     printf("Wyznacznik macierzy wynosi: %d\n", wynik);
  164.  
  165. return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment