Klasa z macierzą double o wymiarach 2*2.

0

Klasa z macierzą double o wymiarach 2*2. Klasa powinna zawierać m.in. konstruktor inicjujący macierz, funkcje Dodaj_Macierz(),Odejmij macierz(), Pomnoz_macierz(), Wypisz_macierz().

Mój program wygląda tak:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string.h>

using namespace std;

class Macierz
{
private:
    int m_size;
    double ** tab_m;
public:
    
    Macierz( int = 2 ); // konstruktor
    ~Macierz(); // destruktor
    
    void wypelnij_macierz();
    void wypisz_macierz();
    
    Macierz dodaj_macierz( Macierz & m2 );
    
    Macierz & operator =( const Macierz & ); //przeladowany operator =
    
};



Macierz & Macierz::operator =( const Macierz & M ) //tu jego implementacja
{
    this->m_size = M.m_size;
    
    for( int i = 0; i < m_size; ++i )
    for( int j = 0; j < m_size; ++j )
         this->tab_m[ i ][ j ] = M.tab_m[ i ][ j ];
    
}



Macierz::Macierz( int size )
{
    m_size = size;
    tab_m = new double *[ m_size ];
    
    for( int i = 0; i < m_size; i++ )
         tab_m[ i ] = new double[ size ];
    
}

Macierz::~Macierz() //destruktor
{
    for( int i = 0; i < m_size; i++ )
         delete tab_m[ i ]; //usuwanie elementow wiersza
    
    delete[] tab_m; //usuwanie wiersza w kolumnie
}

void Macierz::wypelnij_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << "Wprowadz wartosc do macierzy [ " << i << " ][ " << j << " ] : ";
            cin >> tab_m[ i ][ j ];
            
        }
    }
}

void Macierz::wypisz_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << tab_m[ i ][ j ] << " ";
        }
        cout << endl;
    }
}

Macierz Macierz::dodaj_macierz( Macierz & m2 )
{
    cout << "Dodaje macierze  \n";
    cout << "Wynik dodawania: \n";
    
    Macierz suma = * this;
    
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] + m2.tab_m[ i ][ j ];
        }
    }
    return suma;
    
}


int main()
{
    //Deklaracja obiektów klasy Macierz
    Macierz m1, m2, suma;
    
    // Pobranie danych do macierzy
    m1.wypelnij_macierz();
    cout << endl;
    m2.wypelnij_macierz();
    cout << endl;
    
    // Wyswietlenie podanych macierzy w celu sprawdzenia
    cout << "Podane dane: \n\n";
    m1.wypisz_macierz();
    cout << endl;
    m2.wypisz_macierz();
    cout << endl;
    
    // Dodawanie macierzy
    suma = m1.dodaj_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;
    
    
    system( "PAUSE" );
    return 0;
}

Brakuje w nim tylko funkcji Odejmij macierz i pomnóż macierz. Bo wypisać wypisuje i dodaje. Jestem w tym zielony, próbowałem to zrobić w analogiczny sposób do dodawania ale wyszły mi głupoty. Za wszelką pomoc będę bardzo wdzięczny ponieważ potrzebuje tego na jutro.

0

Pomoże ktoś? Proszę.

0

w tym wypadku prośba o pomoc jest równoznaczna ze zdaniem zróbcie to za mnie...
jeśli wiesz jak się wykonuje operacje na macierzach to wystarczy że to rozpiszesz tak jak to robisz licząc na kartce

0

Powiedz mi w tym przypadku co jest źle skoro zrobiłem analogicznie do dodawania ? Nakieruj mnie jakoś :P

 #include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string.h>
 
using namespace std;
 
class Macierz
{
private:
    int m_size;
    double ** tab_m;
public:
 
    Macierz( int = 2 ); // konstruktor
    ~Macierz(); // destruktor
 
    void wypelnij_macierz();
    void wypisz_macierz();
 
    Macierz dodaj_macierz( Macierz & m2 ); 
	Macierz iloczyn_macierz( Macierz & m2 );
 
    Macierz & operator =( const Macierz & ); //przeladowany operator =
 
};
 
 
 
Macierz & Macierz::operator =( const Macierz & M ) //tu jego implementacja
{
    this->m_size = M.m_size;
 
    for( int i = 0; i < m_size; ++i )
    for( int j = 0; j < m_size; ++j )
         this->tab_m[ i ][ j ] = M.tab_m[ i ][ j ];
 
}
 
 
 
Macierz::Macierz( int size )
{
    m_size = size;
    tab_m = new double *[ m_size ];
 
    for( int i = 0; i < m_size; i++ )
         tab_m[ i ] = new double[ size ];
 
}
 
Macierz::~Macierz() //destruktor
{
    for( int i = 0; i < m_size; i++ )
         delete tab_m[ i ]; //usuwanie elementow wiersza
 
    delete[] tab_m; //usuwanie wiersza w kolumnie
}
 
void Macierz::wypelnij_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << "Wprowadz wartosc do macierzy [ " << i << " ][ " << j << " ] : ";
            cin >> tab_m[ i ][ j ];
 
        }
    }
}
 
void Macierz::wypisz_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << tab_m[ i ][ j ] << " ";
        }
        cout << endl;
    }
}
 
Macierz Macierz::dodaj_macierz( Macierz & m2 )
{
    cout << "Dodaje macierze  \n";
    cout << "Wynik dodawania: \n";
 
    Macierz suma = * this;
 
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] + m2.tab_m[ i ][ j ];
        }
    }
    return suma;
 
}
Macierz Macierz::iloczyn_macierz( Macierz & m2 )
{
    cout << "Mnoze macierze  \n";
    cout << "Wynik mnozenia: \n";
 
    Macierz suma = * this;
 
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] * m2.tab_m[ i ][ j ];
        }
    }
    return suma;
 
}
 
int main()
{
    //Deklaracja obiektów klasy Macierz
    Macierz m1, m2, suma;
 
    // Pobranie danych do macierzy
    m1.wypelnij_macierz();
    cout << endl;
    m2.wypelnij_macierz();
    cout << endl;
 
    // Wyswietlenie podanych macierzy w celu sprawdzenia
    cout << "Podane dane: \n\n";
    m1.wypisz_macierz();
    cout << endl;
    m2.wypisz_macierz();
    cout << endl;
 
    // Dodawanie macierzy
    suma = m1.dodaj_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;
    
    // Mnożenie macierzy
    suma = m1.iloczyn_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;
 
 
    system( "PAUSE" );
    return 0;
}
0

czy ja mówiłem tak samo lub analogicznie? nie znam się na macierzach dlatego ci tego nie sprawdzę
czy potrafisz odejmować macierze? Bez kalkulatora, na kartce papieru z użyciem długopisu/ołówka?
jeśli tak to każ twojej funkcji robić po kolei to samo co ty i tyle... jeśli nie to masz problem bo nie masz pojęcia jak to zrobić

0

Zrobiłem. Pomóżcie mi teraz dlaczego to nie działa? Coś jakby z pamięcią nie tak. Nagle zwiesza program.

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string.h>

using namespace std;

class Macierz
{
private:
int m_size;
double ** tab_m;
public:

Macierz( int = 2 ); // konstruktor
~Macierz(); // destruktor

void wypelnij_macierz();
void wypisz_macierz();

Macierz dodaj_macierz( Macierz & m2 );
Macierz pomnoz_macierz( Macierz & m2 );

Macierz & operator = (const Macierz & ); //przeladowany operator =

};

Macierz & Macierz::operator =( const Macierz & M ) //tu jego implementacja
{
this->m_size = M.m_size;

for( int i = 0; i < m_size; ++i )
for( int j = 0; j < m_size; ++j )
this->tab_m[ i ][ j ] = M.tab_m[ i ][ j ];

}

Macierz::Macierz( int size )
{
m_size = size;
tab_m = new double *[ m_size ];

for( int i = 0; i < m_size; i++ )
tab_m[ i ] = new double[ size ];

}

Macierz::~Macierz() //destruktor
{
for( int i = 0; i < m_size; i++ )
delete tab_m[ i ]; //usuwanie elementow wiersza

delete[] tab_m; //usuwanie wiersza w kolumnie
}

void Macierz::wypelnij_macierz()
{
for( int i = 0; i < m_size; i++ )
{
for( int j = 0; j < m_size; j++ )
{
cout << "Wprowadz wartosc do macierzy [ " << i << " ][ " << j << " ] : ";
cin >> tab_m[ i ][ j ];

}
}
}

void Macierz::wypisz_macierz()
{
for( int i = 0; i < m_size; i++ )
{
for( int j = 0; j < m_size; j++ )
{
cout << tab_m[ i ][ j ] << " ";
}
cout << endl;
}
}

Macierz Macierz::dodaj_macierz( Macierz & m2 )
{
cout << "Dodaje macierze \n";
cout << "Wynik dodawania: \n";

Macierz suma = * this;

for( int i = 0; i < m_size; i++ )
{
for( int j = 0; j < m_size; j++ )
{
suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] + m2.tab_m[ i ][ j ];
}
}
return suma;

}

Macierz Macierz::pomnoz_macierz( Macierz & m2 )
{
cout << "Mnoze macierze \n";
cout << "Wynik mnozenia: \n";

Macierz suma = * this;
double s =0;
for( int i = 0; i < m_size; i++ )
{
for( int j = 0; j < m_size; j++ )
{

 for(int k = 0; k < m_size; k++) suma.tab_m[i][j] += (tab_m[i][k] * m2.tab_m[k][j]);
 //tab_m[i][j] = s;
}
}
return suma;

}


int main()
{
//Deklaracja obiektów klasy Macierz
Macierz m1, m2, suma;

// Pobranie danych do macierzy
m1.wypelnij_macierz();
cout << endl;
m2.wypelnij_macierz();
cout << endl;

// Wyswietlenie podanych macierzy w celu sprawdzenia
cout << "Podane dane: \n\n";
m1.wypisz_macierz();
cout << endl;
m2.wypisz_macierz();
cout << endl;

// Dodawanie macierzy
suma = m1.dodaj_macierz( m2 );
cout << endl;
suma.wypisz_macierz();
cout << endl;

suma = m1.pomnoz_macierz( m2 );
cout << endl;
suma.wypisz_macierz();
cout << endl;


system( "PAUSE" );
return 0;
}
 
1
Zimny Młot napisał(a):

Coś jakby z pamięcią nie tak. Nagle zwiesza program.

Macierz Macierz::pomnoz_macierz( Macierz & m2 )
{
\\...
Macierz suma = * this;
\\...
}

brakuje Ci w klasie konstruktora kopiującego.

0

jak dla mnie brakuje konstruktora kopiującego i (nie analizowałem, czy jest potrzebny, ale nigdy nie zaszkodzi operatora =)

0
kaczus napisał(a):

jak dla mnie brakuje konstruktora kopiującego i (nie analizowałem, czy jest potrzebny, ale nigdy nie zaszkodzi operatora =)

ano, tutaj wcale nie trzeba być wróżbitą by stwierdzić, czemu program może lecieć w powietrze. Wystarczy spojrzeć na klasę i widzimy nieszczęsne zarządzanie na własną rękę zasobami, a to z kolei prowadzi do takich dramatów. Autor ładnie zdefiniował destruktor, w którym zwalnia pamięć, operator przypisania, w którym kopiuje elementy, ale zapomniał o równie ważnej funkcji (reguła trzech). Zaryzykuję bardzo, bo to C++, ale dam sobie prawą rękę uciąć, że to właśnie przez to.

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