Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:56 uto, 26. 11. 2013 Naslov: |
|
|
[quote="frutabella"]Pocela sam pa sam skuzila da nije bas jednostavno,...[/quote]
Ma, jednostavno je, samo ne smijes raditi kao da su nizovi (klasicni ili bubble sort), nego ovako nesto:
1. nadji najmanji element,
2. ubaci ga na pocetak nove liste i izbaci iz stare,
3. ponavljaj dok ne ispraznis staru listu.
frutabella (napisa): | Pocela sam pa sam skuzila da nije bas jednostavno,... |
Ma, jednostavno je, samo ne smijes raditi kao da su nizovi (klasicni ili bubble sort), nego ovako nesto:
1. nadji najmanji element,
2. ubaci ga na pocetak nove liste i izbaci iz stare,
3. ponavljaj dok ne ispraznis staru listu.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
Postano: 22:20 uto, 26. 11. 2013 Naslov: |
|
|
Pozdrav!
Imam par pitanja. Moj zadatak je implementirati dvostrani red DQueue pomoću vezane liste, a vezanu listu pomoću kursora. Elementtype je int.
1. Smijemo li koristiti globalne varijable?
2. Pošto se radi o dvostrukom redu trebaju mi funkcije:
DQuMakeNull, DQuEmpty, DQuFront_poc, DQuFront_kraj, DQuEnqueue_poc, DQuEnqueue_kraj, DQuDequeue_poc i DQuDequeue_kraj.
S obzirom da je red zapravo lista, moram li ja te funkcije (DQuMakeNull, ...) napisati uz pomoć funkcija od a.t.p. list (tj. da koristim funkcije LiEnd, LiInsert, LiDelete, LiFirst, LiRetrieve, ...) ili smijem samo napisati gore navedene funkcije same po sebi tj. da se one ne služe funkcijama od a.t.p. list?
3. Na vježbama smo radili implementaciju vezane liste pomoću kursora pa sam na temelju toga definirao svoj red ovako:
[code:1]typedef struct
{
elementtype element;
position next;
} DQueue[MAXLENGTH];[/code:1]
No s obzirom da sad radimo s poljem, onda nijedna funkcija zapravo ne treba primati pointer jer se polje ponaša kao pointer tj. za obični red smo imali npr.
[code:1]int QuEmpty(Queue Q)
void QuMakeNull(Queue *Qp)[/code:1]
no kad je u pitanju polje oboje bi mogle biti:
[code:1]int QuEmpty(Queue Q)
void QuMakeNull(Queue Q)[/code:1]
pa me zanima, moram li deklarirati dodatan tip tako da se argumenti poklapaju kao u originalnom redu tj.
[code:1]int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue *Qp)
[/code:1]
ili može
[code:1]int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue Q)
[/code:1]
?
4. Kod prezentiranja programa, smije li kod sadržavati kratke komentare ili nosimo samo čisti kod?
Pozdrav!
Imam par pitanja. Moj zadatak je implementirati dvostrani red DQueue pomoću vezane liste, a vezanu listu pomoću kursora. Elementtype je int.
1. Smijemo li koristiti globalne varijable?
2. Pošto se radi o dvostrukom redu trebaju mi funkcije:
DQuMakeNull, DQuEmpty, DQuFront_poc, DQuFront_kraj, DQuEnqueue_poc, DQuEnqueue_kraj, DQuDequeue_poc i DQuDequeue_kraj.
S obzirom da je red zapravo lista, moram li ja te funkcije (DQuMakeNull, ...) napisati uz pomoć funkcija od a.t.p. list (tj. da koristim funkcije LiEnd, LiInsert, LiDelete, LiFirst, LiRetrieve, ...) ili smijem samo napisati gore navedene funkcije same po sebi tj. da se one ne služe funkcijama od a.t.p. list?
3. Na vježbama smo radili implementaciju vezane liste pomoću kursora pa sam na temelju toga definirao svoj red ovako:
Kod: | typedef struct
{
elementtype element;
position next;
} DQueue[MAXLENGTH]; |
No s obzirom da sad radimo s poljem, onda nijedna funkcija zapravo ne treba primati pointer jer se polje ponaša kao pointer tj. za obični red smo imali npr.
Kod: | int QuEmpty(Queue Q)
void QuMakeNull(Queue *Qp) |
no kad je u pitanju polje oboje bi mogle biti:
Kod: | int QuEmpty(Queue Q)
void QuMakeNull(Queue Q) |
pa me zanima, moram li deklarirati dodatan tip tako da se argumenti poklapaju kao u originalnom redu tj.
Kod: | int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue *Qp)
|
ili može
Kod: | int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue Q)
|
?
4. Kod prezentiranja programa, smije li kod sadržavati kratke komentare ili nosimo samo čisti kod?
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 22:37 uto, 26. 11. 2013 Naslov: |
|
|
Trebam zbrojiti 2 polinoma (L1+L2), funkcija LiRetriveE vraca eksponent, a LiRetriveC vraca koeficijent.
Sve ostale funkcije dobro rade (u LiInsert ubacujem strukturu).
[code:1]
typedef struct _STRUKT{
int c;
int e;
}STRUKT;
List sum(List L1, List L2)
{
position poz, p, t;
int co=0;
List L3;
STRUKT x;
poz=LiMakeNull(&L3);
for(p=LiFirst(L1); p!=LiEnd(L1); p=LiNext(p,L1))
{
for(t=LiFirst(L2); t!=LiEnd(L2); t=LiNext(t, L2))
{
if(LiRetriveE(p,L1)>LiRetriveE(t, L2))
{
x.c=LiRetriveC(p,L1);
x.e=LiRetriveE(p,L1);
LiInsert(x,poz,&L3);
poz=LiNext(poz, L3);
break;
}
else
{
x.c=LiRetriveC(t,L2);
x.e=LiRetriveE(t,L2);
LiInsert(x,poz,&L3);
poz=LiNext(poz, L3);
break;
}
if(LiRetriveE(p,L1)==LiRetriveE(t, L2)) // ??????
{
co+=LiRetriveC(p,L1)+LiRetriveC(t, L2);
x.c=co;
x.e=LiRetriveE(p, L1);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
co=0;
break;
}
}
if(t==LiEnd(L2)) break;
}
while(p!=LiEnd(L1))
{
x.c=LiRetriveC(p,L1);
x.e=LiRetriveE(p,L1);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
p=LiNext(p, L2);
}
while(t!=LiEnd(L2))
{
x.c=LiRetriveC(t,L2);
x.e=LiRetriveE(t,L2);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
t=LiNext(t, L2);
}
return L3;
}
[/code:1]
Ne znam u cemu je problem kad je potrebno zbrojiti koeficijente, cini mi se da sam ok napisala, ali u ispisu (pomocu funkcije ispisPolinom) mi ne zbroji koefcijente uz iste potencije.
[code:1]
void ispisPolinoma (position p, List L3)
{
while(p!=LiEnd(L3))
{
if(LiRetriveE(p,L3)!=0)
{
printf("%dx^%d", LiRetriveC(p,L3), LiRetriveE(p,L3));
p=LiNext(p,L3);
}
else
{
printf("%d", LiRetriveC(p,L3));
p=LiNext(p,L3);
}
if(p!=LiEnd(L3)) printf("+");
}
}
[/code:1]
skuzila:
u drugoj for petlji, poslije prvog if ne ide else, nego uvjet
if(LiRetriveE(p,L1)<LiRetriveE(t, L2)),
(zbog elsa nisam dospijela do if gdje izjednacavamo eksponente)
Trebam zbrojiti 2 polinoma (L1+L2), funkcija LiRetriveE vraca eksponent, a LiRetriveC vraca koeficijent.
Sve ostale funkcije dobro rade (u LiInsert ubacujem strukturu).
Kod: |
typedef struct _STRUKT{
int c;
int e;
}STRUKT;
List sum(List L1, List L2)
{
position poz, p, t;
int co=0;
List L3;
STRUKT x;
poz=LiMakeNull(&L3);
for(p=LiFirst(L1); p!=LiEnd(L1); p=LiNext(p,L1))
{
for(t=LiFirst(L2); t!=LiEnd(L2); t=LiNext(t, L2))
{
if(LiRetriveE(p,L1)>LiRetriveE(t, L2))
{
x.c=LiRetriveC(p,L1);
x.e=LiRetriveE(p,L1);
LiInsert(x,poz,&L3);
poz=LiNext(poz, L3);
break;
}
else
{
x.c=LiRetriveC(t,L2);
x.e=LiRetriveE(t,L2);
LiInsert(x,poz,&L3);
poz=LiNext(poz, L3);
break;
}
if(LiRetriveE(p,L1)==LiRetriveE(t, L2)) // ??????
{
co+=LiRetriveC(p,L1)+LiRetriveC(t, L2);
x.c=co;
x.e=LiRetriveE(p, L1);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
co=0;
break;
}
}
if(t==LiEnd(L2)) break;
}
while(p!=LiEnd(L1))
{
x.c=LiRetriveC(p,L1);
x.e=LiRetriveE(p,L1);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
p=LiNext(p, L2);
}
while(t!=LiEnd(L2))
{
x.c=LiRetriveC(t,L2);
x.e=LiRetriveE(t,L2);
LiInsert(x, poz, &L3);
poz=LiNext(poz, L3);
t=LiNext(t, L2);
}
return L3;
}
|
Ne znam u cemu je problem kad je potrebno zbrojiti koeficijente, cini mi se da sam ok napisala, ali u ispisu (pomocu funkcije ispisPolinom) mi ne zbroji koefcijente uz iste potencije.
Kod: |
void ispisPolinoma (position p, List L3)
{
while(p!=LiEnd(L3))
{
if(LiRetriveE(p,L3)!=0)
{
printf("%dx^%d", LiRetriveC(p,L3), LiRetriveE(p,L3));
p=LiNext(p,L3);
}
else
{
printf("%d", LiRetriveC(p,L3));
p=LiNext(p,L3);
}
if(p!=LiEnd(L3)) printf("+");
}
}
|
skuzila:
u drugoj for petlji, poslije prvog if ne ide else, nego uvjet
if(LiRetriveE(p,L1)<LiRetriveE(t, L2)),
(zbog elsa nisam dospijela do if gdje izjednacavamo eksponente)
Zadnja promjena: frutabella; 0:31 sri, 27. 11. 2013; ukupno mijenjano 2 put/a.
|
|
[Vrh] |
|
kslaven Forumaš(ica)
Pridružen/a: 17. 10. 2010. (18:07:06) Postovi: (52)16
Spol:
|
Postano: 22:38 uto, 26. 11. 2013 Naslov: |
|
|
[quote="Shirohige"]Pozdrav!
Imam par pitanja. Moj zadatak je implementirati dvostrani red DQueue pomoću vezane liste, a vezanu listu pomoću kursora. Elementtype je int.
1. Smijemo li koristiti globalne varijable?
2. Pošto se radi o dvostrukom redu trebaju mi funkcije:
DQuMakeNull, DQuEmpty, DQuFront_poc, DQuFront_kraj, DQuEnqueue_poc, DQuEnqueue_kraj, DQuDequeue_poc i DQuDequeue_kraj.
S obzirom da je red zapravo lista, moram li ja te funkcije (DQuMakeNull, ...) napisati uz pomoć funkcija od a.t.p. list (tj. da koristim funkcije LiEnd, LiInsert, LiDelete, LiFirst, LiRetrieve, ...) ili smijem samo napisati gore navedene funkcije same po sebi tj. da se one ne služe funkcijama od a.t.p. list?
3. Na vježbama smo radili implementaciju vezane liste pomoću kursora pa sam na temelju toga definirao svoj red ovako:
[code:1]typedef struct
{
elementtype element;
position next;
} DQueue[MAXLENGTH];[/code:1]
No s obzirom da sad radimo s poljem, onda nijedna funkcija zapravo ne treba primati pointer jer se polje ponaša kao pointer tj. za obični red smo imali npr.
[code:1]int QuEmpty(Queue Q)
void QuMakeNull(Queue *Qp)[/code:1]
no kad je u pitanju polje oboje bi mogle biti:
[code:1]int QuEmpty(Queue Q)
void QuMakeNull(Queue Q)[/code:1]
pa me zanima, moram li deklarirati dodatan tip tako da se argumenti poklapaju kao u originalnom redu tj.
[code:1]int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue *Qp)
[/code:1]
ili može
[code:1]int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue Q)
[/code:1]
?
4. Kod prezentiranja programa, smije li kod sadržavati kratke komentare ili nosimo samo čisti kod?[/quote]
1. Da.
2. Nemojte koristiti funkcije iz ATP-a List.
3. Bilo bi lijepo "da se argumenti poklapaju kao u originalnom redu".
4. Slobodno komentirajte.
Shirohige (napisa): | Pozdrav!
Imam par pitanja. Moj zadatak je implementirati dvostrani red DQueue pomoću vezane liste, a vezanu listu pomoću kursora. Elementtype je int.
1. Smijemo li koristiti globalne varijable?
2. Pošto se radi o dvostrukom redu trebaju mi funkcije:
DQuMakeNull, DQuEmpty, DQuFront_poc, DQuFront_kraj, DQuEnqueue_poc, DQuEnqueue_kraj, DQuDequeue_poc i DQuDequeue_kraj.
S obzirom da je red zapravo lista, moram li ja te funkcije (DQuMakeNull, ...) napisati uz pomoć funkcija od a.t.p. list (tj. da koristim funkcije LiEnd, LiInsert, LiDelete, LiFirst, LiRetrieve, ...) ili smijem samo napisati gore navedene funkcije same po sebi tj. da se one ne služe funkcijama od a.t.p. list?
3. Na vježbama smo radili implementaciju vezane liste pomoću kursora pa sam na temelju toga definirao svoj red ovako:
Kod: | typedef struct
{
elementtype element;
position next;
} DQueue[MAXLENGTH]; |
No s obzirom da sad radimo s poljem, onda nijedna funkcija zapravo ne treba primati pointer jer se polje ponaša kao pointer tj. za obični red smo imali npr.
Kod: | int QuEmpty(Queue Q)
void QuMakeNull(Queue *Qp) |
no kad je u pitanju polje oboje bi mogle biti:
Kod: | int QuEmpty(Queue Q)
void QuMakeNull(Queue Q) |
pa me zanima, moram li deklarirati dodatan tip tako da se argumenti poklapaju kao u originalnom redu tj.
Kod: | int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue *Qp)
|
ili može
Kod: | int DQuEmpty(DQueue Q)
void DQuMakeNull(DQueue Q)
|
?
4. Kod prezentiranja programa, smije li kod sadržavati kratke komentare ili nosimo samo čisti kod? |
1. Da.
2. Nemojte koristiti funkcije iz ATP-a List.
3. Bilo bi lijepo "da se argumenti poklapaju kao u originalnom redu".
4. Slobodno komentirajte.
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
|
[Vrh] |
|
kslaven Forumaš(ica)
Pridružen/a: 17. 10. 2010. (18:07:06) Postovi: (52)16
Spol:
|
|
[Vrh] |
|
piccola Forumaš(ica)
Pridružen/a: 30. 11. 2009. (15:39:50) Postovi: (D7)16
|
|
[Vrh] |
|
kslaven Forumaš(ica)
Pridružen/a: 17. 10. 2010. (18:07:06) Postovi: (52)16
Spol:
|
|
[Vrh] |
|
white_butterfly Forumaš(ica)
Pridružen/a: 14. 10. 2011. (17:44:57) Postovi: (40)16
Spol:
|
|
[Vrh] |
|
kslaven Forumaš(ica)
Pridružen/a: 17. 10. 2010. (18:07:06) Postovi: (52)16
Spol:
|
|
[Vrh] |
|
piccola Forumaš(ica)
Pridružen/a: 30. 11. 2009. (15:39:50) Postovi: (D7)16
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
Postano: 18:14 sri, 27. 11. 2013 Naslov: |
|
|
[quote="kslaven"]
Da.[/quote]
Hvala, sad kad sam gotov sam se sjetio još par stvari :? :
1. Ispis reda: ako je red prazan, treba li samo ispisati poruku da je red prazan ili treba i izaći iz programa tj. treba li funkcija za ispis prekinuti program?
2. Sjetio sam se da smo vezanu listu uz pomoć kursora implementirali tako da u jedno veliko polje može ići više vezanih lista, mogu li ja pretpostaviti da će u ovo jedno polje ići samo jedan dvostruki red ili treba prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente?
(moj zadatak su samo funkcije ubaci/izbaci na kraju/početku, ali tek toliko da sam siguran)
3. Ako naredba u primjeru glasi "IZBACI", moram li ja provjeravati i za sve ostale mogućnosti (izbaci, Izbaci, izBaCi, ... ) ?
Hvala, sad kad sam gotov sam se sjetio još par stvari :
1. Ispis reda: ako je red prazan, treba li samo ispisati poruku da je red prazan ili treba i izaći iz programa tj. treba li funkcija za ispis prekinuti program?
2. Sjetio sam se da smo vezanu listu uz pomoć kursora implementirali tako da u jedno veliko polje može ići više vezanih lista, mogu li ja pretpostaviti da će u ovo jedno polje ići samo jedan dvostruki red ili treba prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente?
(moj zadatak su samo funkcije ubaci/izbaci na kraju/početku, ali tek toliko da sam siguran)
3. Ako naredba u primjeru glasi "IZBACI", moram li ja provjeravati i za sve ostale mogućnosti (izbaci, Izbaci, izBaCi, ... ) ?
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 20:02 sri, 27. 11. 2013 Naslov: |
|
|
Imam VELIKI problem.
Riješio sam zadaću, savršeno radi dok mu se ne sjeti da bi mogao puknuti.
I imam drugu verziju, koja ima samo 1 promjenu a to je da na 3 mjesta u implementaciji [b]BinaryTree-a pointerima[/b] poslije malloc-a ima if-ove da provjeri da nije greska u alokaciji - guess what - taj komad koda svaki put puca. LUDIM.
Ima netko ideju što može biti.
Evo ovako to izgleda u izvršavanju:
Pokrenem, radi savrseno:
http://www.zaslike.com/files/1c4d5n4e7jcsxq4370o.jpg
Ponovo pokrenem - isto.
Još jednom, ovo izbaci:
http://www.zaslike.com/files/wm8l5oswwyza4gh715rm.png
Kod je ovdje, ako nekoga zanima - sve je iskomentirano, a zadatak se tekstom nalazi između implementacije i rješenja:
http://pastebin.com/hJ62igiv
btw. ako ce znaciti, ponekad je radilo da iskopiram cijeli kod u novi prozor Code Blocksa i kompajliram pod novim imenom. Ne uvijek, ali onda bi najčešće radio na prvu. Ali i tako se znao rušiti.
Please help!
Frendu na Linuxu skroz radi:
[quote]ja sam inace na linuxu. i kompajlirah ZADACA GOTOVA i radi mi.
(...)
ZADACA GOTOVA.c: In function ‘main’:
ZADACA GOTOVA.c:261:6: warning: ‘T’ is used uninitialized in this function [-Wuninitialized]
i ovo mi javlja. za svaki slucaj ti govorim, znam da ne utjece na funkcionalnost ali eto[/quote]
vise puta je isprobao. :?: :?:
APDEJT: Ni njemu na Win7 na istom kompu ne radi nego na mahove. WHAT? O.o
Imam VELIKI problem.
Riješio sam zadaću, savršeno radi dok mu se ne sjeti da bi mogao puknuti.
I imam drugu verziju, koja ima samo 1 promjenu a to je da na 3 mjesta u implementaciji BinaryTree-a pointerima poslije malloc-a ima if-ove da provjeri da nije greska u alokaciji - guess what - taj komad koda svaki put puca. LUDIM.
Ima netko ideju što može biti.
Evo ovako to izgleda u izvršavanju:
Pokrenem, radi savrseno:
http://www.zaslike.com/files/1c4d5n4e7jcsxq4370o.jpg
Ponovo pokrenem - isto.
Još jednom, ovo izbaci:
http://www.zaslike.com/files/wm8l5oswwyza4gh715rm.png
Kod je ovdje, ako nekoga zanima - sve je iskomentirano, a zadatak se tekstom nalazi između implementacije i rješenja:
http://pastebin.com/hJ62igiv
btw. ako ce znaciti, ponekad je radilo da iskopiram cijeli kod u novi prozor Code Blocksa i kompajliram pod novim imenom. Ne uvijek, ali onda bi najčešće radio na prvu. Ali i tako se znao rušiti.
Please help!
Frendu na Linuxu skroz radi:
Citat: | ja sam inace na linuxu. i kompajlirah ZADACA GOTOVA i radi mi.
(...)
ZADACA GOTOVA.c: In function ‘main’:
ZADACA GOTOVA.c:261:6: warning: ‘T’ is used uninitialized in this function [-Wuninitialized]
i ovo mi javlja. za svaki slucaj ti govorim, znam da ne utjece na funkcionalnost ali eto |
vise puta je isprobao.
APDEJT: Ni njemu na Win7 na istom kompu ne radi nego na mahove. WHAT? O.o
Zadnja promjena: Silenoz; 20:39 sri, 27. 11. 2013; ukupno mijenjano 2 put/a.
|
|
[Vrh] |
|
kslaven Forumaš(ica)
Pridružen/a: 17. 10. 2010. (18:07:06) Postovi: (52)16
Spol:
|
Postano: 20:17 sri, 27. 11. 2013 Naslov: |
|
|
[quote="Shirohige"][quote="kslaven"]
Da.[/quote]
Hvala, sad kad sam gotov sam se sjetio još par stvari :? :
1. Ispis reda: ako je red prazan, treba li samo ispisati poruku da je red prazan ili treba i izaći iz programa tj. treba li funkcija za ispis prekinuti program?
2. Sjetio sam se da smo vezanu listu uz pomoć kursora implementirali tako da u jedno veliko polje može ići više vezanih lista, mogu li ja pretpostaviti da će u ovo jedno polje ići samo jedan dvostruki red ili treba prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente?
(moj zadatak su samo funkcije ubaci/izbaci na kraju/početku, ali tek toliko da sam siguran)
3. Ako naredba u primjeru glasi "IZBACI", moram li ja provjeravati i za sve ostale mogućnosti (izbaci, Izbaci, izBaCi, ... ) ?[/quote]
1. Samo ispisati poruku, ne izlaziti iz programa;
2. Prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente;
3. Ne morate, neka program u tom slučaju samo ispiše "To nije naredba." i zatim ode na unos nove naredbe.
Shirohige (napisa): |
Hvala, sad kad sam gotov sam se sjetio još par stvari :
1. Ispis reda: ako je red prazan, treba li samo ispisati poruku da je red prazan ili treba i izaći iz programa tj. treba li funkcija za ispis prekinuti program?
2. Sjetio sam se da smo vezanu listu uz pomoć kursora implementirali tako da u jedno veliko polje može ići više vezanih lista, mogu li ja pretpostaviti da će u ovo jedno polje ići samo jedan dvostruki red ili treba prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente?
(moj zadatak su samo funkcije ubaci/izbaci na kraju/početku, ali tek toliko da sam siguran)
3. Ako naredba u primjeru glasi "IZBACI", moram li ja provjeravati i za sve ostale mogućnosti (izbaci, Izbaci, izBaCi, ... ) ? |
1. Samo ispisati poruku, ne izlaziti iz programa;
2. Prilagoditi funkcije tako da mogu i drugi redovi iskoristiti to polje za svoje elemente;
3. Ne morate, neka program u tom slučaju samo ispiše "To nije naredba." i zatim ode na unos nove naredbe.
|
|
[Vrh] |
|
gianluigiana Forumaš(ica)
Pridružen/a: 01. 10. 2012. (20:11:49) Postovi: (D)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 22:37 sri, 27. 11. 2013 Naslov: |
|
|
[quote="Silenoz"]Imam VELIKI problem.[/quote]
Iduci put kad zaprostacis u postu, imat ces VECI problem. :P
That put aside, problem je da nesto ne inicijaliziras, pa se dese cuda. Nekad radi, a nekad ne, ovisno o compileru, OSu, stanju memorije,...
Ono sto sam nasao kao problem (ne garantiram da je jedini!) je linija 206:
[code:1] } while ((BiRightChild(P,T)!=LAMBDA)&&(P!=BiRoot(T)));[/code:1]
Tu ti [tt]P[/tt] bude [tt]NULL[/tt], a u [tt]BiRightChild()[/tt] ga dereferenciras, pa program padne.
Dodaj neposredno ispred te linije ovo:
[code:1]printf("P = %p\n", P);[/code:1]
Inace, kad tako nesto isprobavas, skok u novi red na kraju ispisa je kljucan! Necu ulaziti u pricu zasto, ali nemoj ga zaboraviti.
I hope this helped.
@gianluigiana: List je cvor bez djece. Korijen je list ako i samo ako u stablu nema drugih cvorova.
Silenoz (napisa): | Imam VELIKI problem. |
Iduci put kad zaprostacis u postu, imat ces VECI problem.
That put aside, problem je da nesto ne inicijaliziras, pa se dese cuda. Nekad radi, a nekad ne, ovisno o compileru, OSu, stanju memorije,...
Ono sto sam nasao kao problem (ne garantiram da je jedini!) je linija 206:
Kod: | } while ((BiRightChild(P,T)!=LAMBDA)&&(P!=BiRoot(T))); |
Tu ti P bude NULL, a u BiRightChild() ga dereferenciras, pa program padne.
Dodaj neposredno ispred te linije ovo:
Kod: | printf("P = %p\n", P); |
Inace, kad tako nesto isprobavas, skok u novi red na kraju ispisa je kljucan! Necu ulaziti u pricu zasto, ali nemoj ga zaboraviti.
I hope this helped.
@gianluigiana: List je cvor bez djece. Korijen je list ako i samo ako u stablu nema drugih cvorova.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 23:17 sri, 27. 11. 2013 Naslov: |
|
|
Sama funkcija kaže: pretvara izraz iz infixa u postfix pomoću dva stoga, jednom su elementi operandi, a drugom stabla. Uputa mi je: na prvom čuvamo operatore, a na drugom sastavljamo stablo, umjesto ispisa operande stavljamo na drugi stog kao stabla s korijenom, i ako treba ispisati neki operator, umjeso ispisa, treba maknuti zadnja dva elementa iz drugog stoga i na njega staviti novo stablo s korijenom tim operatorom i djeca su mu ta dva uklonjena elementa. Gdje mi je greška u programu? :(
[code:1]
void infix_u_postfix(labeltype INFIX[])
{
labeltype c;
int k=1;
STACK2 Sbr;
STACK1 Sop;
MAKE_NULL1(&Sop);
MAKE_NULL2(&Sbr);
int i = 0;
while(1)
{
c = INFIX[i];
if(c == '\0') break;
//znak c je broj
if(operator(c)==0 && specijalni1(c)==0 && specijalni2(c)==0)
{
PUSH2(c,&Sbr);
}
//znak je operator
if(operator(c)==1)
{
while(!EMPTY1(Sop) && prioritet(c,TOP1(Sop)))
{
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
MAKE_NULL(B);
make_new_btree(TOP1(Sop),B);
BTREE *BR, *BL;
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B,BL,BR);
free(BL);
free(BR);
POP1(&Sop);
PUSH2(B,&Sbr);
}
PUSH1(c,&Sop);
}
//znak je otvorena zagrada
if(specijalni1(c)==1)
{
PUSH1(c,&Sop);
}
//znak je zatvorena zagrada
if(specijalni2(c)==1)
{
labeltype prvi=TOP1(Sop);
while(!specijalni1(prvi))
{
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
MAKE_NULL(B);
make_new_btree(prvi,B);
BTREE *BR, *BL;
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B, BL, BR);
free(BL);
free(BR);
POP1(&Sop);
PUSH2(B,&Sbr);
prvi=TOP1(Sop);
}
POP1(&Sop);
}
++i;
}
while(!EMPTY1(Sop))
{
labeltype prvi = TOP1(Sop);
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
BTREE *BR, *BL;
MAKE_NULL(B);
make_new_btree(prvi,B);
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B,BL,BR);
free(BL);
free(BR);
PUSH2(B,&Sbr);
POP1(&Sop);
}
BTREE *Brez;
Brez = TOP2(Sbr);
POSTORDER(ROOT(*Brez), *Brez);
}[/code:1]
nema veze, skužila sam da sam dodavala el umjesto stabla u Sbr, ništa :)
Sama funkcija kaže: pretvara izraz iz infixa u postfix pomoću dva stoga, jednom su elementi operandi, a drugom stabla. Uputa mi je: na prvom čuvamo operatore, a na drugom sastavljamo stablo, umjesto ispisa operande stavljamo na drugi stog kao stabla s korijenom, i ako treba ispisati neki operator, umjeso ispisa, treba maknuti zadnja dva elementa iz drugog stoga i na njega staviti novo stablo s korijenom tim operatorom i djeca su mu ta dva uklonjena elementa. Gdje mi je greška u programu?
Kod: |
void infix_u_postfix(labeltype INFIX[])
{
labeltype c;
int k=1;
STACK2 Sbr;
STACK1 Sop;
MAKE_NULL1(&Sop);
MAKE_NULL2(&Sbr);
int i = 0;
while(1)
{
c = INFIX[i];
if(c == '\0') break;
//znak c je broj
if(operator(c)==0 && specijalni1(c)==0 && specijalni2(c)==0)
{
PUSH2(c,&Sbr);
}
//znak je operator
if(operator(c)==1)
{
while(!EMPTY1(Sop) && prioritet(c,TOP1(Sop)))
{
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
MAKE_NULL(B);
make_new_btree(TOP1(Sop),B);
BTREE *BR, *BL;
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B,BL,BR);
free(BL);
free(BR);
POP1(&Sop);
PUSH2(B,&Sbr);
}
PUSH1(c,&Sop);
}
//znak je otvorena zagrada
if(specijalni1(c)==1)
{
PUSH1(c,&Sop);
}
//znak je zatvorena zagrada
if(specijalni2(c)==1)
{
labeltype prvi=TOP1(Sop);
while(!specijalni1(prvi))
{
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
MAKE_NULL(B);
make_new_btree(prvi,B);
BTREE *BR, *BL;
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B, BL, BR);
free(BL);
free(BR);
POP1(&Sop);
PUSH2(B,&Sbr);
prvi=TOP1(Sop);
}
POP1(&Sop);
}
++i;
}
while(!EMPTY1(Sop))
{
labeltype prvi = TOP1(Sop);
BTREE *B = (BTREE *) malloc(sizeof(BTREE));
BTREE *BR, *BL;
MAKE_NULL(B);
make_new_btree(prvi,B);
uzmi_zadnja_dva(&Sbr,&BR,&BL);
dodaj_djecu(B,BL,BR);
free(BL);
free(BR);
PUSH2(B,&Sbr);
POP1(&Sop);
}
BTREE *Brez;
Brez = TOP2(Sbr);
POSTORDER(ROOT(*Brez), *Brez);
} |
nema veze, skužila sam da sam dodavala el umjesto stabla u Sbr, ništa
|
|
[Vrh] |
|
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 1:45 čet, 28. 11. 2013 Naslov: |
|
|
[quote="vsego"]Iduci put kad zaprostacis u postu, imat ces VECI problem. :P[/quote]
Sorry, nisam uopće shvatio da mi je pobjeglo (pretpostavljam ono na w) :/
[quote="vsego"]That put aside, problem je da nesto ne inicijaliziras, pa se dese cuda. Nekad radi, a nekad ne, ovisno o compileru, OSu, stanju memorije,...
Ono sto sam nasao kao problem (ne garantiram da je jedini!) je linija 206:
[code:1] } while ((BiRightChild(P,T)!=LAMBDA)&&(P!=BiRoot(T)));[/code:1]
Tu ti [tt]P[/tt] bude [tt]NULL[/tt], a u [tt]BiRightChild()[/tt] ga dereferenciras, pa program padne.
Dodaj neposredno ispred te linije ovo:
[code:1]printf("P = %p\n", P);[/code:1]
Inace, kad tako nesto isprobavas, skok u novi red na kraju ispisa je kljucan! Necu ulaziti u pricu zasto, ali nemoj ga zaboraviti.
I hope this helped..[/quote]
Što se tiče inicijalizacije, ubacio sam je gdje sam god mogao (radna verzija koda, sa svim kontrolnim ispisivanjima: http://pastebin.com/aR6s8JCB ), opet puca random:
http://www.zaslike.com/files/ethx7h3tbon53s06r3ez.jpg
dakle, zakljucujem da pucanje na mallocu nema veze sa mojom inicijalizacijom, zanima me samo zasto skroz stane a ne dode do ispisa za ne moze alocirati O.o
Ovo dalje idem popravljati, samo da mi prode taj malloc sto cesce.
I puno hvala na postu, jesam debagirao cijelo popodne i uredivao petlju na slican nacin sa ispisima, ali ovo je dalo ideju da bi bilo zanimljivo na svakom redu paziti sto radi+ovo sa whileom valjda nikad ne bih vidio sam. Dugo je do ujutro, tko je vidio spavati.
EDIT: E da, moram primjetiti da mi ovako kod puno puno bolje radi i da je u zadnjih 10ak pucao iskljucivo 2 puta i to na istom mjestu, pri alociranju na '|'. Puno hvala.
Još ću ga 20ak puta runnati, ako će jedino tu pucati snimam ovako, snimam sa printf-ovima čisto da mogu pokazati gdje puca ako će pucati. (svaku 20.tu izbaci i tamo na while-u ili if-u odmah do tog while-a, ali za divno cudo niti jednom pointer nije bio 000000 (NULL) O.o stvarno ne kuzim. I dalje cu kopati, a ako i bude kasno za sutra, svejedno bih volio ovo shvatiti i rjesiti - previse sam vremena ulozio da ne prode.
vsego (napisa): | Iduci put kad zaprostacis u postu, imat ces VECI problem. |
Sorry, nisam uopće shvatio da mi je pobjeglo (pretpostavljam ono na w)
vsego (napisa): | That put aside, problem je da nesto ne inicijaliziras, pa se dese cuda. Nekad radi, a nekad ne, ovisno o compileru, OSu, stanju memorije,...
Ono sto sam nasao kao problem (ne garantiram da je jedini!) je linija 206:
Kod: | } while ((BiRightChild(P,T)!=LAMBDA)&&(P!=BiRoot(T))); |
Tu ti P bude NULL, a u BiRightChild() ga dereferenciras, pa program padne.
Dodaj neposredno ispred te linije ovo:
Kod: | printf("P = %p\n", P); |
Inace, kad tako nesto isprobavas, skok u novi red na kraju ispisa je kljucan! Necu ulaziti u pricu zasto, ali nemoj ga zaboraviti.
I hope this helped.. |
Što se tiče inicijalizacije, ubacio sam je gdje sam god mogao (radna verzija koda, sa svim kontrolnim ispisivanjima: http://pastebin.com/aR6s8JCB ), opet puca random:
http://www.zaslike.com/files/ethx7h3tbon53s06r3ez.jpg
dakle, zakljucujem da pucanje na mallocu nema veze sa mojom inicijalizacijom, zanima me samo zasto skroz stane a ne dode do ispisa za ne moze alocirati O.o
Ovo dalje idem popravljati, samo da mi prode taj malloc sto cesce.
I puno hvala na postu, jesam debagirao cijelo popodne i uredivao petlju na slican nacin sa ispisima, ali ovo je dalo ideju da bi bilo zanimljivo na svakom redu paziti sto radi+ovo sa whileom valjda nikad ne bih vidio sam. Dugo je do ujutro, tko je vidio spavati.
EDIT: E da, moram primjetiti da mi ovako kod puno puno bolje radi i da je u zadnjih 10ak pucao iskljucivo 2 puta i to na istom mjestu, pri alociranju na '|'. Puno hvala.
Još ću ga 20ak puta runnati, ako će jedino tu pucati snimam ovako, snimam sa printf-ovima čisto da mogu pokazati gdje puca ako će pucati. (svaku 20.tu izbaci i tamo na while-u ili if-u odmah do tog while-a, ali za divno cudo niti jednom pointer nije bio 000000 (NULL) O.o stvarno ne kuzim. I dalje cu kopati, a ako i bude kasno za sutra, svejedno bih volio ovo shvatiti i rjesiti - previse sam vremena ulozio da ne prode.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 3:39 čet, 28. 11. 2013 Naslov: |
|
|
@Silenoz: Lajna 248:
[code:1] if (BiRightChild(P,T)==LAMBDA)[/code:1]
Tu ti [tt]P[/tt] ponekad padne na [tt]NULL[/tt] (tj. postane roditelj od korijena), pa se stvar raspadne. Ako stavis ne-ATP-ovsko:
[code:1] if (P && BiRightChild(P,T)==LAMBDA)[/code:1]
onda prodje (ali ima neku zbrlju u ispisu, kao da mi je na ulazu procitao jedan znak vishka). Moj ulaz je [tt]&11[/tt]; greska mi se ne dogadja s tvojim ulazom.
@Silenoz: Lajna 248:
Kod: | if (BiRightChild(P,T)==LAMBDA) |
Tu ti P ponekad padne na NULL (tj. postane roditelj od korijena), pa se stvar raspadne. Ako stavis ne-ATP-ovsko:
Kod: | if (P && BiRightChild(P,T)==LAMBDA) |
onda prodje (ali ima neku zbrlju u ispisu, kao da mi je na ulazu procitao jedan znak vishka). Moj ulaz je &11; greska mi se ne dogadja s tvojim ulazom.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
|