zrobilem juz jakas czesc tylko sa tu bledy
Mnożenie wychodzi tylko wtedy, gdy jedna z macierzy jest kwadratowa, oraz gdy 2 macierz ma najwyżej o jedną kolumnę więcej, tzn. mnoży np macierze 2x2 X 2x3, a np. 2x2 X 2x4 już nie.
Wyznacznik jest funkcją, która jest w klasie macierz_k. Problem jest taki, że wyznacznik moge policzyć tylko o takich wymiarach, jakie miala pierwsza macierz którą mnożyłem. A to kod
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
class macierz2d
{
int w;
int k;
public:
void wyswietl (int w, int k, double **tab);
void wyswietl2(int w, int k, double **M);
void usun(int w, int k, double **tab);
void wprowadz(int w, int k, double **tab);
void mnozenie(int w, int k, double **A, double **T, double **C);
void transponowanie(int w, int k, double **C, double **M);
};
class macierz_k : public macierz2d
{
int w;
int k;
public:
void wyznacznik(double **t, int w, int k);
};
void macierz2d::wyswietl(int w, int k, double **tab)
{
for (int i=0; i<w; i++)
{
for (int j=0; j<k; j++)
{
cout <<""<< tab[i][j] << " " ;
}
cout << "\n" << endl;
}
}
void macierz2d::wyswietl2(int w, int k, double **M)
{
for (int i=0; i<k; i++)
{
for (int j=0; j<w; j++)
{
cout <<""<< M[j][i] << " " ;
}
cout << "\n" << endl;
}
}
void macierz2d::usun(int w, int k, double **tab)
{
for (int i=0; i<w; i++)
delete [] tab[i];
delete [] tab;
}
void macierz2d::wprowadz(int w, int k, double **tab)
{
for(int i=0; i<w; i++)
{
cout << "Wiersz " << 1+i << ": " << endl;
for(int j=0; j<k; j++)
{
cin >> tab[i][j];
}
}
}
void macierz2d::mnozenie(int w, int k, double **A, double **T, double **C)
{
for(int i = 0; i < w; i++)
for(int j = 0; j < k; j++)
C[i][j] = 0;
for(int i = 0; i < w; i++)
for(int j = 0; j < k; j++)
for(int p=0; p<k; p++)
for(int z=0 ; z<w ; z++)
C[i][j]=C[i][j] + A[i][p] * T[z][j];
}
void macierz2d::transponowanie(int w, int k, double **C, double **M)
{
for(int i=0 ; i<w; i++)
for(int j=0; j<k; j++)
M[j][i]=C[i][j];
}
void macierz_k::wyznacznik(double **t, int w, int k)
{
double det= 0;
double p=1;
if(k==1)
{
det = t[0][0];
}
else
{
if(k==2)
{
det = (t[0][0]*t[1][1] - t[1][0]*t[0][1]);
cout << "wyznacznik: " << det << endl;
}
else
{
if(k==3)
{
det = (t[0][0]*t[1][1]*t[2][2] + t[0][1]*t[1][2]*t[2][0] + t[0][2]*t[1][0]*t[2][1] - t[0][2]*t[1][1]*t[2][0] - t[0][0]*t[1][2]*t[2][1] - t[0][1]*t[1][0]*t[2][2]);
cout << "wyznacznik: " << det << endl;
}
}
for(int i=0; i<w; i++)
delete[] t[i] ;
delete[] t;
}
}
int main()
{
macierz2d matrix1, matrix2, wynik;
macierz_k wyzn;
int w;
int k;
int i;
int j;
double **A;
double **T;
double **C;
double **M;
double **t;
double **tab;
cout << "\t\tWartosci wprowadzasz wierszami, zaczynajac od lewej strony!!\n" << endl;
cout << "\nIle wierszy ma byc? ";
cin >> w;
cout << "Ile kolumn ma byc? ";
cin >> k;
A=new double*[w];
for (int i=0; i<w; i++)
A[i]=new double [k];
for (int i=0; i<w; i++)
for (int j=0; j<k; j++)
A[i][j] = i + j;
cout << "Macierz nr 1" << endl;
matrix1.wprowadz(w,k,A);
cout << "Macierz nr 1" << endl;
matrix1.wyswietl(w,k,A);
cout << "\nIle wierszy ma byc? ";
cin >> w;
cout << "Ile kolumn ma byc? ";
cin >> k;
T=new double*[w];
for (int i=0; i<w; i++)
T[i]=new double [k];
for (int i=0; i<w; i++)
for (int j=0; j<k; j++)
T[i][j] = i + j;
cout << "Macierz nr 2" << endl;
matrix2.wprowadz(w,k,T);
cout << "Macierz nr 2" << endl;
matrix2.wyswietl(w,k,T);
C=new double*[w];
for (int i=0; i<w; i++)
C[i]=new double [k];
for (int i=0; i<w; i++)
for (int j=0; j<k; j++)
C[i][j] = i + j;
wynik.mnozenie(w,k,A,T,C);
cout << "Wynik Mnozenia:" << endl;
wynik.wyswietl(w,k,C);
M=new double*[k];
for (int j=0; j<k; j++)
M[j]=new double [w];
for (int j=0; j<k; j++)
for (int i=0; i<w; i++)
M[j][i] = j + i;
wynik.transponowanie(w,k,C,M);
cout << "Wynik Transponowania:" << endl;
wynik.wyswietl2(w,k,C);
cout << "\nIle wierszy ma byc? ";
cin >> w;
cout << "Ile kolumn ma byc? ";
cin >> k;
t=new double*[w];
for (int i=0; i<w; i++)
t[i]=new double [k];
for (int i=0; i<w; i++)
for (int j=0; j<k; j++)
t[i][j] = i + j;
cout << "Macierz wyzn" << endl;
wyzn.wprowadz(w,k,t);
cout << "Macierz wyzn:" << endl;
wyzn.wyswietl(w,k,t);
wyzn.wyznacznik(t,w,k);
matrix1.usun(w,k,A);
matrix2.usun(w,k,T);
wynik.usun(w,k,C);
_getch();
return 0;
}