You are on page 1of 3

II PARCIJALNI ISPIT IZ PREDMETA

TEHNIKE PROGRAMIRANJA
Nova uprava ETF-a odluila je da uvede automatizirani fast-food restoran. Za potrebe automatske obrade
narudbi, potrebno je razviti odgovarajui program. Oni su se vrijedno bacili na posao, pa su prvi rezultati u
tom pravcu dati u vidu programa koji je dat u Prilogu.
Zadatak 1 (1 poen)
U programu iz Priloga postoji curenje memorije. Pronaite ga i rijeite ovaj problem.
Zadatak 2 (1,5 poena)
Nakon to ste rijeili problem iz Zadatka 2, pojavie se problem vezan za kopiranje objekata tipa Narudzbe.
Opiite u emu je problem i rijeite ga. Takoer, podrite optimizaciju ukoliko se pojavi potreba za
kopiranjem privremenih objekata tipa te klase (recimo, rezultata neke funkcije koja vraa takve objekte).
Zadatak 3 (1,5 poen)
Primjerci objekata tipa Narudzbe, ovako kako je napisano, nisu predvieni da se meusobno dodjeljuju.
Uklonite ovo ogranienje, odnosno podrite meusobno dodjeljivanje objekata ovog tipa. Takoer, podrite
optimizaciju ukoliko se pojavi potreba za kopiranjem privremenih objekata tipa te klase.
Zadatak 5 (1,5 poen)
Trenutna izvedba klase Narudzbe ograniena je na 20 narudbi. Napravite izmjenu koja e omoguiti da se,
kada se dostigne maksimalni kapacitet klase (tj. broj narudbi koje se mogu pohraniti), izvri automatsko
poveanje kapaciteta klase za 20 novih narudbi (u odnosu na trenutni kapacitet), ime e se omoguiti da e
broj narudbi koje se mogu registrirati biti ogranien samo koliinom raspoloive memorije.
Zadatak 6 (2,5 poena)
Uvedite novu klasu ObrokSaPicem koja opisuje narudbu koja uz obrok ukljuuje i pie. Ova klasa treba
biti naslijeena iz klase Obrok, a od dodatnih atribta sadri naziv pia (recimo Fanta) kao i cijenu pia.
Ona treba posjedovati dvije nove trivijalne pristupne metode DajNazivPica i DajCijenuPica koje
vraaju vrijednosti novouvedenih atributa. Konstruktor ove klase treba biti izmijenjen u odnosu na
konstruktor klase Obrok da omogui i inicijalizaciju dopunskih atributa. Dalje, potrebno je u klase
Obrok i ObrokSaPicem dodati i metodu DajUkupnuCijenu, koja u klasi Obrok radi istu stvar kao
i metoda DajCijenuObroka, ali u klasi ObrokSaPicem ukljuuje i cijenu pia. Metodu Ispisi u
klasi ObrokSaPicem takoer treba modificirati da uzme u obzir i novododane informacije. Pri tome treba
obezbijediti da se uvijek pozivaju prave verzije svih metoda u sluaju kada se one pozivaju preko
pokazivaa deklariranog da pokazuje na objekte tipa Obrok. Konano, treba i u klasu Narudzbe uvesti
novu metodu NaruciObrokSaPicem koja e omoguiti kreiranje narudbe obroka sa piem, analogno
metodi NaruciObrok.
Zadatak 7 (2,5 poena)
Nakon uvoenja nove klase ObrokSaPicem, kopiranje i meusobno dodjeljivanje primjeraka klase
Narudzbe nee raditi kako treba, jer e se pri kopiranju gubiti sve specifinosti narudbi koje sadre
pie. Obavite sve izmjene koje je potrebno obaviti da biste podrali korektno (polimorfno) kopiranje i
meusobno dodjeljivanje objekata tipa Narudzbe.
Zadatak 8 (1,5 poen)
Dodajte u klasu Narudzbe metodu ObradiNaruzdbu bez parametara. Ona treba da vri ispis podataka
o prvoj primljenoj narudbi na ekran (tj. narudbi koja najdue eka na isporuku). Pored toga, ova metoda
vri brisanje obraene narudbe iz kolekcije, tako da e sljedei poziv ove metode ispisati sljedeu naredbu
po redu, i tako dalje, sve dok se ne obrade sve narudbe. U sluaju da se ova metoda pozove kada je
kolekcija prazna, metoda treba da baci izuzetak.

Zadatak 9 (0,5 poena)


Dodajte u klasu Narudzbe unarni operator ! koji daje logiku vrijednost true ako i samo ako nema
ni jedne registrirane narudbe, inae vraa logiku vrijednost false.
Zadatak 10 (2 poena)
Napravite operator + koji primijenjen na dva objekta tipa Narudzbe daje kao rezultat novi objekat tipa
Narudzbe u kojem se nalaze sve narudbe iz oba objekta koji se sabiraju zajedno.
Zadatak 11 (1 poen)
Napravite operator () koji primijenjen na neki objekat tipa Narudzbe kao rezultat daje ukupnu cijenu
narudbi koje je naruio student ije se ime navodi kao stringovni parametar unutar okruglih zagrada (tj.
zbir cijena svih narudbi tog studenta). Ukoliko student sa navedenim imenom nije nita naruio, ovaj
operator kao rezultat daje nulu.
Zadatak 12 (3 poena)
Napravite main funkciju koja obrauje narudbe na osnovu ulaznih podataka koji su pohranjeni u
tekstualnim datotekama. Podaci su organizirani u dvije datoteke. Datoteka NARUDZBE.TXT, predstavlja
datoteku sa podacima samim narudbama. Ova datoteka organizirana je tako da se za svaku narudbu u
prvom redu nalazi ime naruioca, u drugom redu naziv obroka, a u treem redu naziv pia (trei red se
ostavlja prazan ukoliko naruioc nije naruio pie). Datoteka nazvana CIJENE.TXT predstavlja datoteku
cijena i organizirana je tako da se za svaki obrok ili pie u prvom redu nalazi naziv obroka ili pia, dok se u
drugom redu nalazi cijena za navedeni obrok ili pie (u KM). Program bi trebao itati podatke o narubama
iz tekstualne datoteke NARUDZBE.TXT uz konsultacije cjenovnika iz datoteke CIJENE.TXT i smjetati ih
u kolekciju. Nakon to se proitaju podatke o svim narudbama, testni program treba da ispie sve unesene
narudbe u redoslijedu pristizanja.
Zadatak 13 (1,5 poen)
Opiite sve razloge zbog kojih kontejnerska klasa Narudzbe nije pogodna za snimanje njenog sadraja u
binarnu datoteku, a zatim napiite kako bi principijelno izgledao kod za snimanje njenog sadraja u binarnu
datoteku (koji nee raditi korektno) kada ti razlozi ne bi bili prisutni.

Prilog:
#include <string>
#include <iostream>
#include <stdexcept>
class Obrok {
std::string naziv;
double cijena;
std::string narucioc;
public:
Obrok(std::string naziv, double cijena, std::string narucioc) :
naziv(naziv), cijena(cijena), narucioc(narucioc) {}
std::string DajNazivObroka() const { return naziv; }
double DajCijenuObroka() const { return cijena; }
std::string DajNarucioca() const { return narucioc; }
void Ispisi() const {
std::cout << narucioc << " je narucio " << naziv << " i treba platiti "
<< cijena << " KM.\n";
}
};
class Narudzbe {
int broj_narudzbi, kapacitet;
Obrok **obroci;
public:
Narudzbe() : broj_narudzbi(0), kapacitet(20),
obroci(new Obrok*[kapacitet]) {}
~Narudzbe() { delete[] obroci; }
Narudzbe(const Narudzbe &n) : broj_narudzbi(n.broj_narudzbi),
kapacitet(n.kapacitet), obroci(new Obrok*[kapacitet]) {
std::copy(n.obroci, n.obroci + broj_narudzbi, obroci);
}
Narudzbe &operator =(const Narudzbe &n) = delete;
void NaruciObrok(std::string naziv, double cijena, std::string narucioc) {
if(broj_narudzbi > kapacitet)
throw std::range_error("Dostignut maksimalan broj narudzbi!");
obroci[broj_narudzbi++] = new Obrok(naziv, cijena, narucioc);
}
const Obrok &operator[] (int redni_broj) const {
return *obroci[redni_broj];
}
};
int main() {
Narudzbe etf_fast_food;
etf_fast_food.NaruciObrok("burek", 2.5, "Brus Li");
etf_fast_food[0].Ispisi();
return 0;
}

You might also like