Mnożenie macierzy przy pomocy przeładowania operatora *

0

Próbuje napisać program do mnożenia macierzy. O to kod:

#include <cstdlib>
#include <iostream>
using namespace std;
class macierz
{
      private:
              float tab[6][6];
              int wiersz,kolumna;
      public:
             float mnozenie(float tab1[6][6],float tab2[6][6]);
             void wypisz();
             void nowa();
             macierz operator*(macierz&);
      };
//-----------wypisywanie macierzy-----------------------------------------------
void macierz::wypisz()
{
     int i,j;
     for(i=0;i<wiersz;i++)
       {
        for(j=0;j<kolumna;j++) 
        {
          cout<<tab[i][j]<<" ";
          if(j==kolumna-1)
          {
            cout<<endl;             
              }                   
            }
         }
     }
//----------konstruktor ------------nowa macierz-------------------------------
void macierz::nowa()
{
     int i,j;
     cout<<"Podaj rozmiar macierzy\n Liczba wierszy:";
    cin>>wiersz;
    cout<<"Liczba kolumn:";
    cin>>kolumna; 
    cout<<"Podaj wartosci macierzy (wierszami)\n";
      for(i=0;i<wiersz;i++)
       {
        for(j=0;j<kolumna;j++) 
        {
          cin>>tab[i][j];                   
          }                     
        }
     }
//--------- operator * ---------------------------------------------------------
macierz macierz::operator*(macierz& mac)
{
        macierz temp;
        int i,j,k;
        for(i=0;i<wiersz;i++)               //mnożenie
       {
        for(k=0;k<kolumna;k++)
        {
        for(j=0;j<kolumna;j++) 
        {
          temp.tab[i][k]=0;
          temp.tab[i][k]=temp.tab[i][k]+ (tab[i][j]* mac.tab[j][k]);                   
              }                     
            }                   
          }
          return temp;
        }
//-------------funkcja głowan main ---------------------------------------------
int main(int argc, char *argv[])
{
    macierz m1,m2,m3;              //deklaracja
      
    m1.nowa();
    m1.wypisz();
    m2.nowa();
    m2.wypisz();
    m3=m1*m2;                      //mnożenie przeładowanym operatorem *
    m3.wypisz();
    system("PAUSE");
    return 0;
}

Program nie wyświetla macierzy po wymnożeniu. Nie wiem dlaczego, może mógłby ktoś zerknąć na to.
Z góry dziekuje

0
kamciok napisał(a)

Program nie wyświetla macierzy po wymnożeniu. Nie wiem dlaczego, może mógłby ktoś zerknąć na to.
Z góry dziekuje

Wydaje mi się, że nie ma czego wyświetlać, nigdzie bowiem w macierzy m3 nie są zainicjowane jej składowe zawierające wymiary.....

0

zwracasz obiekt 'temp' o nie ustalonej wartości 'wiersz' i kolumna .
Od biedy można zrobić tak :

macierz macierz::operator*(macierz& mac)
{

        macierz temp;
        int i,j;
        for(i=0;i<wiersz;i++)               //mnożenie
       {
        for(j=0;j<kolumna;j++)
        {
          temp.tab[i][j]=(tab[i][j]* mac.tab[i][j]);

         }
        }
          temp.wiersz = wiersz ;               // <---- tu
          temp.kolumna = kolumna ;        //  <----tu
          return temp;
}

Ale co będzie jeśli macierze będą miały różne rozmiary ?

0

sorry ze sie podlaczam ale mam tez problem z przeladowaniem tyle ze operatora dodawania i tez wykonuje przyklad z macierzami. kod jest tutaj: http://www.cpaste.com/3369 problem jest taki ze jak dodaje to dodaje mi dobrze dla macierzy 2x2 elementy [0][0] i [1][1] a elementy [0][1] i [1][0] maja niewlasciwe wartosci. ktos jest w stanie powiedziec czemu ???? [???]

0
p_h_i_l_l_i_p napisał(a)

sorry ze sie podlaczam ale mam tez problem z przeladowaniem tyle ze operatora dodawania i tez wykonuje przyklad z macierzami. kod jest tutaj: http://www.cpaste.com/3369 problem jest taki ze jak dodaje to dodaje mi dobrze dla macierzy 2x2 elementy [0][0] i [1][1] a elementy [0][1] i [1][0] maja niewlasciwe wartosci. ktos jest w stanie powiedziec czemu ???? [???]

Macierz 'nowa' musi być zaalokowana dynamicznie.
W Twoim rozwiązaniu na końcu funkcji dodawania obiekt nowa jest usuwany ponieważ kończy się jego zakres widoczności.

macierz *operator+(macierz & tmp){
	macierz *nowa = new macierz(this->x,this->y);
	for (int i=0;i<this->x;i++)
		for(int j=0;j<this->y;j++)
			nowa->matrix[i][j]=this->matrix[i][j]+tmp.matrix[i][j];
	return nowa;
}
macierz *C=A+B;	
cout << "wynik:"<<endl;
C->get(0,1);
0

Dzięki wszystkim udało mi się, ostateczna wersja

macierz macierz::operator*(macierz& mac)
{
        macierz temp;
        temp.wiersz = wiersz ;               
        temp.kolumna = mac.kolumna ;
        int i,j,k;
        for(i=0;i<wiersz;i++)               //mnożenie
       {
        for(k=0;k<mac.kolumna;k++)
        {
                temp.tab[i][k]=0;
        for(j=0;j<mac.kolumna;j++) 
        {
          temp.tab[i][k]=temp.tab[i][k]+ (tab[i][j]* mac.tab[j][k]);                   
              }                     
            }                   
          }
         return temp;
        }

teraz tylko dopisać żeby sprawdzał czy można wykonać mnożenie.

0

To miło że jesteś zadowolony ...
Tak jak pisałem weź jeszcze pod uwagę różne rozmiary macierzy
albo usuń możliwość ustalania rozmiaru dla macierzy nr. 2 ..
Jeśli nie będą miały jednakowych rozmiarów to program sie wywali ...

0

A co z mnozeniem macierzy takich jak np [2,3]X[3,2]
Ktos wie jak wykonac takie mnozenie ? Napisalem program do mnozenia macierzy kwadratowych ale co z innymi ? Program z paru postow wyzej tez nie mnozy dobrze takich macierzy. Rowniez na forum nie znalazlem pomocy dlatego odswiezam watek.

0

A ty chciałeś przeładować mnożenie czy wskaźnik?

1 użytkowników online, w tym zalogowanych: 0, gości: 1