[C++] Podstawowy program - wyznacznik macierzy.

Monia ^^

Nowicjusz
Dołączył
18 Wrzesień 2006
Posty
3 426
Punkty reakcji
3
Wiek
31
Witam :)
Wiem, że to dość "podstawowe podstawy", ale będę wdzięczna, jeśli jakaś dobra dusza powie mi, dlaczego program zawsze zwraca mi 0 jako wyznacznik macierzy. :)

#include <iostream>
#include <math.h>

using namespace std;

class macierz
{
int n, m;
int tab[11][11];
public:
macierz()
{
n=0;
m=0;
};

void wczytaj();
void wypisz();
int det();
macierz usun(int);
friend macierz operator*(macierz, macierz);
friend macierz operator+(macierz, macierz);
friend macierz operator*(int, macierz);


}A, B, C, D;


void macierz::wczytaj()
{
cout << "Podaj liczbe wierszy: ";
cin >> n;
cout << endl << "Podaj liczbe kolumn: ";
cin >> m;

for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cout << "A["<<i+1<<"]["<<j+1<<"]= ";
cin >> tab[j];
cout << endl;
}
}

void macierz::wypisz()
{
if((n>0)&&(m>0))
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout << tab[j]<< " ";
cout << endl;
}
}
else cout << "Macierz zerowa" << endl;
}

macierz operator+(macierz A, macierz B)
{
macierz C;

if((A.n!=B.n)||(A.m!=B.m))
{
cout << "Wymiary macierzy sie nie zgadzaja!" << endl;
}
else
{ C.n=A.n; C.m=A.m;
for(int i=0; i<A.n; i++)
for(int j=0; j<A.m; j++)
C.tab[j]=A.tab[j]+B.tab[j];
}
return C;
}

macierz operator*(int a, macierz A)
{
macierz B;
B.n=A.n; B.m=A.m;
for(int i=0; i<B.n; i++)
for(int j=0; j<B.m; j++)
B.tab[j]=a*A.tab[j];
return B;
}

int potega(int a)
{
if(a%2==0) return 1;
else return -1;
}

macierz macierz::usun(int l)
{
macierz M;
M.n=n-1;
M.m=m-1;
for(int i=0; i<M.n; i++)
for(int j=0; j<l; j++)
M.tab[j]=tab[j];
for(int i=0; i<M.n; i++)
for(int j=l; j<M.m; j++)
M.tab[j]=tab[j+1];
return M;
}

int macierz::det()
{
int x=0;
if(n!=m) return 0;
else
{

if(n==1) return tab[0][0];
else
{
for(int i=0; i<n; i++)
{
x+= (potega((n+i))*tab[n]*usun(i).det());
}
return x;
}
}


}

int main()
{
A.wczytaj();
cout << A.det() << endl;

system("pause");
}

Z góry dziękuję :)
 

Cyr4x

Nowicjusz
Dołączył
31 Lipiec 2010
Posty
638
Punkty reakcji
20
Zwraca Ci dokładnie x jaki ustalasz na początku w metodzie macierz::det, czyli z linijki int x=0; Jakąkolwiek liczbę tam wpisałem zamiast 0, to właśnie ją zwracało. Znaczy to, że w tym wzorze w pętli poniżej coś jest źle. Zresztą zapewne chcesz liczyć metodą laplace'a, wtedy ten wzór na pewno jest źle.

Tu masz ładnie opisaną metodę liczenia wyznacznika:
http://www.matmana6.pl/tablice_matematyczne/studia/macierze_i_wyznaczniki/124-obliczanie_wartosci_wyznacznika_metoda_laplacea

Zobacz zwłaszcza przykład z macierzą 4x4, który dowodzi, że do laplace'a jedno przejście pętli nie wystarczy - najpierw z macierzy 4x4 wychodzi Ci liczba * macierz 3x3 i z niej liczysz ponownie metodą laplace'a, z czego wychodzi liczba * macierz 2x2, itd.
 
Dołączył
19 Maj 2017
Posty
126
Punkty reakcji
6
Wiek
47
Po co jest zadeklarowane 0 w n i m na samym początku?
Rozumiem że to wartość początkowa ale chyba łatwiej było by zacząć program od przyjęcia wartości z klawiatury...
czyli od tego:

cout << "Podaj liczbe wierszy: ";
cin >> n;
cout << endl << "Podaj liczbe kolumn: ";
cin >> m;
 
Do góry