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: 6480 | 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 Re: [Zadatak] Dinamicki Array09.07.2008. u 13:56 - pre 192 meseci
i print() funkcija . uspevam ispravno samo prvih 20 elementa da ispisem ?

hvala

print () radi kako treba :)



[Ovu poruku je menjao Kushwais dana 10.07.2008. u 00:06 GMT+1]
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array10.07.2008. u 22:07 - pre 192 meseci
nazalost pop() i empty(), ne rade kako treba :(
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array11.07.2008. u 18:44 - pre 192 meseci
Leto i odmori su u toku :) ali ako nekog ima molio bih da mi odgovori ...

promenio sam funkciju empty()

Code:
void empty()                                    
    {
        if (_size!=0)                               
        {   node *xnode=prvi;
            int koraci=_size/velicinaNiza;
            for(int i=0;i<koraci;i++)
            xnode=xnode->next;
            delete xnode->lista;           
            _size=0;
            prvi->next=0;
        }
    }


ne znam da li je ovo u redu ?? hvala


hm, provereno ne valja

[Ovu poruku je menjao Kushwais dana 11.07.2008. u 23:06 GMT+1]
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array11.07.2008. u 22:24 - pre 192 meseci
Citat:
Kushwais: Hvala opat na objasnjenju :)

da li je dovoljno u destructoru

~ node (){
..... }

dovoljno obrisati samo next ili je mozda potrebno i listu ??


destruktor(koji sam zaboravio da ubacim) izgleda ovako :
Code:


~CDLista()
    {
        delete prvi;
    }


brisanjem node-a prvi dalje se rekurzivno brisu i ostali node-ovi.
Sta tacno nije dobro sa funkcijama pop() i empty()? Kod mene dobro rade. Ako mozes navedi kod u kojima ih koristis.
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array11.07.2008. u 22:58 - pre 192 meseci
pa recimo u funkciji empty();

CDLista a ;
...

a.empty();
cout<<a[0];
cout<<a[1];
...

jedino sto je izrisano je prvi index , dobija vrednsot 0 ali zato ostali indexi su tu, vrednosti koje sam pre ubacio .

milsim da je isti probllem kod pop()
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array11.07.2008. u 23:32 - pre 192 meseci
void empty()
{
if (_size!=0)
{ if(prvi->next)
delete prvi->next;
delete prvi;
prvi=new node();
_size=0;
}
}

ovako sam ja to ispravio , da li je ok??
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array12.07.2008. u 11:00 - pre 192 meseci
To nije problem. Kada se ceo niz obrise, naravno da ce ostati prvih dvadeset elemenata. Posto je u pitanju tip int, bolje je bilo da se u osnovi node-a stavi lista od int[20], a ne lista pokazivaca na tip int*( kao int *lista[20]). Takodje kada obrises poslednji element ono sto se desava jeste smanjenje podatka _size za jedan. Nekad nema potrebe da se uradi bilo sta drugo, jer kako bi ti recimo mogao da obrises recimo 15 element niza int lista[20]? Jedino sto mozes da uradis jeste da recimo tom petnaestom elementu das neku vrednost kojom ces obeleziti da je izbrisan(recimo -1). Inace nema potrebe za brisanjem element po element(ne znam ni kako bi to uradio ako ne bih imao listu pokazivaca na tip int, sto u ovom slucaju nije potrebno). Ono sto je vazno jeste da se izbrise node ako se lista u tom node-u ne sadrzi vise nijedan element(sto mozemo zakljuciti preko promenljive _size). Tada se poslednji node brise. Tako i funkcija empty() brise sve elemente, ali kada ponovo inicijalizuje node prvi postoji mogucnost(cak je i verovatno) da ce da koristi memoriju koja je prethodno koriscena za node prvi, tako da ima iste elemente. Tvoja funkcija empty je gotovo ista kao i moja, evo objasnjenja:

Code:


void empty()
{
if (_size!=0)                      
{ if(prvi->next)
delete prvi->next;
delete prvi;
prvi=new node();
_size=0;
}
}



Kada obrises node prvi on dalje proverava ovaj tvoj deo koda

Code:


if(prvi->next)
delete prvi->next;



Dalje on to proverava za (prvi->next)->next i tako dalje. tako da obe funkcije rade isto samo tvoja ima jedan korak vise. Inace lepo si ovo napisao jer bi mozda bolje bilo da se ova funkcija napise kao:

Code:


void empty()
{
if (_size!=0)                      
{ if(prvi->next)
delete prvi->next;
_size=0;
}
}



Ostavljamo prvi node, ali menjamo _size pa iako imamo neke vrednosti prethodno koriscene to nije vazno posto prilikom koriscenja dinamickog niza treba paziti pre svega na velicinu. Jedino sto mogu da predlozim jeste da recimo ako hoces cisto zbog sebe da sve elemente koje izbrises stavis vrednost 0, mada za to nema potrebe.

Evo nekih primera gde se vidi da ove funkcije rade

Code:

// ovde se nalazi klasa CDLista

int main()
{
    CDLista lista;
    for (int i=0;i<152;i++)
    lista.append(i);
        printf("%d",lista[151]);  // uspeva da otstampa posto postoji 152 elementa
    lista.empty();              // brise sve elemente i inicijalizuje prvih dvadeset
    printf("%d",lista[152]); // naravno ovde se javlja error i program se zavrsava jer se ne moze pristupiti 152 elementu
    return 0;
}


Slicno proslom programu samo koristi funkciju pop().

Code:

// ovde se nalazi klasa CDLista

int main()
{
    CDLista lista;
    for (int i=0;i<152;i++)
    lista.append(i);
        printf("%d",lista[151]);  // uspeva da otstampa posto postoji 152 elementa
    for (int i=0;i<152;i++)
    lista.pop();              // brise sve elemente i inicijalizuje prvih dvadeset
    printf("%d",lista[152]); // naravno ovde se javlja error i program se zavrsava jer se ne moze pristupiti 152 elementu
    return 0;
}


Ukoliko zelis da ti recimo operator [] vrati neku vrednost ako prekoracis velicinu niza kada pristupas index-u, mozes da promenis funkciju operator[] tako da izgleda ovako:

Code:

int& operator[](int index)                     
    {
    int error=0;                    //broj kojim ces obeleziti da si prekoracio velicinu niza
        if (index>=_size) return error;         // ukoliko je velicina niza prekoracena vraca taj broj                                      
        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];              
    }

Nadam se da je ovo ono sto si zeleo.

[Ovu poruku je menjao Aleksa Stankovic dana 12.07.2008. u 12:28 GMT+1]
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array13.07.2008. u 12:13 - pre 192 meseci
Hvala za trud Aleksa :) dosta mi je pomoglo !

Nazalost copyconstuktor radi lepo samo za prvih 20 elemenata , ako upisem vise , ispise mi "slucajne brojeve "
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array13.07.2008. u 19:41 - pre 192 meseci
Code:
DynArray( DynArray& lista)                 
    {                                      
        _size=lista._size;                  
        //prvi=new node(*lista.prvi);
           prvi=lista.prvi;
                                           
                                         
    }



sada radi :)
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array14.07.2008. u 21:24 - pre 192 meseci
Citat:
Kushwais:
Code:
DynArray( DynArray& lista)                 
    {                                      
        _size=lista._size;                  
        //prvi=new node(*lista.prvi);
           prvi=lista.prvi;
                                           
                                         
    }



sada radi :)



Mozes li da opises problem sa konstruktorom koristeci kod, posto i ovo kod mene radi. Inace, ovaj kod koji si ti napisao nije dobar iz razloga sto dodeljujes iste adrese, pa kada menjas podatak jedne liste menjas podatak i druge. Primer:
Code:


#include "DynArray"

int main()
{
    DynArray lista1;
    for (int i=0; i<145 ; i++)
    lista1.append(i);
    DynArray lista2(lista1);
    lista1[56]=2;
    cout << (lista2)[56];
    return 0;
}


Koristeci tvoju definiciju, na ekran ce se ispisati 2, dok je pravilno da bude ispisano 56. Sa mojim primerkom ovog konstruktora ne dolazi do ovog problema.
 
Odgovor na temu

Kushwais

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



Profil

icon Re: [Zadatak] Dinamicki Array16.07.2008. u 13:37 - pre 192 meseci
U pravu si Aleksa , to sam i kasnije sam video ... problem je doslo samo prilikom ispisa posto sam u node napravio metodu print , kao i u CDLista ..., a ne u constructory , no to sam ispravio sad je sve u najboljme rede !


Desetka za trud Aleksa ;) hvala puno !!!!
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
212.200.65.*



Profil

icon Re: [Zadatak] Dinamicki Array20.07.2008. u 18:43 - pre 192 meseci
Hvala i tebi. Ako bude trebalo jos nesto... tu sam :))
 
Odgovor na temu

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

Strane: 1 2

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

Postavi temu Odgovori

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