Reklama
Strona 1 z 2 12 OstatniaOstatnia
Pokazuje wyniki od 1 do 15 z 30

Temat: [C++] Klasa macierz

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny [C++] Klasa macierz

    Mam problem z klasą macierzy, mam napisac taki program na zajecia i nie wiem co jest poki co zle...
    poki co zalezy mi by mozna bylo ustalic rozmiar macierzy(ilosc kolumn i wierszy) oraz wpisac cos do tych pol i wyswietlic. W tym celu tworze dynamiczna tablice dwuwymiarowa, przeciarzam operatory << i >> i niestety to nie chce dzialac....

    Kod:
    #include <iostream>
    
     using namespace std;
     
    class macierz
    {
          private:
                  int w, k;
                  double **tab;
          
          public:
                  macierz(int w, int k)
        {
         double **tab;
         tab = new double * [w];
          for(int i = 0; i<w; i++)
          tab[i] = new double[k];
          
        }
    friend istream & operator >> (istream & in , macierz & Y)
    {
    for(int i=0;i<Y.w;i++)
     for(int j=0;j<Y.k;j++)
      in >> Y.tab[i][j] ;
    return in;
    }
    
    friend ostream& operator << (ostream & out , macierz Y)
    {
    for(int i=0; i<Y.w; i++)
     {
      for(int j=0; j<Y.k; j++)
       {
        out << Y.tab[i][j] << " "; 
       }
     out << endl; 
     }
    return out;
    }
                  
            
    };
    A w mainie (z grubsza)
    Kod:
    macierz Y(i, j);
    cin >> Y;
    cout << Y;
    co jest nie tak?

    edit#
    aha, program sie kompiluje, tyle ze jakby calkowicie ignoruje linijke z cin>> cout<<... po prostu konczy swoje dzialanie
    Ostatnio zmieniony przez hefalump : 20-01-2014, 20:49

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

    Domyślny

    bierzesz się za przeciążanie operatora jak konstruktor Ci w ogole nie działa ;o
    Kod:
                  macierz(int w, int k){
                    double **tab;
                    tab = new double * [w];
                    for(int i = 0; i<w; i++)
                    tab[i] = new double[k];
                    }
    #EDIT
    jak niby ma ten cin dzialac? jak sie powinno wpisywac dane?
    Ostatnio zmieniony przez Kusterek : 20-01-2014, 21:09

  3. Reklama
  4. #3

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    a co jest zle z tym konstruktorem? znalazlem kilka bardzo podobnych w internecie, nie wiem jak inaczej zrobic konstruktor ktory tworzy tablice dwuwymiarową o zadanych wielkosciach?
    A cin tak samo probowalem na klasie wektor, w mainie bylo cin >> A, cout << A i wyswietlalo ladnie wektor. Tutaj dochodzi drugi wymiar tablicy i zaczyna sie wszystko pieprzyc..

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

    Domyślny

    ten kod co napisales jest nietyle nie poprawne co tam czegos brakuje do poprawnego dzialania programu.
    Chcialem zebys sam zczail, ale jak Ci się nie chce samemu obczaić gidze błąd to powiem, że w konstruktorze brakuje przypisania wartosci do pól w i k.

    #EDIT
    pierdole bullshit sry :D
    Ostatnio zmieniony przez Kusterek : 20-01-2014, 21:22

  6. #5
    Avatar Ewande
    Data rejestracji
    2006
    Położenie
    Wrocław
    Posty
    367
    Siła reputacji
    18

    Domyślny

    Cytuj Kusterek napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Kolejna sprawa przeciążając >> lub << przeciążasz >> lub << a nie cin >> lub cout <<.
    Przy wywolaniu nie odwolujesz sie wiec do cin >> lub cout << tylko Y << lub Y >> :)
    No nie bardzo.

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

    Domyślny

    Nie tylko, błąd też jest i po przypisaniu wymiarów nadal nie będzie działać ;p

    Kolejna sprawa przeciążając >> lub << przeciążasz >> lub << a nie cin >> lub cout <<.
    Przy wywolaniu nie odwolujesz sie wiec do cin >> lub cout << tylko Y << lub Y >> :)
    A tu nie rozumiem o co Ci chodzi. Operatory dobre są.

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

    Domyślny

    Cytuj Gray napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie tylko, błąd też jest i po przypisaniu wymiarów nadal nie będzie działać ;p
    ale chociaz nie bedzie bledu programu. W przeciazeniu operatora w forach odwoluje sie do Y.w i Y.k, ktore nie istnieja ;)

    Cytuj Gray napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    A tego nie zrozumiałem. Operatory dobre są.
    wiem, zlamiłem. Co mi sie pojebalo ;d

    #SOLUTION
    konstruktor:
    Kod:
    macierz(int ww, int kk){
                    w=ww;
                    k=kk;
                    tab = new double*[ww];
                    for (int x = 0; x < ww; x++) {
                    tab[x] = new double[kk];
                    }
    }
    przeciążenie operatora <<
    Kod:
    friend ostream& operator << (ostream & out , const macierz & Y)
    {
    for(int i=0; i<Y.w; i++)
     {
      for(int j=0; j<Y.k; j++)
       {
        out << Y.tab[i][j] << " ";
       }
     out << endl;
     }
    return out;
    }
    posluzylem sie tez metoda, ktora uzupelnia macierz samymi zerami zeby sprawdzic czy wypisuje dobrze, kod:
    Kod:
    void uzupelnij(){
                        for(int i=0; i<w; i++)
                            for(int j=0;j<k;j++)
                                tab[i][j]=0;
                    }
    niestety kompletnie nie ogarniam jak mialoby się przeciążyć >> zeby wpisywac dane do macierzy, takze w tym nie pomoge

    @down
    wiem wiem, chodzilo mi o przypisanie wartosci do pól w i k
    operator << dobry jest ten mój, koleżka źle trochę napisał parametry
    okej >> jest dobry, wiec chyba problem rozwiazany ;d
    Ostatnio zmieniony przez Kusterek : 20-01-2014, 21:49

  9. #8
    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.
    ale chociaz nie bedzie bledu programu. W przeciazeniu operatora w forach odwoluje sie do Y.w i Y.k, ktore nie istnieja ;)
    No jak to ;d
    Kod:
     private:
                  int w, k;
                  double **tab;
    Istnieją, tylko są nieprzypisane i jakieś śmieci w nich są.


    Kod:
    void uzupelnij()
    {
        for(int i=0; i<w; i++)
            for(int j=0;j<k;j++)
                tab[i][j]=0;
    }
    Można łatwiej:
    Kod:
    for (int x = 0; x < ww; x++)
    {
        tab[x] = new double[kk]();
    }
    (to w konstruktorze)


    A operator >> jest już teraz dobry, nie wiem co w nim zmieniać chcesz ;p


    Cytuj Kusterek napisał
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    @down
    wiem wiem, chodzilo mi o przypisanie wartosci do pól w i k
    operator << dobry jest ten mój, koleżka źle trochę napisał parametry
    a operator >> nie wiem czy jest dobry bo nie mam pojecia jak ma dzialac. Jak ma uzupelniac macierz
    Obecnie działa tak, że jak wpiszesz w konsoli dla macierzy 3x3:
    1 2 3
    4 5 6
    7 8 9
    To właśnie taka macierz powstanie, więc zapewne tak ma działać ;p

  10. #9

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Dzieki chlopaki, reputy polecialy ;> programik dziala jak trzeba ;)

    Mam jednak jeszce jeden maly problem, jak wykombinowac by przemnozyc macierz x macierz/wektor/liczba? Trzeba tez przeciazac operatory mnozenia jakos?

  11. #10
    Avatar Ewande
    Data rejestracji
    2006
    Położenie
    Wrocław
    Posty
    367
    Siła reputacji
    18

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Dzieki chlopaki, reputy polecialy ;> programik dziala jak trzeba ;)

    Mam jednak jeszce jeden maly problem, jak wykombinowac by przemnozyc macierz x macierz/wektor/liczba? Trzeba tez przeciazac operatory mnozenia jakos?
    Tak. Możesz sobie przeciążyć 3 różne operatory mnożenia w zależności od tego przez co chcesz tę macierz mnożyć.

  12. #11

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Nie bardzo wiem niestety jak taki przeciążony operator ma wygladac? By w mainie moc napiac A+B=C, gdzie A, B, C macierze(obiekty)? Ma ktoś jakies pomysl jak to napisac? Macierz C musi byc wczesniej stworzona i po prostu nie wypelniona?
    Zaczalbym najchetniej od dodawania bo wyglada to duzo latwiej niz mnozenie.

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

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    A+B=C
    Tak to nigdy* nie zadziała, jeśli już to C = A + B;

    To powinno wyglądać tak (jako metoda macierzy):
    Kod:
    macierz operator+ (const macierz& B) const
    {
    	macierz C;
    	
    	// tu kod dodawania
    	
    	return C;
    }
    Albo tak (jako globalna funkcja):
    Kod:
    friend macierz operator+ (const macierz& A, const macierz& B)
    {
    	macierz C;
    	
    	// tu kod dodawania
    	
    	return C;
    }

    I wtedy wywołujesz tak samo, jak by to były wbudowane typy:
    Kod:
    macierz A, B;
    
    // ...
    
    macierz C = A + B;


    * no chyba że przeładujesz też operator=, żeby wpisywało do tego co jest po prawej, ale tak się nie robi ;p

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

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie bardzo wiem niestety jak taki przeciążony operator ma wygladac? By w mainie moc napiac A+B=C, gdzie A, B, C macierze(obiekty)? Ma ktoś jakies pomysl jak to napisac? Macierz C musi byc wczesniej stworzona i po prostu nie wypelniona?
    Zaczalbym najchetniej od dodawania bo wyglada to duzo latwiej niz mnozenie.
    imho dodawanie, odejmowanie czy mnożenie to jeden pies. Z dzieleniem jest większy problem bo jak wiadomo niezbyt fajnie się dzieli integery.
    Zrob tak jak mówi Gray, w przypadku problemu dawaj znac :)

    @down
    no w sumie ciężej, algorytm na macierz odwrotna jest gdzies na necie to potem tylko podstawić do mnozenia macierzy i by było. Chociaz pewnie dlugi ten kod na macierz odwrotna bedzie :P
    Ostatnio zmieniony przez Kusterek : 26-01-2014, 21:32

  15. #14
    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.
    imho dodawanie, odejmowanie czy mnożenie to jeden pies. Z dzieleniem jest większy problem bo jak wiadomo niezbyt fajnie się dzieli integery.
    Zrob tak jak mówi Gray, w przypadku problemu dawaj znac :)
    To nawet nie chodzi o to że są inty (bo to łatwo zmienić), ale ogólnie dzielenie macierzy jest bardzo trudne. Szczerze wątpię żeby kazali mu coś takiego napisać ^^

  16. #15

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    hmm mam pewien problem z tym
    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 m=0; m<B.w; m++)
    		{
    			for(int j=0; j<A.k; j++)
    			{
    				for(int n=0; n<B.k; n++)
    				{
    					C.tab[A.w][A.k]=A.tab[i][j]+B.tab[m][n];
    				}
    			}
    		}
    	}
    			
    	return C;
    }
    program sie kompiluje, jednak
    po 1, gdy w w mainie dam
    Kod:
    C=A+B;
    nie znajduje C, musze C najpierw utworzyc i nadac mu rozmiar

    po 2, gdy nawet sprobowalem zrobic macierz C 2x2, zeby sprawdzic czy dziala wszystko, to program wystartowal, jednak gdy doszedl do dodawania to sie wysypal razem z kilkoma bledami wskazujacymi na linijke
    Kod:
    C.tab[A.w][A.k]=A.tab[i][j]+B.tab[m][n];
    Ostatnio zmieniony przez hefalump : 27-01-2014, 13:29

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
  •