Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- int int_pow(int base, int exp)
- {
- int result = 1;
- while (exp)
- {
- if (exp & 1)
- result *= base;
- exp /= 2;
- base *= base;
- }
- return result;
- }
- int WierszeMacierzy(char* skad ){
- FILE *fp;
- int i;
- if((fp=fopen(skad,"r"))==NULL){
- printf("Blad otwarcia pliku.\n");
- exit(1);
- }
- fscanf(fp,"%d",&i);
- fclose(fp);
- return i;
- }
- int KolumnyMacierzy(char* skad ){
- FILE *fp;
- int i;
- if((fp=fopen(skad,"r"))==NULL){
- printf("Blad otwarcia pliku.\n");
- exit(1);
- }
- fseek(fp,2,0);
- fscanf(fp,"%d",&i);
- fclose(fp);
- return i;
- }
- int ** alokuj(int wiersze, int kolumny){
- int ** tablica = NULL;
- int w, k;
- tablica = (int **)calloc(wiersze, sizeof(int *));
- for (w=0; w<wiersze; w++)
- *(tablica+w) = (int*) calloc(kolumny, sizeof(int));
- return tablica;
- }
- void wypelnij(int** tablica, int wiersze, int kolumny, char* skad){
- FILE *fp;
- if((fp=fopen(skad,"r"))==NULL){
- printf("Bladd otwarcia pliku.\n");
- exit(1);
- }
- fseek(fp,3,0);
- int w, k;
- for (w=0; w<wiersze; w++){
- for(k=0; k<kolumny; k++){
- fscanf(fp,"%d",&*(*(tablica+w)+k) );
- }
- }
- fclose(fp);
- return;
- }
- void drukuj(int** tablica, int wiersze, int kolumny){
- int w, k;
- for (w=0; w<wiersze; w++){
- for(k=0; k<kolumny; k++){
- printf("%d ", *(*(tablica+w)+k));
- }
- printf("\n");
- }
- return;
- }
- void zwolnij(int ***tablica, int wiersze){
- int w;
- for (w=0; w<wiersze; w++){
- free(*((*tablica)+w));
- }
- free(*tablica);
- *tablica = NULL;
- return;
- }
- int ObliczWyznacznik(int **tab, int rozmiar){
- int det=0, **minor;
- int i,kolumna,wers,kolumna_minor,kolumna_2;
- if(rozmiar==1) return det = *(*(tab+0)+0);
- if(rozmiar==2) return det = ((*(*(tab+0)+0) * *(*(tab+1)+1)) - (*(*(tab+0)+1) * *(*(tab+1)+0)));
- minor=(int **)calloc(rozmiar-1, sizeof(int*));
- for(i=0;i<rozmiar-1;i++)
- *(minor+i)=(int*)calloc(rozmiar-1, sizeof(int));
- for(kolumna=0;kolumna<rozmiar;kolumna++){
- for(kolumna_minor=0,kolumna_2=0;kolumna_minor<rozmiar-1;kolumna_minor++,kolumna_2++){
- for(wers=0;wers<rozmiar-1;wers++){
- *(*(minor+wers)+kolumna_minor)=*(*(tab+(wers+1))+kolumna_2);
- }
- }
- det+=( (*(*(tab+0)+kolumna)) * int_pow(-1,kolumna) * ObliczWyznacznik(minor,rozmiar-1) );
- }
- for(i=0; i<rozmiar-1; i++)
- free(*(minor+i));
- free(minor);
- return det;
- }
- int main(){
- int wiersze, kolumny, wynik;
- char sciezka[10];
- printf("Podaj sciezke pliku:\n");
- scanf("%s",&*sciezka);
- wiersze=WierszeMacierzy(sciezka);
- kolumny=KolumnyMacierzy(sciezka);
- int ** tab = alokuj(wiersze, kolumny);
- wypelnij(tab, wiersze, kolumny, sciezka);
- drukuj(tab, wiersze, kolumny);
- zwolnij(&tab, wiersze);
- wynik=ObliczWyznacznik(tab, wiersze);
- printf("Wyznacznik macierzy wynosi: %d\n", wynik);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment