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ę
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ę