[b]Ovdje ću stavljati:[/b]
- Odgovore na pitanja vezana uz treću zadaću koja dobijem emailom
- Dodatna objašnjenja i [color=red]moguće ispravke teksta zadataka (pokušat ću ih označiti crvenom bojom)[/color]
[b]Pravila za pitanja su ovakva:[/b]
- Izbjegavat ću odgovarati na pitanja postavljena na forumu
- Na pitanja postavljena na email koja bi mogla zanimati i druge studente odgovorit ću na forumu, a na email ću odgovoriti sa linkom na odgovor
- Pitanja bi trebala razjašnjavati nejasnoće [i]u zadatku[/i], ne nejasnoće [i]u rješavanju zadataka[/i]. Ako ste u dvojbi, radije pitajte.
[b]P1:[/b] Smiju li se koristiti pomoćne varijable i funkcije u klasama?
[b]O1:[/b] Naravno, ali one ne bi trebale biti javno dostupne.
[b]P2 (Obaveze, Računi):[/b] Trebamo li deklarirati zadane enumeracije u header datotekama ili će biti uključene u testne mainove?
[b]O2:[/b] Da, trebate ih deklarirati u header datotekama. Neće biti uključene u testne mainove.
[b]P3 (Hack and slash):[/b] [i]Regenerira li trol 20% od trenutnog ili maksimalnog zdravlja?[/i]
[b]O3:[/b] Od trenutnog. obratite pozornost na primjer main funkcije.
[code:1]18 Zdravlje trola: 30
19 Zdravlje trola: 36[/code:1]
[b]P4 (Hack and slash):[/b] [i]Pojasnite 40% više štete oružjem za Olog-Hai biće.[/i]
[b]O4:[/b] Neka je vrijednost temeljnog napada 20, a vrijednost oružja 10. Tada je obranjivi napad 20 + 1.4*10 = 34. Uz to može postojati još i neobranjiv napad. U primjeru main funkcije
[code:1]45 chogall.opremiOruzje(20);
46 alleria.opremiOklop(10.0);
47 chogall.napadni(alleria); // obranjivi napad 20+20*1.4, neobranjivi
napad 5[/code:1]
[code:1]
23 Zdravlje vilenjakinje: 50
24 Zdravlje vilenjakinje: 7[/code:1]
50 zdravlja + 10 oklopa napada se sa 48 obranjivog napada i 5 neobranjivog. 10 oklopa propada, ostaje 38 obranjivog napada. 38+5 = 43 štete na zdravlje, stoga vilenjakinja ima 50 - 43 = 7 zdravlja nakon napada.
[b]
P5 (Hack and slash):[/b] [i]Kod Olog-Hai bića, oklop se smanjuje za pola vrijednosti kod opremanja. Znači li da ako je oklop unešen na vrijednost 40, vrijednost oklopa treba podesiti na 20 za Olog-Hai biće?[/i]
[b]O5:[/b] Točnije, [i]postojećoj [/i]vrijednosti oklopa treba [i]dodati [/i]20.
[b]P6 (Hack and slash):[/b] [i]Nije mi jasno značenje statičkih varijabli. Što bi s njima trebalo raditi?[/i]
[b]O6:[/b] Ideja statičkih varijabli je da vrijednosti nisu sadržane u svakoj instanci klase, već u definiciji klase. Time se štedi nešto memorije. Pogledajte [URL=http://web.math.hr/nastava/rp1/slideovi/vjezbe_07b.pdf]vježbe 7b[/URL].
Općenita prednost korištenja varijabli i funkcija umjesto numerički zadanih vrijednosti je da dobivate jedan stupanj indirektnosti. Zamislite da pišete program u kojoj se neke vrijednosti više puta povećavaju za 20%. Mogli biste:
- više puta napisati [tt]vrijednost_i * 1.2[/tt]
- definirati varijablu [tt]faktor[/tt] pa napisati [tt]vrijednost_i * faktor[/tt]
Ako bi se nekad postotak promijenio (na 15%, 30% ili neku treću vrijednost), lakše je samo promijeniti vrijednost varijable faktor, nego promijeniti linije [tt]vrijednost_i * 1.2[/tt] u npr. [tt]vrijednost_i * 1.15[/tt], za sve i. Također, nećemo se dovesti u situaciju da jednu od linija zaboravimo izmjeniti i time imati nekonzistentno ponašanje.
[b]P7 (Računi):[/b] [i]Kod uplaćivanja običnog honorara na žiro račun, zadatak kaže da treba oduzeti 20% radi doprinosa, a zatim da je potrebno napraviti statičku varijablu stopa doprinosa. Znači li to da se tih 20% može promijeniti?[/i]
[b]O7:[/b] Da, moguće je da se 20% mijenja nekad u budućnosti. Pogledajte i odgovor [b]O6[/b].
[b]P8 (Računi):[/b] [i]Kako metoda void podigni() treba raditi na štednom tekućem računu. Je li ona treba biti nasljeđena iz tekućeg računa?[/i]
[b]O8:[/b] Metoda je nasljeđena iz tekućeg računa. Treba podići novac s stanja računa. Metoda ne dira štednju (nju ćemo podići nakon 10 godina za veliki put oko svijeta).
[color=red][b]P9 (Računi):[/b] [i]Imamo konstruktor [tt]ZiroRacun(double ulazna naknada, double izlaznaNaknada)[/tt]. Treba li on biti [tt]ZiroRacun(double ulaznaNaknada, double izlaznaNaknada)[/tt]?[/i]
[b]O9:[/b] Da! Ispričavam se na propustu. Umjesto [tt]ulazna naknada[/tt], što je neispravno, treba biti [tt]ulaznaNaknada[/tt].[/color]
[b]P10: Mogu li svi parametri funkcije biti pretpostavljeni?[/b]
[b]O10:[/b] Da. Pogledajte [URL=http://web.math.hr/nastava/rp1/slideovi/vjezbe_07b.pdf]vježbe 7b[/URL].
[b]P11 (Obaveze, Računi):[/b] [i]Kako se koriste enumeracije?[/i]
[b]O11:[/b] [URL=http://enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/]Pročitajte ovu stranicu o enumeracijama[/URL]. Ukratko, enumeracije se deklariraju van svih klasa i funkcija.
[code:1]enum TipHonorara { obican, autorski, umjetnicki };[/code:1]
Nakon deklaracije možemo ih koristiti kao tip podataka, npr.
[code:1]void Foo(TipHonorara tip) { if (tip == obicni) std::cout << "Pa to je najobicniji honorar!"; }[/code:1]
U "pozadini" oni se ponašaju kao cijeli brojevi. U gornjoj deklaraciji implicitno su im dodijeljene vrijednosti obican === 0, autorski === 1, umjetnicki === 2. No možete im i sami zadati vrijednosti, kao u ovoj liniji koda:
[code:1]enum PrioritetObaveze { mali = 10, srednji = 20, veliki = 40 };[/code:1]
Njima se možete koristiti kao običnim cijelim brojevima, ali ne mogu poprimiti druge vrijednosti od onih nabrojenih u deklaraciji (enumeriranih).
[code:1]PrioritetObaveze prioritet; // kao da piše int prioritet
prioritet = veliki; // kao da piše prioritet = 40;
std::cout << prioritet // ispiše se 40
[/code:1]
U kombinaciji s nekim objektima, to bi moglo izgledati ovako:
[code:1]enum VaznoPitanje { P1, P2, P9 };
class Upitnik
{
public:
Foo(VaznoPitanje pitanje) { if (pitanje == P9) std::cout << "Vrlo vazno!"; }
};
[/code:1]
[color=red][b]P12 (Obaveze):[/b] [i]U klasi [tt]Obaveza[/tt] trebalo bi napraviti funkciju koja otkazuje obavezu, ali njeno ime navedeno je kao [tt]otkazi obavezu[/tt] (sto očito nije dozvoljeno ime za funkciju). Po analogiji sa svim ostalim funkcijama, pretpostavljam da bi ime funkcije trebalo biti [tt]otkaziObavezu[/tt]?[/i]
[b]O12:[/b] Da! Ispričavam se na propustu. Umjesto [tt]void otkazi obavezu()[/tt], što je neispravno, signatura funkcije treba biti [tt]void otkaziObavezu()[/tt].[/color]
[b]P13 (Hack and slash):[/b] [i]Što je točno faktor snage kod OlogHai trolova?[/i]
[b]O13:[/b] Taj dio je malo nejasan. Radi se o tome da 40% više štete od oružja treba implementirati kao [tt]šteta od oružja[/tt] * [tt]faktor snage[/tt]. Znači za zadanu vrijednost 40%, faktor snage ćete unijeti kao 1.4. Pogledajte i odgovor [b]O6[/b].
[b]P14:[/b] [i]Treba li implementirati neki destruktor za klase?[/i]
[b]O14:[/b] Treba li? Što se dešava ako nije implementiran destruktor? Je li to željeno ponašanje za vašu klasu? Pogledajte [URL=http://web.math.hr/nastava/rp1/slideovi/vjezbe_02.pdf]vježbe 2[/URL], [URL=http://web.math.hr/nastava/rp1/slideovi/predavanja_06.pdf]predavanja 6[/URL] i odličnu stranicu [URL=http://www.parashift.com/c++-faq-lite/]C++ faq lite[/URL].
[b]P15:[/b] [i]Kad u header datoteci kod bazne klase navedemo virtualne funkcije, trebamo li ih navoditi i u ostalim, naslijeđenih klasama?[/i]
[b]O15:[/b] Trebate li? Što se dešava ako ih ne navedete? Je li to očekivano? Zašto to radi/ne radi? Pogledajte [URL=http://web.math.hr/nastava/rp1/slideovi/vjezbe_08.pdf]vježbe 8[/URL] i [URL=http://www.parashift.com/c++-faq-lite/]C++ faq lite[/URL], dijelove [19]-[23].
[b]P16 (Hack and slash):[/b] [i]Što ako se nekom biću zdravlje spusti na nulu? "Umire li ono"?[/i]
[b]O16:[/b] U čarobnom svijetu trolova i vilenjaka, bića nikad ne umiru. Glavni dizajner igre kaže da će ta opcija biti implementirana u nekom drugom izdanju igre. [i]Patch[/i] će biti samo 0.99$!
[b]P17 (Hack and slash):[/b] [i]Ako bića nikada ne umiru, kako se trolovi s negativnim zdravljem regeneriraju?[/i]
[b]O17:[/b] Možete napraviti da dobivaju [tt]-1*stopaRegeneracije*zdravlje[/tt] umjesto da ga gube sa [tt]stopaRegeneracija*zdravlje[/tt]. Ali takav slučaj se neće testirati.
[color=red][b]P18 (Hack and slash):[/b] [i]Kod konstruktora Vilenjak(double zdravlje, double napad, double starost) stoji rečenica: "Ukoliko napad ili zdravlje nisu eksplicitno navedeni, pretpostavlja se da su redom 10.0 i 100.0". Kako to mogu biti defaultni argumenti, jer je poslije njih još i starost?[/i]
[b]O18:[/b] Ispričavam se na propustu. Kao i kod klase Patuljak, pretpostavljeni parametri su napad i [b]starost[/b]. Rečenica bi trebala glasiti: "Ukoliko napad ili starost nisu eksplicitno navedeni, pretpostavlja se da su redom 10.0 i 100.0".[/color]
[b]P19 (Hack and slash):[/b] [i]Smije li funkcija [tt]void izracunajIshod(double obranjiviNapad, double neobranjiviNapad)[/tt] biti javna?[/i]
[b]O19:[/b] Da, funkcija [tt]izracunajIshod[/tt] može biti javna. [quote="Hack and slash"]Vodite računa o nedostupnosti podataka iz klasa vanjskim korisnicima kojima nisu
potrebni (enkapsulaciji). Samo bi [b]funkcije trebale biti javno dostupne[/b].[/quote]
Elegantnije rješenje koristilo bi koncept friend klasa ili funkcija, ali to nije obrađeno prije zadavanja treće zadaće.
[b]P20:[/b] [i]Navedeno je da će se provjeravati mogu li se na konstantnim objektima pozivati funkcije koje ne mijenjaju objekt. Što se očekuje kao rezultat provjere?[/i]
[quote="Hack and slash"]Također će se provjeriti mogu li se na konstantnim objektima pozvati funkcije koje vraćaju trenutno zdravlje, najveće moguće zdravlje i druge funkcije koje ne mijenjaju objekt[/quote][quote="Obaveze"]Također će se provjeriti mogu li se na konstantnim objektima pozvati funkcije koje ne mijenjaju objekte, kao što su int stanjeBodova(), unsigned idObaveze(), string slavljenik() i slične.[/quote]
[b]O20:[/b] Očekuje se da je moguće pozivati funkcije koje ne mijenjaju objekt. Pogledajte [url=http://web.math.hr/nastava/rp1/slideovi/vjezbe_07a.pdf]vježbe 7a[/url] i [url=http://www.parashift.com/c++-faq-lite/const-correctness.html]C++ faq lite o const ispravnosti[/url].
[b]P21:[/b] [i]Što točno znači vanjski kôd? Kako inicijalizirati statičke varijable ako ne smijemo koristiti vanjski kôd?[/i]
[quote="Tekst zadatka"]Pri testiranju programa uzimat će se u obzir samo napisane klase, a ne i eventualni vanjski kôd (kao što su na primjer globalne varijable).[/quote]
[b]O21:[/b] Izrazom "vanjski kôd" sam nazvao varijable i funkcije koje ne pripadaju nekoj klasi. Primjer toga su globalne varijable u pravom smislu riječi (one koje se dosežu "praznim dosegom" [tt]::imeVarijable[/tt]). Naravno da smijete koristiti inicijalizaciju statičkih varijabli [tt]tipvarijable ImeKlase::imeVarijable = vrijednost[/tt]. Te varijable nisu globalne nego pripadaju nekoj klasi. Obično se i nazivaju statičke članske varijable (i pristupa im se "nepraznim" operatorom razrješenja dosega [tt]ImeKlase::imeVarijable[/tt]).
[b]P22:[/b] [i]Kako postaviti da su neke varijable konstantne kad ih tek moramo "učitati" sa konstruktorom?[/i]
[b]O22:[/b] Takav slučaj nije eksplicitno naveden na vježbama, iako smo spominjali sve što je potrebno za riješiti ga. Svakako pročitajte [url=http://www.parashift.com/c++-faq-lite/ctors.html]nešto više o konstruktorima na C++ faq lite[/url].
[color=red][b]P23 (Obaveze):[/b] [i]U tekstu zadatka piše da [tt]lokacijaSastanka()[/tt] vraća lokaciju sastanka. Nedostaje li tu povratna vrijednost?[/i]
[b]O23:[/b] Da! Ispričavam se na propustu. Umjesto signature [tt]lokacijaSastanka()[/tt], što je neispravno, treba biti [tt]string lokacijaSastanka()[/tt].[/color]
[b]P24:[/b] [i]Jesu li definicije funkcija zadane u zadacima "potpune"? Ako piše [tt]izlazniTip ImeFunkcije(ulazniTip ulazniParametar)[/tt], treba li funkcija izgledati točno tako?[/i]
[b]O24:[/b] Ne. Zadane su samo [i]signature funkcija[/i]; kakvog tipa su i kako se zovu ulazni parametri i što funkcija vraća. Neke funkcije mogu (i moraju) [b]uz to[/b] biti označene kao konstantne, statičke, virtualne, potpuno virtualne (ili neka druga vrsta koju sam možda propustio navesti). Znači, ono što je zadano mora biti poštovano, no definicija funkcije se može i dodatno označiti ako je to potrebno.
[b]P25:[/b] [i]Kako patuljak prima štetu?[/i]
[b]O25:[/b] Kada izračunavaju ishod, patuljci odbijaju 10% od obranjivog napada zbog otpornosti. Oklop funkcionira kao i kod drugih bića; preostala vrijednost napada se prvo primjenjuje na oklop (pri tome se vrijednost oklopa umanjuje za vrijednost napada, do najmanje 0.0), a mogući preostali iznos napada se odbija od trenutnog zdravlja. Neobranjivi napad se direktno odbija od zdravlja, bez obzira na postojanje oklopa i otpornosti.
Za početne vrijednosti: [tt]starost = 100, oklop = 5, zdravlje = 20[/tt] i [tt]napad = {20 obranjivo, 10 neobranjivo}[/tt] računamo:
Otpornost je 10%. Obranjivi napad je zato 20 - 10 = 10. Od toga je 5 utrošeno na uništavanje oklopa, pa je preostala vrijednost 5. Zdravlje zato pada na 15 od obranjivog napada. Konačno, zdravlje pada na 5 zbog neobranjivog napada.
Konačne vrijednosti: [tt]starost = 100, oklop = 0, zdravlje = 5[/tt]
Ilija Pavlic.
Ovdje ću stavljati:
- Odgovore na pitanja vezana uz treću zadaću koja dobijem emailom
- Dodatna objašnjenja i moguće ispravke teksta zadataka (pokušat ću ih označiti crvenom bojom)
Pravila za pitanja su ovakva:
- Izbjegavat ću odgovarati na pitanja postavljena na forumu
- Na pitanja postavljena na email koja bi mogla zanimati i druge studente odgovorit ću na forumu, a na email ću odgovoriti sa linkom na odgovor
- Pitanja bi trebala razjašnjavati nejasnoće u zadatku, ne nejasnoće u rješavanju zadataka. Ako ste u dvojbi, radije pitajte.
P1: Smiju li se koristiti pomoćne varijable i funkcije u klasama?
O1: Naravno, ali one ne bi trebale biti javno dostupne.
P2 (Obaveze, Računi): Trebamo li deklarirati zadane enumeracije u header datotekama ili će biti uključene u testne mainove?
O2: Da, trebate ih deklarirati u header datotekama. Neće biti uključene u testne mainove.
P3 (Hack and slash): Regenerira li trol 20% od trenutnog ili maksimalnog zdravlja?
O3: Od trenutnog. obratite pozornost na primjer main funkcije.
Kod: | 18 Zdravlje trola: 30
19 Zdravlje trola: 36 |
P4 (Hack and slash): Pojasnite 40% više štete oružjem za Olog-Hai biće.
O4: Neka je vrijednost temeljnog napada 20, a vrijednost oružja 10. Tada je obranjivi napad 20 + 1.4*10 = 34. Uz to može postojati još i neobranjiv napad. U primjeru main funkcije
Kod: | 45 chogall.opremiOruzje(20);
46 alleria.opremiOklop(10.0);
47 chogall.napadni(alleria); // obranjivi napad 20+20*1.4, neobranjivi
napad 5 |
Kod: |
23 Zdravlje vilenjakinje: 50
24 Zdravlje vilenjakinje: 7 |
50 zdravlja + 10 oklopa napada se sa 48 obranjivog napada i 5 neobranjivog. 10 oklopa propada, ostaje 38 obranjivog napada. 38+5 = 43 štete na zdravlje, stoga vilenjakinja ima 50 - 43 = 7 zdravlja nakon napada.
P5 (Hack and slash): Kod Olog-Hai bića, oklop se smanjuje za pola vrijednosti kod opremanja. Znači li da ako je oklop unešen na vrijednost 40, vrijednost oklopa treba podesiti na 20 za Olog-Hai biće?
O5: Točnije, postojećoj vrijednosti oklopa treba dodati 20.
P6 (Hack and slash): Nije mi jasno značenje statičkih varijabli. Što bi s njima trebalo raditi?
O6: Ideja statičkih varijabli je da vrijednosti nisu sadržane u svakoj instanci klase, već u definiciji klase. Time se štedi nešto memorije. Pogledajte vježbe 7b.
Općenita prednost korištenja varijabli i funkcija umjesto numerički zadanih vrijednosti je da dobivate jedan stupanj indirektnosti. Zamislite da pišete program u kojoj se neke vrijednosti više puta povećavaju za 20%. Mogli biste:
- više puta napisati vrijednost_i * 1.2
- definirati varijablu faktor pa napisati vrijednost_i * faktor
Ako bi se nekad postotak promijenio (na 15%, 30% ili neku treću vrijednost), lakše je samo promijeniti vrijednost varijable faktor, nego promijeniti linije vrijednost_i * 1.2 u npr. vrijednost_i * 1.15, za sve i. Također, nećemo se dovesti u situaciju da jednu od linija zaboravimo izmjeniti i time imati nekonzistentno ponašanje.
P7 (Računi): Kod uplaćivanja običnog honorara na žiro račun, zadatak kaže da treba oduzeti 20% radi doprinosa, a zatim da je potrebno napraviti statičku varijablu stopa doprinosa. Znači li to da se tih 20% može promijeniti?
O7: Da, moguće je da se 20% mijenja nekad u budućnosti. Pogledajte i odgovor O6.
P8 (Računi): Kako metoda void podigni() treba raditi na štednom tekućem računu. Je li ona treba biti nasljeđena iz tekućeg računa?
O8: Metoda je nasljeđena iz tekućeg računa. Treba podići novac s stanja računa. Metoda ne dira štednju (nju ćemo podići nakon 10 godina za veliki put oko svijeta).
P9 (Računi): Imamo konstruktor ZiroRacun(double ulazna naknada, double izlaznaNaknada). Treba li on biti ZiroRacun(double ulaznaNaknada, double izlaznaNaknada)?
O9: Da! Ispričavam se na propustu. Umjesto ulazna naknada, što je neispravno, treba biti ulaznaNaknada.
P10: Mogu li svi parametri funkcije biti pretpostavljeni?
O10: Da. Pogledajte vježbe 7b.
P11 (Obaveze, Računi): Kako se koriste enumeracije?
O11: Pročitajte ovu stranicu o enumeracijama. Ukratko, enumeracije se deklariraju van svih klasa i funkcija.
Kod: | enum TipHonorara { obican, autorski, umjetnicki }; |
Nakon deklaracije možemo ih koristiti kao tip podataka, npr.
Kod: | void Foo(TipHonorara tip) { if (tip == obicni) std::cout << "Pa to je najobicniji honorar!"; } |
U "pozadini" oni se ponašaju kao cijeli brojevi. U gornjoj deklaraciji implicitno su im dodijeljene vrijednosti obican === 0, autorski === 1, umjetnicki === 2. No možete im i sami zadati vrijednosti, kao u ovoj liniji koda:
Kod: | enum PrioritetObaveze { mali = 10, srednji = 20, veliki = 40 }; |
Njima se možete koristiti kao običnim cijelim brojevima, ali ne mogu poprimiti druge vrijednosti od onih nabrojenih u deklaraciji (enumeriranih).
Kod: | PrioritetObaveze prioritet; // kao da piše int prioritet
prioritet = veliki; // kao da piše prioritet = 40;
std::cout << prioritet // ispiše se 40
|
U kombinaciji s nekim objektima, to bi moglo izgledati ovako:
Kod: | enum VaznoPitanje { P1, P2, P9 };
class Upitnik
{
public:
Foo(VaznoPitanje pitanje) { if (pitanje == P9) std::cout << "Vrlo vazno!"; }
};
|
P12 (Obaveze): U klasi Obaveza trebalo bi napraviti funkciju koja otkazuje obavezu, ali njeno ime navedeno je kao otkazi obavezu (sto očito nije dozvoljeno ime za funkciju). Po analogiji sa svim ostalim funkcijama, pretpostavljam da bi ime funkcije trebalo biti otkaziObavezu?
O12: Da! Ispričavam se na propustu. Umjesto void otkazi obavezu(), što je neispravno, signatura funkcije treba biti void otkaziObavezu().
P13 (Hack and slash): Što je točno faktor snage kod OlogHai trolova?
O13: Taj dio je malo nejasan. Radi se o tome da 40% više štete od oružja treba implementirati kao šteta od oružja * faktor snage. Znači za zadanu vrijednost 40%, faktor snage ćete unijeti kao 1.4. Pogledajte i odgovor O6.
P14: Treba li implementirati neki destruktor za klase?
O14: Treba li? Što se dešava ako nije implementiran destruktor? Je li to željeno ponašanje za vašu klasu? Pogledajte vježbe 2, predavanja 6 i odličnu stranicu C++ faq lite.
P15: Kad u header datoteci kod bazne klase navedemo virtualne funkcije, trebamo li ih navoditi i u ostalim, naslijeđenih klasama?
O15: Trebate li? Što se dešava ako ih ne navedete? Je li to očekivano? Zašto to radi/ne radi? Pogledajte vježbe 8 i C++ faq lite, dijelove [19]-[23].
P16 (Hack and slash): Što ako se nekom biću zdravlje spusti na nulu? "Umire li ono"?
O16: U čarobnom svijetu trolova i vilenjaka, bića nikad ne umiru. Glavni dizajner igre kaže da će ta opcija biti implementirana u nekom drugom izdanju igre. Patch će biti samo 0.99$!
P17 (Hack and slash): Ako bića nikada ne umiru, kako se trolovi s negativnim zdravljem regeneriraju?
O17: Možete napraviti da dobivaju -1*stopaRegeneracije*zdravlje umjesto da ga gube sa stopaRegeneracija*zdravlje. Ali takav slučaj se neće testirati.
P18 (Hack and slash): Kod konstruktora Vilenjak(double zdravlje, double napad, double starost) stoji rečenica: "Ukoliko napad ili zdravlje nisu eksplicitno navedeni, pretpostavlja se da su redom 10.0 i 100.0". Kako to mogu biti defaultni argumenti, jer je poslije njih još i starost?
O18: Ispričavam se na propustu. Kao i kod klase Patuljak, pretpostavljeni parametri su napad i starost. Rečenica bi trebala glasiti: "Ukoliko napad ili starost nisu eksplicitno navedeni, pretpostavlja se da su redom 10.0 i 100.0".
P19 (Hack and slash): Smije li funkcija void izracunajIshod(double obranjiviNapad, double neobranjiviNapad) biti javna?
O19: Da, funkcija izracunajIshod može biti javna. Hack and slash (napisa): | Vodite računa o nedostupnosti podataka iz klasa vanjskim korisnicima kojima nisu
potrebni (enkapsulaciji). Samo bi funkcije trebale biti javno dostupne. |
Elegantnije rješenje koristilo bi koncept friend klasa ili funkcija, ali to nije obrađeno prije zadavanja treće zadaće.
P20: Navedeno je da će se provjeravati mogu li se na konstantnim objektima pozivati funkcije koje ne mijenjaju objekt. Što se očekuje kao rezultat provjere?
Hack and slash (napisa): | Također će se provjeriti mogu li se na konstantnim objektima pozvati funkcije koje vraćaju trenutno zdravlje, najveće moguće zdravlje i druge funkcije koje ne mijenjaju objekt |
Obaveze (napisa): | Također će se provjeriti mogu li se na konstantnim objektima pozvati funkcije koje ne mijenjaju objekte, kao što su int stanjeBodova(), unsigned idObaveze(), string slavljenik() i slične. |
O20: Očekuje se da je moguće pozivati funkcije koje ne mijenjaju objekt. Pogledajte vježbe 7a i C++ faq lite o const ispravnosti.
P21: Što točno znači vanjski kôd? Kako inicijalizirati statičke varijable ako ne smijemo koristiti vanjski kôd?
Tekst zadatka (napisa): | Pri testiranju programa uzimat će se u obzir samo napisane klase, a ne i eventualni vanjski kôd (kao što su na primjer globalne varijable). |
O21: Izrazom "vanjski kôd" sam nazvao varijable i funkcije koje ne pripadaju nekoj klasi. Primjer toga su globalne varijable u pravom smislu riječi (one koje se dosežu "praznim dosegom" ::imeVarijable). Naravno da smijete koristiti inicijalizaciju statičkih varijabli tipvarijable ImeKlase::imeVarijable = vrijednost. Te varijable nisu globalne nego pripadaju nekoj klasi. Obično se i nazivaju statičke članske varijable (i pristupa im se "nepraznim" operatorom razrješenja dosega ImeKlase::imeVarijable).
P22: Kako postaviti da su neke varijable konstantne kad ih tek moramo "učitati" sa konstruktorom?
O22: Takav slučaj nije eksplicitno naveden na vježbama, iako smo spominjali sve što je potrebno za riješiti ga. Svakako pročitajte nešto više o konstruktorima na C++ faq lite.
P23 (Obaveze): U tekstu zadatka piše da lokacijaSastanka() vraća lokaciju sastanka. Nedostaje li tu povratna vrijednost?
O23: Da! Ispričavam se na propustu. Umjesto signature lokacijaSastanka(), što je neispravno, treba biti string lokacijaSastanka().
P24: Jesu li definicije funkcija zadane u zadacima "potpune"? Ako piše izlazniTip ImeFunkcije(ulazniTip ulazniParametar), treba li funkcija izgledati točno tako?
O24: Ne. Zadane su samo signature funkcija; kakvog tipa su i kako se zovu ulazni parametri i što funkcija vraća. Neke funkcije mogu (i moraju) uz to biti označene kao konstantne, statičke, virtualne, potpuno virtualne (ili neka druga vrsta koju sam možda propustio navesti). Znači, ono što je zadano mora biti poštovano, no definicija funkcije se može i dodatno označiti ako je to potrebno.
P25: Kako patuljak prima štetu?
O25: Kada izračunavaju ishod, patuljci odbijaju 10% od obranjivog napada zbog otpornosti. Oklop funkcionira kao i kod drugih bića; preostala vrijednost napada se prvo primjenjuje na oklop (pri tome se vrijednost oklopa umanjuje za vrijednost napada, do najmanje 0.0), a mogući preostali iznos napada se odbija od trenutnog zdravlja. Neobranjivi napad se direktno odbija od zdravlja, bez obzira na postojanje oklopa i otpornosti.
Za početne vrijednosti: starost = 100, oklop = 5, zdravlje = 20 i napad = {20 obranjivo, 10 neobranjivo} računamo:
Otpornost je 10%. Obranjivi napad je zato 20 - 10 = 10. Od toga je 5 utrošeno na uništavanje oklopa, pa je preostala vrijednost 5. Zdravlje zato pada na 15 od obranjivog napada. Konačno, zdravlje pada na 5 zbog neobranjivog napada.
Konačne vrijednosti: starost = 100, oklop = 0, zdravlje = 5
Ilija Pavlic.
Description: |
Nekoliko primjedbi o konstruktorima. |
|
 Download |
Filename: |
Konstruktori.pdf |
Filesize: |
99.41 KB |
Downloaded: |
371 Time(s) |
Zadnja promjena: Marvin; 11:07 sri, 18. 5. 2011; ukupno mijenjano 14 put/a.
|