Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 13:03 uto, 2. 11. 2010 Naslov: 1.domaća zadaća |
|
|
...napišite potprogram koji računa vrijednost logičkog izraza zadanog u prefix obliku.
Na primjer, za ulazne podatke:
|0&1|^010
treba ispisati:
1
Napomena: &=AND, |=OR, ^=XOR, -=NOT
zanima me može li se u C-u direktno izračunati vrijednost nekog izraza,npr. 0^1, ili moram napisati funkcije za računanje svakog od logičkog izraza? mislim,da mi je tu množenje,zbrajanje itd to bi lako rješila,ali ovako neznam..
...napišite potprogram koji računa vrijednost logičkog izraza zadanog u prefix obliku.
Na primjer, za ulazne podatke:
|0&1|^010
treba ispisati:
1
Napomena: &=AND, |=OR, ^=XOR, -=NOT
zanima me može li se u C-u direktno izračunati vrijednost nekog izraza,npr. 0^1, ili moram napisati funkcije za računanje svakog od logičkog izraza? mislim,da mi je tu množenje,zbrajanje itd to bi lako rješila,ali ovako neznam..
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
Bole13 Forumaš(ica)
Pridružen/a: 01. 11. 2008. (00:33:50) Postovi: (5A)16
Spol:
|
|
[Vrh] |
|
Boris B. Forumaš(ica)
Pridružen/a: 19. 01. 2010. (18:01:54) Postovi: (32)16
Spol:
|
Postano: 1:43 čet, 4. 11. 2010 Naslov: |
|
|
[quote="Bole13"][code:1]elementtype TOP(STACK S) {
if(EMPTY(S)) printf("Stog je prazan.");
else return(S.elements[S.top]);
} [/code:1]
Compiler javlja gresku "control reaches end of non-void function".
U elsu ima prava povratna vrijednost, mislim jasna mi je greska, ali da li je u redu recimo ubacit exit(0) u blok nakon if-a?
Jer ako se doda return "neki broj tipa 0", fja TOP ne radi tocno sto treba...
I moze objasnjenje <errno.h> zaglavlja i error fje pls? Jer probao sam i s tim kako pise u skripti, ali je opet istu gresku javljao.[/quote]
Zapravo mislim da u ovim slučajevima kompajler ne treba javljati grešku, jer je teoretski nemoguće da u svakom kodu zna hoće li se funkcija izvršiti do kraja ili ne. U slučaju da do toga dođe (tj. izvrši se sve do }, a nigdje nije bilo returna), nedefinirano je što će se dogoditi. Vraćanje nekoga random broja bi bilo klasično rješenje, no zapravo bi i spontano samozapaljenje bila sasvim ok implementacija compilera. U svakom slučaju, bolje je izbjeći takve neugodne situacije...
Što se konkretnoga primjera tiče, ako želiš da se pri pokušaju pristupanja vrhu praznoga stacka prekine izvršavanje cijeloga programa, tada je:
[code:1]elementtype TOP(STACK S) {
if(!EMPTY(S)) return nesto;
printf("Stog je prazan.\n");
exit(1);
} [/code:1]
ok rješenje (kod iza if-a će se izvršiti samo ako je stack prazan).
error funkcija se ne nalazi ni u jednom zaglavlju iz c-ovog standard libraryja, već je možeš sam deklarirati, ovako nekako:
[code:1]void error(char *s) {
printf(s);
exit(1);
} [/code:1]
i kada to napraviš, možeš je koristiti na sličan način na koji je korištena u skripti, recimo u ovome kodu:
[code:1]elementtype FRONT (QUEUE Q) {
if (EMPTY(Q)) error("queue is empty");
else return (Q.elements[Q.front]);
}[/code:1]
Alternativno, ne mora ni neki return bilo_sto umjesto exit(1) biti loše rješenje, jer možeš reći da je korisnik obavješten o grešci, i da daljnje rezultate funkcije koristi na vlastitu odgovornost :) U stvarnosti bi to vjerojatno bilo i bolje jer ne prekida izvršavanje cijeloga programa nego dozvoljava mogućnost ispravljanja greške. No u skripti je korištena prva opcija i s njom ne možeš pogriješiti.
Bole13 (napisa): | Kod: | elementtype TOP(STACK S) {
if(EMPTY(S)) printf("Stog je prazan.");
else return(S.elements[S.top]);
} |
Compiler javlja gresku "control reaches end of non-void function".
U elsu ima prava povratna vrijednost, mislim jasna mi je greska, ali da li je u redu recimo ubacit exit(0) u blok nakon if-a?
Jer ako se doda return "neki broj tipa 0", fja TOP ne radi tocno sto treba...
I moze objasnjenje <errno.h> zaglavlja i error fje pls? Jer probao sam i s tim kako pise u skripti, ali je opet istu gresku javljao. |
Zapravo mislim da u ovim slučajevima kompajler ne treba javljati grešku, jer je teoretski nemoguće da u svakom kodu zna hoće li se funkcija izvršiti do kraja ili ne. U slučaju da do toga dođe (tj. izvrši se sve do }, a nigdje nije bilo returna), nedefinirano je što će se dogoditi. Vraćanje nekoga random broja bi bilo klasično rješenje, no zapravo bi i spontano samozapaljenje bila sasvim ok implementacija compilera. U svakom slučaju, bolje je izbjeći takve neugodne situacije...
Što se konkretnoga primjera tiče, ako želiš da se pri pokušaju pristupanja vrhu praznoga stacka prekine izvršavanje cijeloga programa, tada je:
Kod: | elementtype TOP(STACK S) {
if(!EMPTY(S)) return nesto;
printf("Stog je prazan.\n");
exit(1);
} |
ok rješenje (kod iza if-a će se izvršiti samo ako je stack prazan).
error funkcija se ne nalazi ni u jednom zaglavlju iz c-ovog standard libraryja, već je možeš sam deklarirati, ovako nekako:
Kod: | void error(char *s) {
printf(s);
exit(1);
} |
i kada to napraviš, možeš je koristiti na sličan način na koji je korištena u skripti, recimo u ovome kodu:
Kod: | elementtype FRONT (QUEUE Q) {
if (EMPTY(Q)) error("queue is empty");
else return (Q.elements[Q.front]);
} |
Alternativno, ne mora ni neki return bilo_sto umjesto exit(1) biti loše rješenje, jer možeš reći da je korisnik obavješten o grešci, i da daljnje rezultate funkcije koristi na vlastitu odgovornost U stvarnosti bi to vjerojatno bilo i bolje jer ne prekida izvršavanje cijeloga programa nego dozvoljava mogućnost ispravljanja greške. No u skripti je korištena prva opcija i s njom ne možeš pogriješiti.
_________________ The lyf so short, the craft so long to lerne
|
|
[Vrh] |
|
Bole13 Forumaš(ica)
Pridružen/a: 01. 11. 2008. (00:33:50) Postovi: (5A)16
Spol:
|
|
[Vrh] |
|
Boris B. Forumaš(ica)
Pridružen/a: 19. 01. 2010. (18:01:54) Postovi: (32)16
Spol:
|
Postano: 15:42 čet, 4. 11. 2010 Naslov: |
|
|
[quote="Bole13"]Hvala na odgovoru. Mislim da znam zasto mi je javljao ovu gresku s compilerom. Compileao sam sa gcc -Wall, budem probao popodne kad cu imat nesto vremena za zadacu, sa prvotnom verzijom fje pa compile bez -Wall.[/quote]
Dobro sad, kako se compiler ponaša i treba li ti na to izbaciti grešku ili upozorenje je manje bitno, jer kod u svakom slučaju nije dobar i trebao bi ga zamijeniti nečim drugim (tj. nečim što će sigurno na neki način prekinuti funkciju).
Teoretski da, morao bi moći prisiliti compiler da ušuti i ovdje te pusti da radiš što želiš, ali to naravno ne znači da bi to bilo pametno napraviti :)
Bole13 (napisa): | Hvala na odgovoru. Mislim da znam zasto mi je javljao ovu gresku s compilerom. Compileao sam sa gcc -Wall, budem probao popodne kad cu imat nesto vremena za zadacu, sa prvotnom verzijom fje pa compile bez -Wall. |
Dobro sad, kako se compiler ponaša i treba li ti na to izbaciti grešku ili upozorenje je manje bitno, jer kod u svakom slučaju nije dobar i trebao bi ga zamijeniti nečim drugim (tj. nečim što će sigurno na neki način prekinuti funkciju).
Teoretski da, morao bi moći prisiliti compiler da ušuti i ovdje te pusti da radiš što želiš, ali to naravno ne znači da bi to bilo pametno napraviti
_________________ The lyf so short, the craft so long to lerne
|
|
[Vrh] |
|
Tomy007 Forumaš(ica)
Pridružen/a: 08. 11. 2009. (19:45:28) Postovi: (94)16
|
|
[Vrh] |
|
Bole13 Forumaš(ica)
Pridružen/a: 01. 11. 2008. (00:33:50) Postovi: (5A)16
Spol:
|
|
[Vrh] |
|
kaj Forumaš(ica)
Pridružen/a: 15. 11. 2009. (21:02:20) Postovi: (B8)16
|
|
[Vrh] |
|
pbakic Forumaš(ica)
Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol:
|
Postano: 17:54 pon, 8. 11. 2010 Naslov: |
|
|
Na prvu loptu izgleda kao da bi se dalo napraviti pomocu stacka (ili, ekvivalentno, rekurzije). Npr, uzmes pomocni stack S u kojem je elementtype BTREE.
Kreces se po stringu, i za svaki procitani znak kreiras stablo koje se sastoji od jednog cvora, cija je oznaka taj znak, i spremis to stablo u stack.
Naravno, tu ima nekih grananja:
Ako si procitao operator, onda samo napravis to stablo i stavis ga na stack
Ako si procitao operand:
{
1) - Ako je u tom trenutku na vrhu stacka jednocvorno stablo s operatorom, onda samo dodas operand na stack
2) - Inace, dok god nije situacija 1):
Napravis novo stablo ciji je korijen 2. po redu element u stacku, a lijevi i desni subtree su mu ovaj operand koji si upravo ucitao iz stringa i stablo na vrhu stacka. Onda maknes dva elementa iz stacka (ove koji su posluzili kao korijen, odnosno podstablo za novo stablo), a novonastalo stablo se stavi na vrh stacka.
}
Na kraju izvodjenja ovog algoritma, ako ja nisam nes fulao, bi trebao dobiti trazeno stablo kao jedini element u stacku S
Na prvu loptu izgleda kao da bi se dalo napraviti pomocu stacka (ili, ekvivalentno, rekurzije). Npr, uzmes pomocni stack S u kojem je elementtype BTREE.
Kreces se po stringu, i za svaki procitani znak kreiras stablo koje se sastoji od jednog cvora, cija je oznaka taj znak, i spremis to stablo u stack.
Naravno, tu ima nekih grananja:
Ako si procitao operator, onda samo napravis to stablo i stavis ga na stack
Ako si procitao operand:
{
1) - Ako je u tom trenutku na vrhu stacka jednocvorno stablo s operatorom, onda samo dodas operand na stack
2) - Inace, dok god nije situacija 1):
Napravis novo stablo ciji je korijen 2. po redu element u stacku, a lijevi i desni subtree su mu ovaj operand koji si upravo ucitao iz stringa i stablo na vrhu stacka. Onda maknes dva elementa iz stacka (ove koji su posluzili kao korijen, odnosno podstablo za novo stablo), a novonastalo stablo se stavi na vrh stacka.
}
Na kraju izvodjenja ovog algoritma, ako ja nisam nes fulao, bi trebao dobiti trazeno stablo kao jedini element u stacku S
|
|
[Vrh] |
|
Alisa Forumaš(ica)
Pridružen/a: 16. 02. 2008. (15:34:59) Postovi: (4E)16
|
|
[Vrh] |
|
pbakic Forumaš(ica)
Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol:
|
Postano: 18:24 pon, 8. 11. 2010 Naslov: |
|
|
Ako imas postfix, onda kreiranje binarnog stabla radis isto kao i izracunavanje vrijednosti tog izraza pomocu stacka, samo sto, umjesto da u stacku cuvas vrijednosti, cuvas stabla, a umjesto izracunavanja izraza kreiras stablo kojem je korijen operator kojeg imas, a podstabla najvisa dva elementa u stacku
Ako imas postfix, onda kreiranje binarnog stabla radis isto kao i izracunavanje vrijednosti tog izraza pomocu stacka, samo sto, umjesto da u stacku cuvas vrijednosti, cuvas stabla, a umjesto izracunavanja izraza kreiras stablo kojem je korijen operator kojeg imas, a podstabla najvisa dva elementa u stacku
|
|
[Vrh] |
|
kaj Forumaš(ica)
Pridružen/a: 15. 11. 2009. (21:02:20) Postovi: (B8)16
|
|
[Vrh] |
|
nike Forumaš(ica)
Pridružen/a: 11. 02. 2010. (13:05:01) Postovi: (58)16
|
|
[Vrh] |
|
Milojko Forumaš(ica)
Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol:
Lokacija: Hilbertov hotel
|
Postano: 20:38 pon, 8. 11. 2010 Naslov: |
|
|
evo vam za u prefiks orderu algoritam. Ovdje čita niz stringova, ali jednako može i za niz charova. Bitno je sam da se ima neka oznaka za razne čvorove jer inače stablo i nije baš na jedinstveni način određeno
[code:1]sagradi( T )
{
pročitaj 1 string s iz ulaznih podataka
ako je s = NULL, stablo T je prazno i izađi van iz ove funkcije
u protivnom:
pozovi sagradi( TL ) // pročitali smo s, sad čitamo opis( TL ) i sadgradimo ga (*)
pozovi sagradi( TR ) // pročitali smo s i opis( TL ), sad čitamo opis( TR ) i sagradimo ga (*)
u korijen stabla T upiši string s
postavi TL kao lijevo podstablo stabla T
postavi TR kao desno podstablo stabla T
}[/code:1]
[size=9][color=#999999]Added after 5 minutes:[/color][/size]
za postfiks order je slično
uglavnom, takva pitanja pitajte asistente, to je najsigurnije, uvijek pomognu oko toga
a za ovaj inorder ispis, imaš u skripti ako se ne varam, implementaciju BTREE-a preko niza i inorder ispis čvorova u stablu. Tak da samo trebaš to primjeniti na svoj zadatak
evo vam za u prefiks orderu algoritam. Ovdje čita niz stringova, ali jednako može i za niz charova. Bitno je sam da se ima neka oznaka za razne čvorove jer inače stablo i nije baš na jedinstveni način određeno
Kod: | sagradi( T )
{
pročitaj 1 string s iz ulaznih podataka
ako je s = NULL, stablo T je prazno i izađi van iz ove funkcije
u protivnom:
pozovi sagradi( TL ) // pročitali smo s, sad čitamo opis( TL ) i sadgradimo ga (*)
pozovi sagradi( TR ) // pročitali smo s i opis( TL ), sad čitamo opis( TR ) i sagradimo ga (*)
u korijen stabla T upiši string s
postavi TL kao lijevo podstablo stabla T
postavi TR kao desno podstablo stabla T
} |
Added after 5 minutes:
za postfiks order je slično
uglavnom, takva pitanja pitajte asistente, to je najsigurnije, uvijek pomognu oko toga
a za ovaj inorder ispis, imaš u skripti ako se ne varam, implementaciju BTREE-a preko niza i inorder ispis čvorova u stablu. Tak da samo trebaš to primjeniti na svoj zadatak
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
nike Forumaš(ica)
Pridružen/a: 11. 02. 2010. (13:05:01) Postovi: (58)16
|
|
[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] |
|
Bole13 Forumaš(ica)
Pridružen/a: 01. 11. 2008. (00:33:50) Postovi: (5A)16
Spol:
|
|
[Vrh] |
|
eve Forumaš(ica)
Pridružen/a: 13. 07. 2009. (23:07:06) Postovi: (192)16
Spol:
|
|
[Vrh] |
|
|