Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
Postano: 20:15 sub, 30. 10. 2010 Naslov: |
|
|
Deklariraj i inicijaliziraj jednu varijablu koja će pamtiti je li niz sretan, jednu varijablu za parnost oznake djeteta te jednu za mjerenje duljine niza.
U while-petlji se kreći prema korijenu. Ako primjetiš da je oznaka trenutnog čvora iste parnosti kao i oznaka čvora kojeg si prethodno gledala (njegovo dijete), znaš da je niz sretan. Kakogod, nastaviš dalje, pritom povećavajući mjerač duljine.
Vrati 0 ako niz nije sretan, inače duljinu niza.
Deklariraj i inicijaliziraj jednu varijablu koja će pamtiti je li niz sretan, jednu varijablu za parnost oznake djeteta te jednu za mjerenje duljine niza.
U while-petlji se kreći prema korijenu. Ako primjetiš da je oznaka trenutnog čvora iste parnosti kao i oznaka čvora kojeg si prethodno gledala (njegovo dijete), znaš da je niz sretan. Kakogod, nastaviš dalje, pritom povećavajući mjerač duljine.
Vrati 0 ako niz nije sretan, inače duljinu niza.
|
|
[Vrh] |
|
andra Forumaš(ica)
Pridružen/a: 02. 11. 2009. (19:23:23) Postovi: (4F)16
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
homesweethome Forumaš(ica)
Pridružen/a: 21. 10. 2009. (16:25:25) Postovi: (1C)16
|
Postano: 22:08 ned, 31. 10. 2010 Naslov: |
|
|
e da :lol: i ja sam sad na tom zadatku, i zanima me u koju varijablu mogu spremati broj pojavljivanja određenog slova/broja ak pise da se mogu koristiti samo dva pomoćna stoga, govorim o grupi u kojoj se pojavljuju pod tipa char, al svejedno... :)
[size=9][color=#999999]Added after 34 minutes:[/color][/size]
http://web.math.hr/nastava/spa/kolokviji/2009/SPA2009%20-%20kolokvij1%20-%20zadaci.pdf
i još jedno pitanje : u prvom zadatku pod a) , jel mozemo zanemariti ovaj uvijet da stog mora ostati nepromijenjen, jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga
e da i ja sam sad na tom zadatku, i zanima me u koju varijablu mogu spremati broj pojavljivanja određenog slova/broja ak pise da se mogu koristiti samo dva pomoćna stoga, govorim o grupi u kojoj se pojavljuju pod tipa char, al svejedno...
Added after 34 minutes:
http://web.math.hr/nastava/spa/kolokviji/2009/SPA2009%20-%20kolokvij1%20-%20zadaci.pdf
i još jedno pitanje : u prvom zadatku pod a) , jel mozemo zanemariti ovaj uvijet da stog mora ostati nepromijenjen, jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
Postano: 22:34 ned, 31. 10. 2010 Naslov: |
|
|
Moras slat adresu jer moras premjestat elemente iz stoga (brisat, opet stavljat kasnije) u red. opcenito, adresu uvijek saljes kad dodajes, brises ili mjenjas elemente u stogu,redu,... . A kad samo nesto provjeravas ili ispisujes onda netrebas.
Primjer;
TOP(S)-> ne "radis" mu nista nego ga samo "gledas"
FRONT(Q)-> isto samo gledas element na pocetku reda i nista ne radis s njim.
e, a kad imas recimo
PUSH(&S)-> saljes adresu jer trebas promjenit svoj stog.
Ako se sjecas sa prog 1 ( ili 2 cak ) pointera. Saljes pointer u f-ju kad je zelis promjenit u f-ji i onda je natrag dobit u main-u promjenjenu. e, ovo ti je ista stvar osim sto ti je sad tu pointer stog.
Nadam se da sam ti jednostavno objasnio i da si skuzio :)
Moras slat adresu jer moras premjestat elemente iz stoga (brisat, opet stavljat kasnije) u red. opcenito, adresu uvijek saljes kad dodajes, brises ili mjenjas elemente u stogu,redu,... . A kad samo nesto provjeravas ili ispisujes onda netrebas.
Primjer;
TOP(S)-> ne "radis" mu nista nego ga samo "gledas"
FRONT(Q)-> isto samo gledas element na pocetku reda i nista ne radis s njim.
e, a kad imas recimo
PUSH(&S)-> saljes adresu jer trebas promjenit svoj stog.
Ako se sjecas sa prog 1 ( ili 2 cak ) pointera. Saljes pointer u f-ju kad je zelis promjenit u f-ji i onda je natrag dobit u main-u promjenjenu. e, ovo ti je ista stvar osim sto ti je sad tu pointer stog.
Nadam se da sam ti jednostavno objasnio i da si skuzio
_________________ Ako ste previše otvorenog uma, ispast će vam mozak
------------------------------------------------------
Racunalo bez Windowsa je kao riba bez bicikla
|
|
[Vrh] |
|
homesweethome Forumaš(ica)
Pridružen/a: 21. 10. 2009. (16:25:25) Postovi: (1C)16
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
Postano: 23:05 ned, 31. 10. 2010 Naslov: |
|
|
[quote="homesweethome"]jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga[/quote]
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos. :bricks:
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš! :D
homesweethome (napisa): | jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga |
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos.
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš!
|
|
[Vrh] |
|
homesweethome Forumaš(ica)
Pridružen/a: 21. 10. 2009. (16:25:25) Postovi: (1C)16
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
Postano: 23:31 ned, 31. 10. 2010 Naslov: |
|
|
[quote="pmli"][quote="homesweethome"]jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga[/quote]
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos. :bricks:
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš! :D[/quote]
ima mi smisla to kaj velis, ali onda me muci ovo. Zasto onda u neke f-je pozivamo sa &S ili &Q a neke ne ako mozes mjenjat na oba dva nacina stog/red.
Bas se budem poigrao s tim sutra pa da vidim kaj ispadne jer me veoma zanima kaj ce ispast na kraju. :)
pmli (napisa): | homesweethome (napisa): | jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga |
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos.
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš! |
ima mi smisla to kaj velis, ali onda me muci ovo. Zasto onda u neke f-je pozivamo sa &S ili &Q a neke ne ako mozes mjenjat na oba dva nacina stog/red.
Bas se budem poigrao s tim sutra pa da vidim kaj ispadne jer me veoma zanima kaj ce ispast na kraju.
_________________ Ako ste previše otvorenog uma, ispast će vam mozak
------------------------------------------------------
Racunalo bez Windowsa je kao riba bez bicikla
|
|
[Vrh] |
|
Marvin Forumaš(ica)
Pridružen/a: 01. 12. 2006. (15:46:10) Postovi: (56)16
|
Postano: 23:35 ned, 31. 10. 2010 Naslov: |
|
|
[quote="ante003"]Moras slat adresu jer moras premjestat elemente iz stoga (brisat, opet stavljat kasnije) u red. opcenito, adresu uvijek saljes kad dodajes, brises ili mjenjas elemente u stogu,redu,... . A kad samo nesto provjeravas ili ispisujes onda netrebas.
Primjer;
TOP(S)-> ne "radis" mu nista nego ga samo "gledas"
FRONT(Q)-> isto samo gledas element na pocetku reda i nista ne radis s njim.
e, a kad imas recimo
PUSH(&S)-> saljes adresu jer trebas promjenit svoj stog.
Ako se sjecas sa prog 1 ( ili 2 cak ) pointera. Saljes pointer u f-ju kad je zelis promjenit u f-ji i onda je natrag dobit u main-u promjenjenu. e, ovo ti je ista stvar osim sto ti je sad tu pointer stog.
Nadam se da sam ti jednostavno objasnio i da si skuzio :)[/quote]
Malo preciznije, funkcija prima kopiju vrijednosti koju joj šalješ. Svi parametri koje pošalješ funkciji kao ulazne vrijednosti kopiraju se na posebno mjesto u memoriji.
Imena ulaznih parametara su identifikatori za te lokalne kopije.
Kada promijeniš neke od vrijednosti ulaznih parametara koristeći imena ulaznih parametara, tada se mijenja ta kopija.
Primjer:
[code:1]
void Foo(int a) {};
void Bar(int* pa) {};
[/code:1]
U prvoj funkciji ćeš proslijediti cijeli broj; [tt]int[/tt]. To znači da će se proslijeđeni broj kopirati na neko drugo mjesto u memoriji. Unutar tijela funkcije se tom mjestu može pristupiti pomoću imena [tt]a[/tt].
U drugoj funkciji trebaš proslijediti pokazivač na cijeli broj; [tt]int*[/tt]. To znači da se proslijeđeni pokazivač (adresa) kopira na neko drugo mjesto u memoriji. Unutar tijela funkcije se tom mjestu može pristupiti pomoću imena [tt]pa[/tt].
Skicirano:
[code:1]int broj = 14; // broj = 156 [14], uz pretpostavku da je adresa inicijaliziranog cijelog broja 156
Foo(broj); // a = 168 [14], uz pretpostavku da je kopija stvorena na adresi 168
int* brojPtr = &a; // brojPtr = 160 [156], uz pretpostavku da je adresa inicijaliziranog pokazivača na cijeli broj 160
Bar(brojPtr); // pa = 164 [156], uz pretpostavku da je kopija stvorena na adresi 164
[/code:1]
Sada primjeti da iako se pokazivač [tt]brojPtr[/tt] i njegova kopija [tt]pa[/tt] nalaze na različitim mjestima, oba imaju istu vrijednost. Pomoću te vrijednosti 156 možemo indirektno pristupiti istom broju, [tt]broj = 156 [14][/tt], pomoću operatora dereferenciranja [tt]*[/tt] - npr [tt]*pa[/tt] ili [tt]*brojPtr[/tt].
Ako bi u funkciji [tt]Foo[/tt] promijenio vrijednost ulaznog podataka pomoću imena [tt]a[/tt] (npr. [tt]a = nova vrijednost[/tt]), ona bi se promijenila na adresi 168, dok bi vrijednost na adresi 156 ostala nepromijenjena ([tt]broj = 156 [14], a = 168 [nova vrijednost][/tt]).
Kada bi u funkciji [tt]Bar[/tt] promijenio vrijednost ulaznog podatka pomoću imena [tt]pa[/tt] (npr. [tt]pa = nova vrijednost[/tt]), ona bi se promijenila na adresi 164, pa bi pokazivač [tt]pa[/tt] pokazivao na novu vrijednost ([tt]pa = 164 [nova vrijednost][/tt]);
Kada u funkciji [tt]Bar[/tt] promijeniš vrijednost [b]na koju pokazuje[/b] pokazivač [tt]pa[/tt] koristeći operator dereferenciranja [tt]*pa[/tt] (npr. [tt]*pa = nova vrijednost[/tt]), promijeni se vrijednost na adresi na koju pokazuje [tt]pa[/tt], dakle na adresi 156 ([tt]broj = 156 [nova vrijednost][/tt]).
Ukratko, pokazivači nam omogućavaju jedan stupanj indirektnosti - oni nisu direktno vrijednost podatka koji nas zanima, nego indirektno sadrže informaciju kako doći do vrijednosti (njihova vrijednost je podatak o tome kako doći do vrijednosti koja nas zanima).
ante003 (napisa): | Moras slat adresu jer moras premjestat elemente iz stoga (brisat, opet stavljat kasnije) u red. opcenito, adresu uvijek saljes kad dodajes, brises ili mjenjas elemente u stogu,redu,... . A kad samo nesto provjeravas ili ispisujes onda netrebas.
Primjer;
TOP(S)→ ne "radis" mu nista nego ga samo "gledas"
FRONT(Q)→ isto samo gledas element na pocetku reda i nista ne radis s njim.
e, a kad imas recimo
PUSH(&S)→ saljes adresu jer trebas promjenit svoj stog.
Ako se sjecas sa prog 1 ( ili 2 cak ) pointera. Saljes pointer u f-ju kad je zelis promjenit u f-ji i onda je natrag dobit u main-u promjenjenu. e, ovo ti je ista stvar osim sto ti je sad tu pointer stog.
Nadam se da sam ti jednostavno objasnio i da si skuzio |
Malo preciznije, funkcija prima kopiju vrijednosti koju joj šalješ. Svi parametri koje pošalješ funkciji kao ulazne vrijednosti kopiraju se na posebno mjesto u memoriji.
Imena ulaznih parametara su identifikatori za te lokalne kopije.
Kada promijeniš neke od vrijednosti ulaznih parametara koristeći imena ulaznih parametara, tada se mijenja ta kopija.
Primjer:
Kod: |
void Foo(int a) {};
void Bar(int* pa) {};
|
U prvoj funkciji ćeš proslijediti cijeli broj; int. To znači da će se proslijeđeni broj kopirati na neko drugo mjesto u memoriji. Unutar tijela funkcije se tom mjestu može pristupiti pomoću imena a.
U drugoj funkciji trebaš proslijediti pokazivač na cijeli broj; int*. To znači da se proslijeđeni pokazivač (adresa) kopira na neko drugo mjesto u memoriji. Unutar tijela funkcije se tom mjestu može pristupiti pomoću imena pa.
Skicirano:
Kod: | int broj = 14; // broj = 156 [14], uz pretpostavku da je adresa inicijaliziranog cijelog broja 156
Foo(broj); // a = 168 [14], uz pretpostavku da je kopija stvorena na adresi 168
int* brojPtr = &a; // brojPtr = 160 [156], uz pretpostavku da je adresa inicijaliziranog pokazivača na cijeli broj 160
Bar(brojPtr); // pa = 164 [156], uz pretpostavku da je kopija stvorena na adresi 164
|
Sada primjeti da iako se pokazivač brojPtr i njegova kopija pa nalaze na različitim mjestima, oba imaju istu vrijednost. Pomoću te vrijednosti 156 možemo indirektno pristupiti istom broju, broj = 156 [14], pomoću operatora dereferenciranja * - npr *pa ili *brojPtr.
Ako bi u funkciji Foo promijenio vrijednost ulaznog podataka pomoću imena a (npr. a = nova vrijednost), ona bi se promijenila na adresi 168, dok bi vrijednost na adresi 156 ostala nepromijenjena (broj = 156 [14], a = 168 [nova vrijednost]).
Kada bi u funkciji Bar promijenio vrijednost ulaznog podatka pomoću imena pa (npr. pa = nova vrijednost), ona bi se promijenila na adresi 164, pa bi pokazivač pa pokazivao na novu vrijednost (pa = 164 [nova vrijednost]);
Kada u funkciji Bar promijeniš vrijednost na koju pokazuje pokazivač pa koristeći operator dereferenciranja *pa (npr. *pa = nova vrijednost), promijeni se vrijednost na adresi na koju pokazuje pa, dakle na adresi 156 (broj = 156 [nova vrijednost]).
Ukratko, pokazivači nam omogućavaju jedan stupanj indirektnosti - oni nisu direktno vrijednost podatka koji nas zanima, nego indirektno sadrže informaciju kako doći do vrijednosti (njihova vrijednost je podatak o tome kako doći do vrijednosti koja nas zanima).
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
Marvin Forumaš(ica)
Pridružen/a: 01. 12. 2006. (15:46:10) Postovi: (56)16
|
Postano: 0:13 pon, 1. 11. 2010 Naslov: |
|
|
[quote="ante003"][quote="pmli"][quote="homesweethome"]jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga[/quote]
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos. :bricks:
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš! :D[/quote]
ima mi smisla to kaj velis, ali onda me muci ovo. Zasto onda u neke f-je pozivamo sa &S ili &Q a neke ne ako mozes mjenjat na oba dva nacina stog/red.
Bas se budem poigrao s tim sutra pa da vidim kaj ispadne jer me veoma zanima kaj ce ispast na kraju. :)[/quote]
[b]Kratki odgovor:[/b]
Asistenti nisu bili najjasniji, a željeli su da ustvari pošaljete STACK* umjesto STACK kao ulazni podatak.
[b]Duži odgovor:[/b]
Iako [tt]pmli[/tt] u jednu ruku ima pravo, ti se s tim ne moraš zamarati na razini ATP-a.
ATP ti daje funkcije koje su točno definirane - funkcija s prototipom iz šalabahtera radi onako kako očekuješ. Znači, kada pozivaš [tt]void DEQUEUE(QUEUE* Q)[/tt], toj funkciji moraš proslijediti adresu ATP tipa QUEUE. To je smisao tog [tt]QUEUE*[/tt]. Unutar tijela funkcije je onda [tt]Q[/tt] identifikator za adresu apstraktnog tipa QUEUE.
Ali ti ionako ne možeš mijenjati unutrašnjost tijela funkcije ATP-a. To da li je u pozadini QUEUE ustvari neki [tt]int*[/tt], pa je njegova adresa ustvari [tt]int**[/tt] je tebi tako svejedno. Odgovornost implementatora funkcije je da posloži implementaciju tako da zadovoljava tvoja očekivanja.
Ono gdje ima nekog smisla razmišljati o tome što šalješ i što je u tijelu je pisanje vlastitih funkcija.
Npr.
1. Tvoja funkcija ima prototip koji zahtijeva adresu. Tada joj moraš proslijediti adresu. Unutar tijela funkcije je tada ime identifikator za adresu.
1.1. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva adresu, samo proslijediš adresu
1.2. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva vrijednost, proslijeđuješ dereferenciranu adresu
2. Tvoja funkcija ima prototip koji zahtijeva vrijednost. Tada joj moraš proslijediti vrijednost podatka. Unutar tijela funkcije je tada ime identifikator za vrijednost podatka.
2.1. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva adresu, proslijeđuješ adresu podataka adresnim operatorom
2.2. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva vrijednost, proslijeđuješ vrijednost podatka
Primjer:
[code:1]
void Foo(QUEUE Q)
{
DEQUEUE(&Q); // primjeti da se sada ustvari izbacuje početak na kopiji reda unutar funkcije, ne na originalnom redu
EMPTY(Q);
}
void Bar(QUEUE* Q)
{
DEQUEUE(Q); // sada se izbacuje početak na originalnom redu jer mu se pristupa po adresi
EMPTY(*Q);
}
QUEUE Q;
Foo(Q);
Bar(&Q);
[/code:1]
Kada bi stog i bio implementiran pokazivačima i kada bi i kopirao pokazivač kao vrijednost stoga, ne mora se promijeniti početni stog. Zašto?
Ovo je originalni stog:
S [&a_1] -> [a_1|&a_2] -> [a_2|&a_3] -> ... -> [a_n|NULL]
Vrijednost pokazivača S se kopira. Novi stog dodaje recimo element u stog. Tada kopija stoga izgleda ovako:
S [&a_novi] -> [a_novi|&a_1] -> [a_1|&a_2] -> [a_2|&a_3] -> ... -> [a_n|NULL].
Stari stog je isti jer je identificiran pokazivačem na prvi element. Isto tako i za pop.
I kod implementacije liste pomoću pointera se može izbjeći da se mijenja vrijednost originalne liste.
Ali ja se ne bi zamarao sa time, radije pretpostavite da kada šaljete po vrijednosti mijenjaš kopiju, kada šalješ po adresi dereferenciranjem mijenjate original
ante003 (napisa): | pmli (napisa): | homesweethome (napisa): | jer ocito ostaje nepromijenjen ukoliko u pozivu fje ne saljemo adresu stoga |
To ne mora vrijediti. Ako je stog implementiran pomoću pointera, čak i ako šalješ samo stog, to je ipak adresa, i s njom možeš napraviti kaos.
Kad ćeš provjeravati svoj kod na računalu, htjeti ćeš i vidjeti jesi li dobro upisala stog, pa zatim i što je u stogu ostalo nakon što ga je funkcija napala, pa ćeš se sjetit napisati funkciju za ispis stoga. Ako koristiš stog implementiran pointerima, jako se pazi što radiš! |
ima mi smisla to kaj velis, ali onda me muci ovo. Zasto onda u neke f-je pozivamo sa &S ili &Q a neke ne ako mozes mjenjat na oba dva nacina stog/red.
Bas se budem poigrao s tim sutra pa da vidim kaj ispadne jer me veoma zanima kaj ce ispast na kraju. |
Kratki odgovor:
Asistenti nisu bili najjasniji, a željeli su da ustvari pošaljete STACK* umjesto STACK kao ulazni podatak.
Duži odgovor:
Iako pmli u jednu ruku ima pravo, ti se s tim ne moraš zamarati na razini ATP-a.
ATP ti daje funkcije koje su točno definirane - funkcija s prototipom iz šalabahtera radi onako kako očekuješ. Znači, kada pozivaš void DEQUEUE(QUEUE* Q), toj funkciji moraš proslijediti adresu ATP tipa QUEUE. To je smisao tog QUEUE*. Unutar tijela funkcije je onda Q identifikator za adresu apstraktnog tipa QUEUE.
Ali ti ionako ne možeš mijenjati unutrašnjost tijela funkcije ATP-a. To da li je u pozadini QUEUE ustvari neki int*, pa je njegova adresa ustvari int** je tebi tako svejedno. Odgovornost implementatora funkcije je da posloži implementaciju tako da zadovoljava tvoja očekivanja.
Ono gdje ima nekog smisla razmišljati o tome što šalješ i što je u tijelu je pisanje vlastitih funkcija.
Npr.
1. Tvoja funkcija ima prototip koji zahtijeva adresu. Tada joj moraš proslijediti adresu. Unutar tijela funkcije je tada ime identifikator za adresu.
1.1. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva adresu, samo proslijediš adresu
1.2. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva vrijednost, proslijeđuješ dereferenciranu adresu
2. Tvoja funkcija ima prototip koji zahtijeva vrijednost. Tada joj moraš proslijediti vrijednost podatka. Unutar tijela funkcije je tada ime identifikator za vrijednost podatka.
2.1. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva adresu, proslijeđuješ adresu podataka adresnim operatorom
2.2. Ako unutar funkcije pozivaš neku funkciju ATP-a koja zahtijeva vrijednost, proslijeđuješ vrijednost podatka
Primjer:
Kod: |
void Foo(QUEUE Q)
{
DEQUEUE(&Q); // primjeti da se sada ustvari izbacuje početak na kopiji reda unutar funkcije, ne na originalnom redu
EMPTY(Q);
}
void Bar(QUEUE* Q)
{
DEQUEUE(Q); // sada se izbacuje početak na originalnom redu jer mu se pristupa po adresi
EMPTY(*Q);
}
QUEUE Q;
Foo(Q);
Bar(&Q);
|
Kada bi stog i bio implementiran pokazivačima i kada bi i kopirao pokazivač kao vrijednost stoga, ne mora se promijeniti početni stog. Zašto?
Ovo je originalni stog:
S [&a_1] → [a_1|&a_2] → [a_2|&a_3] → ... → [a_n|NULL]
Vrijednost pokazivača S se kopira. Novi stog dodaje recimo element u stog. Tada kopija stoga izgleda ovako:
S [&a_novi] → [a_novi|&a_1] → [a_1|&a_2] → [a_2|&a_3] → ... → [a_n|NULL].
Stari stog je isti jer je identificiran pokazivačem na prvi element. Isto tako i za pop.
I kod implementacije liste pomoću pointera se može izbjeći da se mijenja vrijednost originalne liste.
Ali ja se ne bi zamarao sa time, radije pretpostavite da kada šaljete po vrijednosti mijenjaš kopiju, kada šalješ po adresi dereferenciranjem mijenjate original
|
|
[Vrh] |
|
čungalunga Forumaš(ica)
Pridružen/a: 25. 11. 2009. (20:50:12) Postovi: (4C)16
Spol:
Lokacija: varaždin/zagreb
|
Postano: 1:32 pon, 1. 11. 2010 Naslov: |
|
|
[quote="pmli"]Deklariraj i inicijaliziraj jednu varijablu koja će pamtiti je li niz sretan, jednu varijablu za parnost oznake djeteta te jednu za mjerenje duljine niza.
U while-petlji se kreći prema korijenu. Ako primjetiš da je oznaka trenutnog čvora iste parnosti kao i oznaka čvora kojeg si prethodno gledala (njegovo dijete), znaš da je niz sretan. Kakogod, nastaviš dalje, pritom povećavajući mjerač duljine.
Vrati 0 ako niz nije sretan, inače duljinu niza.[/quote]
kak da se krećem prema korijenu? tj. kaj mi je taj početni n? :roll:
pmli (napisa): | Deklariraj i inicijaliziraj jednu varijablu koja će pamtiti je li niz sretan, jednu varijablu za parnost oznake djeteta te jednu za mjerenje duljine niza.
U while-petlji se kreći prema korijenu. Ako primjetiš da je oznaka trenutnog čvora iste parnosti kao i oznaka čvora kojeg si prethodno gledala (njegovo dijete), znaš da je niz sretan. Kakogod, nastaviš dalje, pritom povećavajući mjerač duljine.
Vrati 0 ako niz nije sretan, inače duljinu niza. |
kak da se krećem prema korijenu? tj. kaj mi je taj početni n?
_________________ I won't be a rock star. I will be a legend.
Freddie Mercury
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
eve Forumaš(ica)
Pridružen/a: 13. 07. 2009. (23:07:06) Postovi: (192)16
Spol:
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
|
[Vrh] |
|
eve Forumaš(ica)
Pridružen/a: 13. 07. 2009. (23:07:06) Postovi: (192)16
Spol:
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
|
[Vrh] |
|
eve Forumaš(ica)
Pridružen/a: 13. 07. 2009. (23:07:06) Postovi: (192)16
Spol:
|
|
[Vrh] |
|
|