Trochę za dużo masz tych pętli.
http://pl.wikipedia.org/wiki/Dodawanie_macierzy
Robisz 2 pętle, a nie 4, kodu nawet nie ma sensu czytać poki tego nie poprawisz ;p
Wersja do druku
Trochę za dużo masz tych pętli.
http://pl.wikipedia.org/wiki/Dodawanie_macierzy
Robisz 2 pętle, a nie 4, kodu nawet nie ma sensu czytać poki tego nie poprawisz ;p
tak wystarczy chyba?Kod:friend macierz operator+ (const macierz& A, const macierz& B)
{
macierz C(A.w, A.k);
for (int i=0; i<A.w; i++)
{
for(int j=0; m<A.k; j++)
{
C.tab[A.w][A.k]=A.tab[i][j]+B.tab[i][j];
}
}
return C;
}
no i teraz kompiluje sie, jednak dalej jest blad, z tym ze duzo mniejszy (wczesniej sie cala lista wysypala)
http://i41.tinypic.com/2unvdhu.png
tak to wyglada, pokazuje sie to po uzupelnieniu 2giej macierzy, program przestaje na wyswietleniu jej, ale nie dodaje ich do siebie juz
na widocznym kawalku kodu widac ze musze stworzyc nowy obiekt i dopiero wtedy moge dodac te macierze. To tez jest problem - jak to rozwiazac by program tworzyl obiekt C bedacy suma A i B i przy tym sam nadawal mu odpowiednia wielkosc?
edit#
ok jednak nie jest to maly blad, co kompliacje wywala cos innego, zmienilem wielkosc tworzonego obiektu na zmienne poprzedniej macierzy - > nowe bledy. Wrocilem do stalego 2x2 -> jeszcze inne bledy... cos jest konkretnie spieprzone ;d
W środku drugiej pętli nie powinno być tak?
[i jeszcze niewiadomo skąd się tam "m" wzięło w drugiej pętli ;d]Kod:friend macierz operator+ (const macierz& A, const macierz& B)
{
macierz C(A.w, A.k);
for (int i=0; i<A.w; i++)
{
for(int j=0; m<A.k; j++)
{
C.tab[i][j]=A.tab[i][j]+B.tab[i][j];
}
}
return C;
}
eh.... jak zwykle, szukalem bledow niewiadomo gdzie a to taki banal. Dzieki! ;> Reputy leca za pomoc oczywiscie.
Mialbym jeszcze pytanie o destruktor - w ktorym miejscu mialbym go wstawic? I czy destuktor takiego konstruktora
wyglada jakos specjalnie?Kod:macierz(int ww, int kk){
w=ww;
k=kk;
tab = new double*[ww];
for (int i = 0; i < ww; i++) {
tab[i] = new double[kk];
}
I ostatnie pytanie jakby ktos byl tak mily, konstruktor kopiujacy, tutaj w ogole nie mam pojecia jak sie za to zabrac...
W destruktorze po prostu zwalniasz pamięć (delete[]) po tej podwójnej tablicy. Najpierw w pętli kolejne wiersze, potem sama tablica.
Tylko że destruktor spowoduje tutaj że dodawanie przestanie działać - przy wracaniu z funkcji będzie kopiowany sam wskaźnik do tablicy, potem destruktor macierzy w środku funkcji go zwolni i zwrócona macierz będzie zepsuta. Trzeba dodać konstruktor kopiujący (i zależnie od tego jak wygląda kod, możliwe że również operator=):
W środku tworzysz nową tablicę i przepisujesz elementy z drugiej macierzy.Kod:macierz(const macierz& m)
{
...
}
@up
a
nie wystarczy?Kod:tab = m.tab
#EDIT
no w sumie nie, bo tak sie przekaze tylko wskaznic na tablice, a jak wyjebiesz tamta macierz z ktorej kopiujesz to nie będzie działac ;s
edit#
znalazlem taki operator mnozenia
z tym ze nie wiem czemu musze uzywac zmiennej pomocniczej? jak pomine je to nie liczy dobrze (wyswietla chyba adresy pol, albo cholera wie co)Kod:friend macierz operator* (const macierz& A, const macierz& B)
{
macierz E(A.w, B.k);
for (int i=0; i<A.w; i++)
{
for(int j=0; j<B.k; j++)
{
double pom = 0;
for(int k=0; k<A.k; k++)
{
pom+=A.tab[i][k]*B.tab[k][j];
E.tab[i][j]=pom;
}
}
}
return E;
}
#edit
Zapewne dlatego, że na starcie masz niewyzerowaną tablicę, i jak do tych śmieci dodajesz kolejne wartości, to to dalej są śmieci ;pCytuj:
z tym ze nie wiem czemu musze uzywac zmiennej pomocniczej? jak pomine je to nie liczy dobrze (wyswietla chyba adresy pol, albo cholera wie co)
edytowalem post wyzej i wkleilem nieco inny kod, znalazlem go na stronie jakiejs polibudy, niestety mnozy on dobrze jedynie macierze o takim samym rozmiarze, gdy dam macierz 2x3 * 3x2 to iloczyn podaje jako same 0 ;/
edit#
znalazlem blad ;> wyglada na to ze mnozy teraz ok, jednak nadal pozostaje kwestia tej zmiennej pomocniczej, moglby mi ktos mi wytlumaczyc po co ona tam jest?
Nom i ważną sprawą jest dać warunek, ponieważ nie każdą macierz możesz pomnożyć przez drugą.
Liczba kolumn pierwszej macierzy musi się zgadzać z liczbą wierszy w drugiej macierzy.
algorytm:
Załącznik 305851Kod:for(i = 0; i < m; i++)
for(j = 0; j < p; j++)
{
s = 0;
for(k = 0; k < n; k++) s += A[i][k] * B[k][j];
C[i][j] = s;
}
widzisz te dodawanie iloczynów w nawiasach? Kazdy ten nawias to jest Twoja zmienna pom
ogarnalem operator mnozenia, wszystko ladnie dziala, mnozy kiedy trzeba, w innym wypadku jest ladny komunikat, ale za cholere nie wiem jak zabrac sie za konstruktor kopiujacy?
dodam iz tak wyglada moj konstruktor i "strefa" private klasy
Kod:class macierz
{
private:
int w, k;
double **tab;
public:
macierz(int ww, int kk){
w=ww;
k=kk;
tab = new double*[ww];
for (int i = 0; i < ww; i++) {
tab[i] = new double[kk];
}
}
Gray już Ci napisał przeciez, ale masz ;s
sprawdz czy dzialaKod:macierz(const macierz& m)
{
w = m.w;
k = m.k;
for(int i=0; i<w; i++)
for(int j=0; j<k; j++)
tab[i][j] = m.tab[i][j];
}
nie działa, bo brakuje new ;d
no bez kitu, nie działa. Nie wiem w takim razie jak kopiować dynamiczną tablicę dwuwymiarową ;s
#EDIT
zrobilem takie cos ale malo optymalne:
Kod:macierz(const macierz& m)
{
w = m.w;
k = m.k;
tab = new double*[w];
for (int i = 0; i < w; i++)
tab[i] = new double[k];
for (int i = 0; i<w; i++)
for (int j = 0; j<k; j++)
tab[i][j] = m.tab[i][j];
}
no nie dziala xd kompilowac sie kompiluje, ale potem wysypuje blad ;/