Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Dinamicki Array

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Dinamicki Array

Strane: 1 2

[ Pregleda: 6446 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon [Zadatak] Dinamicki Array03.07.2008. u 20:46 - pre 192 meseci
Potrebna mi je pomoc :)

Moram da napisem klasu za dinamcki array , koja ce prilikom upisa prvog broja ,is da napravi mesta za 20 broja is ... u slucaju da da korisnik upise vise od 20 broja , sledeci array oder 20 mesta i tako dalje ... znaci nema kopiranja podataka u novi array , jednostavno novi array od 20 u beskraj ... array-s moraju biti povezani preko liste, head pokazuje na prvi array, pa lista, pa drugi array ... , copy constructor i Assignment operator za klasu , i verovatno najtezi deo da mogu da ispisem pozicije array-a kao kod obicnih array-s np . cout<< a[21]; da ispise 21 array element .

Mnogo mi znaci ovaj program.


Hvala unapred
Prikačeni fajlovi
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 12:26 - pre 192 meseci
Svidja mi se ideja, probacu da napisem pa ti javljam. Najlakse bi bilo da se uradi kao povezana lista. jedno mi nije jasno. Da li hoces da posto ce biti izdeljeno da adrese svih lista drzim u jednom nizu, ili da svi budu povezani?(prema semi oni su povezani, pa zato ovaj niz moze biti beskonacan?
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 12:42 - pre 192 meseci
Prikacio sam jpeg koji pokazuje kako razliciti delovi klasse, znaci arrays od po 20 mesta medjesobno povezani ... lista povezuje i "drzi" zajedno sve elemente ...
ne razumem bas pitaje ?? da u sustini treba da bude povezana lista, niz ...

Hvala ti puno :)
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 12:57 - pre 192 meseci
OK, sve sam super ukapirao. Vec pisem(nisam testirao, ali nadam se da ce da radi). Zamolio bih te samo da mi napises koje sve funkcije hoces da ima taj niz po crticama(moze kratko objasnjenje). U principu ja sam ubacio za sad insert i append, i size funkcije, ali nije problem. Takodje navedi tacno ime funkcije, da ih tako nazovem.
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 13:07 - pre 192 meseci
pa metoda za ubacivanje novih elementa , copy constructor i Asigement operator = , i da mogu da ispisem poziciju kao kod obicnih array ...

np.

DynArray a ;
... upis elementa ...

cout << a[21] ; da ispise 21 element

mislim da je ovo dovoljno,nista vise , ni size ..

einfuegen za ubacivanje novih elementa

:)

 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 15:01 - pre 192 meseci
Ovo nije konacna verzija, ja cu menjati kod u poruci kako budem unapredjivao ovaj kontejner. Nazive promeni kako oces, mada bi mogao da sacekas da dovrsim ovaj kod(bice do veceras). Ovo je cisto da vidis kako radi.

Pa, evo koda:

Code:


class CDLista
{

    private:
    static const int velicinaNiza=20;
    struct node
    {
    int lista[velicinaNiza];
    node *next;
    ~node()
    {
        if (next!=0)
        delete next;
    }
    node()
    {
        next=0;
    }
    node(const node& osnova)
    {
        for (int i=0;i<velicinaNiza;i++)
        {
            lista[i]=osnova.lista[i];
        }
        next=0;
        if (osnova.next!=0)
        {
            next=new node(*osnova.next);
        }
    }
    } ;
    node *prvi;
    mutable int _size;
    public:

    CDLista()
    {
        prvi=new node();
        _size=0;
    }

    CDLista(CDLista& lista)
    {
        *this = lista;
    }
    bool change(unsigned int index, int broj)
    {
        //index ima najmanju vrednost 0, tj niz pocinje sa 0
        //change radi za vec unesene brojeve i prvi neunesen broj
        if (index>_size)
        return false;
        int koraci=index/velicinaNiza;
        int element=index%velicinaNiza;
        node *xnode=prvi;
        for (int i=0; i<koraci; i++)
        {
            if (xnode->next==0)
                xnode->next=new node();

            xnode=xnode->next;
        }
        if (index==_size)
            _size++;
        xnode->lista[element]=broj;
        return true;
    }

    int size()
    {
        return _size;
    }

    int& operator[](int index)
    {
        int koraci=index/velicinaNiza;
        int element=index%velicinaNiza;
        node *xnode=prvi;
        for (int i=0; i<koraci; i++)
            xnode=xnode->next;
        return xnode->lista[element];
    }

    void operator= (CDLista& lista)
    {
        delete prvi;
        _size=lista.size();
        prvi=new node(*lista.prvi);
    }

    void append(int broj)
    {
        change(_size, broj);
    }

    void pop()
    {
        //brise poslednji element
        change(_size-1,0);
        _size--;
    }
};





Takodje ovaj kontejner se moze ponasati neocekivano ako budes pozvao nepostojeci index(recimo da je trenutna velicina 30, a ti hoces da pristupis 50-tom elementu). Takodje bih zamolio nekog od boljih programera sa elitesecurity da ukoliko ima zelje i vremena promeni ovaj kontejner tako da vazi za sve tipove objekata(ovaj kontejner je samo za int), posto ja jos nisam naucio da koristim ono template <typename ...> itd.

Ako bilo ko ima bilo koje primedbe, sugestije, savete, samo napred!

[Ovu poruku je menjao opat dana 04.07.2008. u 17:18 GMT+1]

[Ovu poruku je menjao opat dana 05.07.2008. u 23:38 GMT+1]
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 15:26 - pre 192 meseci
ok super :)

na pocetku array mora da ima samo 20 mesta , ako slucajno korisnik ubaci 21 broj , pravi se novi element lista , koja pokazuje na drugi array od 20 mesta , drugi pointer je 0 posto nema sledeceg elementa ... znaci samo ako je potrebno , stvara se novi array oder 20 mesta , tek kad korisnik ubaci 41 ili vise program terba da napravi treci array od 20 ..

hvala ti opat
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 16:25 - pre 192 meseci
Citat:
Kushwais:
na pocetku array mora da ima samo 20 mesta , ako slucajno korisnik ubaci 21 broj , pravi se novi element lista , koja pokazuje na drugi array od 20 mesta , drugi pointer je 0 posto nema sledeceg elementa ... znaci samo ako je potrebno , stvara se novi array oder 20 mesta , tek kad korisnik ubaci 41 ili vise program terba da napravi treci array od 20 ..



To je upravo ono sto ovaj niz i radi. Ako imas jos ideja sta treba da ubacim u ovu listu, reci. Inace pogledaj gore kod, prosirio sam ga(dodao funkciju pop() ).
Inace sad cu da dodam i operator = . Prati promene poruke, i videces ako sam promenio poruku znaci da sam unapredio kod...
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 17:41 - pre 192 meseci
jedina ide bi bila , zar se ne moze izvesti da araay dinamicki "napravi " sa new ??

primetio sam izmene poruka :) hvala
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array04.07.2008. u 18:50 - pre 192 meseci
isprobao sam program,radi :)
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.112.*



+7 Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 02:20 - pre 192 meseci
Pogledaj i ovu temu http://www.elitesecurity.org/t...alokacija-memorije-Realloc-New vezano za dinamicke nizove
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 13:07 - pre 192 meseci
Pokusavam da napisem zuweisungoperator ali ne ide ...

CDLista & CDLista::operator=(const CDLista & op) {
....
...
return *this; }
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 16:35 - pre 192 meseci
Pa malo je komplikovanije, ali mislim da cu da ga uradim do veceras. Kada radis operator= moras prvo moras da izbrises niz pa da ga napravis kao novi. operator= moze se ujedno imaplementirati i kao konstruktor.
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 18:15 - pre 192 meseci
Jeste komplikavanije , nazalost jedino sto uspevam jeste adresu da prekopiram , tako da imam 2 "instanzvariable " koje imaju istu adresu ...
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 20:00 - pre 192 meseci
Code:

template <typename T>
class Dynamic2dArray
{
public:
    Dynamic2dArray(){};
    Dynamic2dArray(int rows, int cols):m_data(rows, std::vector<T>(cols)){}
    inline std::vector<T> & operator[](int i) { return m_data[i];}
    void resize(int rows, int cols){
        m_data.resize(rows);
        for(int i = 0;i < rows;++i) m_data[i].resize(cols);
     }
     void clear(){
        for(int i = 0;i < (int)m_data.size();i++)
            m_data[i].clear() ; 
            m_data.clear() ; 
     }
        
     int size () { 
          return (int)m_data.size() ; 
    }

private:
    std::vector<std::vector<T> > m_data;  
};



Klasa Dynamic2dArray je template klasa i omogucava da postavite bilo koji tip podatka u datu matricu tj. 2D niz

Code:

struct POINT { 
 long x ;
 long y ; 
};

//matrica 10x10 tacaka u ravni 
int nSizeX = 10 ;
int nSizeY = 10 ; 
Dynamic2dArray<POINT> m_aoPoints (nSizeX,nSizeY); 

//ili ako je int 
Dynamic2dArray<int> 2DIntArray(nSizeX,nSizeY); 



Klasa je u stanju da dinamicki prosiruje 2D niz kad god vam je to u kodu potrebno

Code:

nSizeX += 20; 
nSizeY += 20 ; 
m_aoPoints.resize(nSizeX ,nSizeY) ; 
// sad je niz 30x30 ... 

//dodavanje novih tacaka 
m_aoPoints[10][0].x = 130; 
m_aoPoints[10][0].y = 100; 

m_aoPoints[10][1].x = 140; 
m_aoPoints[10][1].y = 110; 
.
.
.
m_aoPoints[nSizeX-1][nSizeY-1].y = 110;
m_aoPoints[nSizeX-1][nSizeY-1].y = 110;
//itd ...



Metodu clear() pozivajte kada hocete da resetujete tj. ocistite ceo 2D niz ...

Viva lollapalooza
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 22:37 - pre 192 meseci
Konacno dodao sam i funkciju za operator =, kao i jos neka unapredjenja. Kod jos nije u potpunosti zavrsen, mislim cu ga jos malo obraditi.
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array05.07.2008. u 23:38 - pre 192 meseci
hvala opat , zamolio bih te samo da prokomentarises program , zeleo bih da shvatim svaki red .. hvala ti puno
 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array06.07.2008. u 15:56 - pre 192 meseci
hvala deerbeer , ipak vektore i kontejnere ne divanim , jos uvek ne .
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.81.eunet.yu.



Profil

icon Re: [Zadatak] Dinamicki Array07.07.2008. u 12:26 - pre 192 meseci
Nadam se da sam lepo iskomentarisao kod. Ako ne razumes neke stvari, zamolio bih te da prvo potrazis po net-u neki tutor o povezanoj listi(linked list). Bice mi drago ako budem cuo neka pitanja ili komentare. Mislim da ce ovaj kod biti konacan, osim ako neko ne pronadje neko gresku ili smatra da treba jos nesto da se ubaci.

Code:


class CDLista
{

    private:
    static const int velicinaNiza=20; // velicina niza, tj. koliko ce elemenata da sadrzi jedan node
    struct node   // node, u njemu se nalaze podaci koje dinamicki niz sadrzi i pokazivac na sledeci node
    {                           // koristi se trik da struktura moze sadrzati pokazivac na objekat iste strukture
    int lista[velicinaNiza];    //taj pokazivac(next) ima vrednost 0 ako next pokazuje na nista, tj ne pokazuje na objekat klase node
    node *next;                 // u tom slucaju to je kraj niza

    ~node()                     // destruktor, jer treba obristi i sledece strukture na koje ukazuje next
    {                           // u suprotnom slucaju, program bi opet raio ali doslo bi do curenja memorije
        if (next!=0)            // ako next nije nula, onda next ukazuje na objekat klase node koga treba obrisati
        delete next;            // ovaj destruktor je rekurzivan pa ce se primenjivati dok ne dodje to kraja povezane liste node-ova
    }
    node()                      // konstruktor bez argumenata
    {
        next=0;                 // osigurano je da ce next biti 0, tj da nece pokazivati na objekat
    }
    node(node& osnova)    //  ovaj konstruktor kopira jedan u drugi node, sto se koristi prilikom kopiranja celog
    {                           // objekta klase u drugi.
        for (int i=0;i<velicinaNiza;i++)    // u svakom nodu se kopiraju clanovi manje liste(od 20 clanova)
        {
            lista[i]=osnova.lista[i];
        }
        if (osnova.next!=0)                 // da li je u pitanju kraj povezane liste
        {
            next=new node(*osnova.next);    // ako nije, poziva se rekurzivna funkcija
        }
        else next=0;                        // kraj povezane liste node-ova;
    }
    } ;
    node *prvi;                             // ovde cemo drzati pokazivac na prvi node, preko kojeg cemo moci da dodjemo
                                            // do ostalih node-ova preko pokazivaca *next
    int _size;                              // velicina niza
    public:

    CDLista()                               // konstruktor
    {                                       //treba inicijalizovati pocetne vrednosti
        prvi=new node();
        _size=0;
    }

    CDLista(CDLista& lista)                 // konstruktor sa parametrom iste klase
    {                                       // ovde treba kopirati podatke iz lista u trenutni objekat klase(u *this)
        _size=lista._size;                  // prvo kopiramo velicinu
        prvi=new node(*lista.prvi);         // pa i prvi node, ali pritom pazimo da kopiramo sadrzaj, a ne adresu
                                            // zbog toga ne treba napisati prvi=lista.prvi, jer bi se promenom nekog clana
                                            // jednog objekta promenio i drugi
    }


    bool change(unsigned int index, int broj)       // funkcija koja menja neki clan lista
    {                                               // ili unosi novi. Treba je koristiti za vec inicijalizovane clanove
                                                    // ili da bi se inicijalizovao prvi neinicijalizovani clan, jer ako
                                                    // bi se inicijalizovao clan recimo rbr. 50, a lista je do tada imala
                                                    // 20 clanova, clanovi od 21 do 50 bi imali neodredjene vrednosti
        if (index>_size)                            // ovde se osiguravamo da se nece desiti malopre pomenuta situacija
        return false;
        int koraci=index/velicinaNiza;              // u kom po redu node-u se nalazi element
        int element=index%velicinaNiza;             // koji po redu element je u listi u node-u(moze biti od 0 do velicinaNiza=20)
        node *xnode=prvi;                           // xnode sluzi za kretanje kroz povezanu listu, preko xnode->next dolazimo do sledeceg
        for (int i=0; i<koraci; i++)                // node-a. Ova petlja pronalazi adresu i-tog noda, u kome se nalazi element koga trazimo
        {
            if (xnode->next==0)                     // ako je kraj node, uzimamo novi. Ovo ce se desiti samo ako je element prvi
                xnode->next=new node();             // neinicijalizovan, i prvi je u listi node-a

            xnode=xnode->next;                      // prenosimo adresu xnode-a dalje, da bi se petlja izvrsila na sledecem node-u
        }
        if (index==_size)                           // ako je index==_size, to je slucaj sa prvim neinicijalizovanim brojem,
            _size++;                                // pa moramo povecati velicinu celog objekta
        xnode->lista[element]=broj;                 // dodela broja
        return true;                                // posto je broj dodeljen, vracamo vrednost true
    }

    int size()                                      // jednostavna funkcija koja vraca trenutnu velicinu niza
    {
        return _size;
    }

    int& operator[](int index)                      // funkcija dosta slicna funkciji change, samo sto ne proveravamo
    {                                               // _size, i ne vrsimo dodelu.
        int koraci=index/velicinaNiza;              // Vazno je da ova funkcija vraca referencu na element objekta,
        int element=index%velicinaNiza;             // da bi mogli da ga promenimo(kao lista[0]=3);
        node *xnode=prvi;
        for (int i=0; i<koraci; i++)
            xnode=xnode->next;
        return xnode->lista[element];               // vraca element(tipa int)
    }

    void operator= (CDLista& lista)                 // kopira elemente lista u elemente niz, pri cemo je vazno
    {                                               // da ne kopiramo pokazivace u pokazivace sa istom adresom
        delete prvi;                                // brisemo prvi node, da ne bi doslo do curenja memorije
                                                    // naravno ovo brise(rekurzivno) i sve ostale node-ove
        _size=lista.size();                         // ista velicina
        prvi=new node(*lista.prvi);                 // opet se rekurzivno preslikava reprezentacija cele liste
                                                    // pri cemu prvi i lista.prvi nemaju iste adrese,
                                                    // a razlicite adrese imaju i pokazivaci koji oni sadrze
                                                    // zbog rekurzivne funkcije node(const node& osnova)
    }

    void append(int broj)                           // funkcija za dodavanje elementa
    {
        change(_size, broj);                        // poziva change za index na poslednjem mestu
    }                                               // nema potrebe da pisemo _size++ jer ce to funkcija change
                                                    // sama uraditi

    void pop()                                      // brise poslednji element
    {                                               // pri tom brise i node ako je u pitanju element na mestu 0 tog node-a.
        if (_size!=0)                               // ako je objekat nema elemente onda nema sta izbrisati
        {
        _size--;                                    // smanjuje se velicina niza
        if (_size%velicinaNiza==0 && _size!=0)      // brisemo poslednji node, ako je element prvi u node-ovoj listi, i naravno
        {                                           // nije prvi u prvom node-u, jer bi to bila greska, jer bi posle isti morali da inicijalizujemo
            int koraci=((_size)/velicinaNiza)-1;    // opet slicno funkciji change, samo razlika je sto su koraci za jedan manji,
        node *xnode=prvi;                           // jer trebamo ne samo da obrisemo poslednji node, vec i da u pretposlednjem
        for (int i=0; i<koraci; i++)                // poslednji node (next) oznacimo kao kraj povezane liste node-ova
        {                                           // takodje treba paziti da je _size vec smanjen, pa prilikom racunanja index poslednjeg
            xnode=xnode->next;                      // elementa je _size, a ne _size-1
        }

        delete xnode->next;                         // sustina funkcije, brisanje poslednjeg node-a, ako su se za
        xnode->next=0;                              // to stekli uslovi
        }
        }
    }
    void empty()                                    // brise sve elemente
    {
        if (_size!=0)                               // ako je objekat nema elemente onda nema sta izbrisati
        {
            delete prvi;                            // brisemo sve podatke objekta pa ih opet inicijalizujemo
            prvi=new node()
            _size=0;
        }
    }
};

 
Odgovor na temu

Kushwais

Član broj: 160006
Poruke: 30
*.6.11.vie.surfer.at.



Profil

icon Re: [Zadatak] Dinamicki Array08.07.2008. u 19:55 - pre 192 meseci
Hvala opat na objasnjenju :)

da li je dovoljno u destructoru

~ node (){
..... }

dovoljno obrisati samo next ili je mozda potrebno i listu ??
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Dinamicki Array

Strane: 1 2

[ Pregleda: 6446 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.