Kod: Zaznacz cały
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
int **zbuduj_macierz(int rozmiar){
// Dynamiczna alokacja pamieci
int **macierz = new int*[rozmiar];
for(int i=0;i < rozmiar;i++){
macierz[i] = new int[rozmiar];
}
return macierz;
}
//Redukuje macierz poprzez wykreslenie nr_wiersza i nr_kolumny do wielkosci rozmiar-1
//Indeksy liczymy od 0 !
int **redukuj_macierz(int **macierz_pierwotna,int rozmiar,int nr_wiersza,int nr_kolumny){
int **macierz_zredukowana = zbuduj_macierz(rozmiar-1);
//i,k - beda przesuwac po macierzy pierwotnej
//j,l - po macierzy zredukowanej
for(int i=0,j=0;i<rozmiar;i++){
if(i==nr_wiersza)continue;
for(int k=0,l=0;k<rozmiar;k++){
if(k==nr_kolumny)continue;
else{
macierz_zredukowana[j][l] = macierz_pierwotna[i][k];
l++;
}
}
j++;
}
return macierz_zredukowana;
}
void wczytaj_graf(int **tab){
FILE * plik;
int rozmiar=0;
plik = fopen("graf.txt","r");
if(plik != NULL){
//Wczytuje macierz. Pomijajac pierwsza liczbe mowiaca o liczbie krawedzi
fscanf(plik,"%d",&rozmiar);
for(int i=0;i<rozmiar;i++){
for(int j=0;j < rozmiar;j++){
fscanf(plik,"%d",&tab[i][j]);
}
}
}else
printf("Plik graf.txt nie istnieje");
printf("Ilosc krawedzi: %d\n\n",rozmiar);
fclose(plik);
}
int wyznacznik(int **macierz, int rozmiar){
int det = 0,max = 0,nr_wiersza,licznik = 0;
//Dla macierzy stopnia 1x1 badz 2x2 wyznacznik obliczany z definicji
if(rozmiar == 1) return macierz[0][0];
if(rozmiar == 2) return (macierz[0][0]*macierz[1][1] - macierz[0][1]*macierz[1][0]);
//W innym przypadku rozwiniecie LaPlace'a
int **zredukowana_macierz;
//Szukam wiersza w ktorym jest najwiecej zer
for(int i=0;i < rozmiar;i++){
licznik = 0;
for(int j=0;j < rozmiar;j++){
if(macierz[i][j] == 0)licznik++;
}
if(licznik > max){
max = licznik;
nr_wiersza = i;
}
}
//Wybrany wiersz bedzie uzyty do wykreslania macierzy
//Teraz wykreslam odpowiednio macierz, licze wyznacznik dopelnienia i dodaje do wyniku
for(int i=0;i<rozmiar;i++){
zredukowana_macierz = redukuj_macierz(macierz,rozmiar,nr_wiersza,i);
// >:*
det += macierz[nr_wiersza][i]*pow((-1),(nr_wiersza+i))*(wyznacznik(zredukowana_macierz,rozmiar-1));
}
return det;
}
int main(){
FILE * plik;
plik = fopen("graf.txt","r");
int rozmiar=0;
int **tab;
if(plik == NULL) return 0;
//Wczytuje ilosc krawedzi
fscanf(plik,"%d",&rozmiar);
//Tworze macierz
tab = zbuduj_macierz(rozmiar);
//Wczytuje dane z pliku
wczytaj_graf(tab);
//Wypisuje zawartosc
for(int i=0;i < rozmiar;i++){
printf("%d. ",i+1);
for(int j=0;j<rozmiar;j++){
printf("%d ",tab[i][j]);
}
printf("\n");
}
cout <<"Wyznacznik macierzy wynosi: " << wyznacznik(tab,rozmiar) << endl;
//Sprzątamy po sobie
for(int i=0;i < rozmiar;i++){
delete tab[i];
}
delete tab;
fclose(plik);
}