Reklama
Strona 2 z 2 PierwszaPierwsza 12
Pokazuje wyniki od 16 do 30 z 30

Temat: [C++] Klasa macierz

  1. #16
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    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

  2. #17

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    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;
    }
    tak wystarczy chyba?
    no i teraz kompiluje sie, jednak dalej jest blad, z tym ze duzo mniejszy (wczesniej sie cala lista wysypala)



    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
    Ostatnio zmieniony przez hefalump : 27-01-2014, 14:28

  3. Reklama
  4. #18
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    W środku drugiej pętli nie powinno być tak?
    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;
    }
    [i jeszcze niewiadomo skąd się tam "m" wzięło w drugiej pętli ;d]

  5. #19

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    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
    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];
                    }
    wyglada jakos specjalnie?

    I ostatnie pytanie jakby ktos byl tak mily, konstruktor kopiujacy, tutaj w ogole nie mam pojecia jak sie za to zabrac...

  6. #20
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    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=):
    Kod:
    macierz(const macierz& m)
    {
        ...
    }
    W środku tworzysz nową tablicę i przepisujesz elementy z drugiej macierzy.

  7. #21
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    @up
    a
    Kod:
    tab = m.tab
    nie wystarczy?

    #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
    Ostatnio zmieniony przez Kusterek : 27-01-2014, 14:52

  8. #22
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    Cytuj Kusterek napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    @up
    a
    Kod:
    tab = m.tab
    nie wystarczy?
    Nie wystarczy, bo to skopiuje tylko sam wskaźnik. Wtedy jeśli ta macierz, z której kopiowałeś, zwolni pamięć, to zniknie też z tej drugiej.

  9. #23

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    edit#
    znalazlem taki operator mnozenia

    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;
    }
    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)
    Ostatnio zmieniony przez hefalump : 27-01-2014, 16:20

  10. #24
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    #edit
    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)
    Zapewne dlatego, że na starcie masz niewyzerowaną tablicę, i jak do tych śmieci dodajesz kolejne wartości, to to dalej są śmieci ;p

  11. #25

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    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?
    Ostatnio zmieniony przez hefalump : 27-01-2014, 16:27

  12. #26
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    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:
    Kod:
    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;
        }
    Załącznik 305851
    widzisz te dodawanie iloczynów w nawiasach? Kazdy ten nawias to jest Twoja zmienna pom
    Ostatnio zmieniony przez Kusterek : 27-01-2014, 16:31

  13. #27

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    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];
                    }
    }

  14. #28
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Gray już Ci napisał przeciez, ale masz ;s
    Kod:
    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];
    }
    sprawdz czy dziala

    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];
    	}
    Ostatnio zmieniony przez Kusterek : 27-01-2014, 23:00

  15. #29

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    no nie dziala xd kompilowac sie kompiluje, ale potem wysypuje blad ;/

  16. #30
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    Cytuj Kusterek napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    no bez kitu, nie działa. Nie wiem w takim razie jak kopiować dynamiczną tablicę dwuwymiarową ;s
    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 j = 0; j < k; j++)
                tab[i][j] = m.tab[i][j];
        }
    }

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. "Klass - Elu parast" Nasza Klasa - Życie po
    Przez Mati w dziale Filmy, seriale i telewizja
    Odpowiedzi: 0
    Ostatni post: 14-01-2013, 21:13
  2. Fizyka i astronomia liceum 1 klasa poziom rozrzeszony
    Przez VikeM w dziale Szkoła i nauka
    Odpowiedzi: 5
    Ostatni post: 09-11-2012, 17:44
  3. Odpowiedzi: 3
    Ostatni post: 13-01-2012, 02:38
  4. klasa maturalna - niezdanie
    Przez Szczypior w dziale Szkoła i nauka
    Odpowiedzi: 5
    Ostatni post: 29-11-2011, 20:31

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •