Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 31 odgovor
  • 8.855 pregleda

Najnovija ↓

[Zadatak] Dinamicki Array 03.07.2008. u 21:46 · pre 223 meseca #1
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
Re: [Zadatak] Dinamicki Array 04.07.2008. u 13:26 · pre 223 meseca #2
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?
Re: [Zadatak] Dinamicki Array 04.07.2008. u 13:42 · pre 223 meseca #3
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 :)
Re: [Zadatak] Dinamicki Array 04.07.2008. u 13:57 · pre 223 meseca #4
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.
Re: [Zadatak] Dinamicki Array 04.07.2008. u 14:07 · pre 223 meseca #5
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

:)

Re: [Zadatak] Dinamicki Array 04.07.2008. u 16:01 · pre 223 meseca
izmenjeno 2 puta, poslednji put opat 05.07.2008. u 23:38
  1. opat05.07.2008. u 23:38zapis iz teksta poruke
  2. opat04.07.2008. u 17:18zapis iz teksta poruke
#6
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!
Re: [Zadatak] Dinamicki Array 04.07.2008. u 16:26 · pre 223 meseca #7
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
Re: [Zadatak] Dinamicki Array 04.07.2008. u 17:25 · pre 223 meseca #8
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...
Re: [Zadatak] Dinamicki Array 04.07.2008. u 18:41 · pre 223 meseca #9
jedina ide bi bila , zar se ne moze izvesti da araay dinamicki "napravi " sa new ??

primetio sam izmene poruka :) hvala
Re: [Zadatak] Dinamicki Array 05.07.2008. u 14:07 · pre 223 meseca #12
Pokusavam da napisem zuweisungoperator ali ne ide ...

CDLista & CDLista::operator=(const CDLista & op) {
....
...
return *this; }
Re: [Zadatak] Dinamicki Array 05.07.2008. u 17:35 · pre 223 meseca #13
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.
Re: [Zadatak] Dinamicki Array 05.07.2008. u 19:15 · pre 223 meseca #14
Jeste komplikavanije , nazalost jedino sto uspevam jeste adresu da prekopiram , tako da imam 2 "instanzvariable " koje imaju istu adresu ...
Re: [Zadatak] Dinamicki Array 05.07.2008. u 21:00 · pre 223 meseca #15
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 ...
Potpis
Viva lollapalooza
Re: [Zadatak] Dinamicki Array 05.07.2008. u 23:37 · pre 223 meseca #16
Konacno dodao sam i funkciju za operator =, kao i jos neka unapredjenja. Kod jos nije u potpunosti zavrsen, mislim cu ga jos malo obraditi.
Re: [Zadatak] Dinamicki Array 06.07.2008. u 00:38 · pre 223 meseca #17
hvala opat , zamolio bih te samo da prokomentarises program , zeleo bih da shvatim svaki red .. hvala ti puno
Re: [Zadatak] Dinamicki Array 07.07.2008. u 13:26 · pre 223 meseca #19
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;
        }
    }
};

Re: [Zadatak] Dinamicki Array 08.07.2008. u 20:55 · pre 223 meseca #20
Hvala opat na objasnjenju :)

da li je dovoljno u destructoru

~ node (){
..... }

dovoljno obrisati samo next ili je mozda potrebno i listu ??
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme