Ласло Краус |
ИР2ОО1/СИ2ОО1 Испит 19. 1. 2012. |
---|
Одговорити концизно (једна или две реченице) и прецизно на следећа питaња:
а) Ако је: class
O{protected:int x;};
class
I:O{};
да ли се и како може постићи да у класи I
наслеђени члан x
буде (1) приватан (2) заштићен (3) јаван?
б) Ако важи class
I:
public
O{};
, коју вредност ће имати аргумент x
по напуштању функције f
: void
f(int&x)
{x=0;
try
{x=1;
throw
new
I;
x=2;}
catch(O*i)
{x=3;}
catch(I*i)
{x=4;}}
. Програм се успешно преводи и извршава.
в) Који тип итератора треба користити за приступ сваком елементу STL вектора од последњег до првог, уколико се елементи вектора не мењају приликом приступа и које је врсте такав итератор?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене писањем текста поруке):
it<<osoba
). Пише се ознака врсте и идентификатор. Особа не може да се копира ни на који начин.
a
, b
и c
. Услуга се бира аутоматски, по случајном избору, приликом стварања клијента. Ознака врсте особе је K
. Може да се дохвати ознака услуге. У излазни ток се пише и ознака услуге унутар округлих заграда. Стандардна функција rand()
из библиотеке cstdlib
при сваком позивању враћа псеудослучајан позитиван цео број.
P
, R
и S
. Сви радници, у случају успеха извршења своје активности, исписују себе на главном излазу.
Написати на језику C++ програм који направи једну шалтерску службу и затражи од ње да изведе 100 активности (не треба ништа учитавати с главног улаза).
#include <iostream> #include <cstdlib> using namespace std; class Osoba { static int posId; int id; Osoba(const Osoba&) {} void operator=(const Osoba&) {} public: Osoba() { id = ++posId; } virtual ~Osoba() {} virtual char vrsta() const =0; protected: virtual void pisi (ostream& it) const { it << vrsta() << id; } friend ostream& operator<<(ostream& it, const Osoba& oso) { oso.pisi(it); return it; } }; int Osoba::posId = 0; class Klijent: public Osoba { char usl; void pisi(ostream& it) const { Osoba::pisi(it); it << '(' << usl << ')'; } public: static const char usluge[]; explicit Klijent() { usl = usluge[rand() % 3]; } char vrsta() const { return 'K'; } char dohvUsl() const { return usl; } }; const char Klijent::usluge[] = {'a', 'b', 'c'}; class GPrazan {}; inline ostream& operator<<(ostream& it, const GPrazan&) { it << "*** Red je prazan!"; } template <typename T> class Red { struct Elem { T t; Elem* sled; Elem(const T& tt) { t = tt; sled = 0; } }; Elem *prvi, *posl; void kopiraj(const Red& r); void brisi(); public: Red() { prvi = posl = 0; } Red(const Red& r) { kopiraj(r); } ~Red() { brisi(); } Red& operator=(const Red& r) { if (this != &r) { brisi(); kopiraj(r); } return *this; } Red& stavi(const T& t) { posl = (!prvi ? prvi : posl->sled)= new Elem(t); return *this; } T uzmi() { if (!prvi) throw GPrazan(); T t = prvi->t; Elem* stari = prvi; prvi = prvi->sled; delete stari; if (!prvi) posl = 0; return t; } bool prazan() const { return !prvi; } }; template <typename T> void Red<T>::kopiraj(const Red& r) { prvi = posl = 0; for (Elem* tek=r.prvi; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem(tek->t); } template <typename T> void Red<T>::brisi() { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } posl = 0; } class Radnik: public Osoba { protected: Klijent* kli; void pisi(ostream& it) const { if (kli) { Osoba::pisi(it); it << '[' << *kli << ']'; } } public: Radnik() { kli = 0; } virtual void radi() =0; }; class Portir: public Radnik { Red<Klijent*>* ulaz; public: Portir(Red<Klijent*>* ul) { ulaz = ul; kli = 0; } char vrsta() const { return 'P'; } void radi() { ulaz->stavi(kli = new Klijent()); if (kli) cout << *this << endl; } }; class Razvodnik: public Radnik { Red<Klijent*>* ulaz; Red<Klijent*>* salteri; public: Razvodnik(Red<Klijent*>* ul, Red<Klijent*> salt[]) { ulaz = ul; salteri = salt; } char vrsta() const { return 'R'; } void radi() { try { kli = ulaz->uzmi(); char uls = kli->dohvUsl(); salteri[kli->dohvUsl() - Klijent::usluge[0]].stavi(kli); } catch (GPrazan) { kli = 0; } if (kli) cout << *this << endl; } }; class Sluzbenik: public Radnik { Red<Klijent*>* salter; public: Sluzbenik(Red<Klijent*>* salt) { salter = salt; } char vrsta() const { return 'S'; } void radi () { try { kli = salter->uzmi(); } catch (GPrazan) { kli = 0; } if (kli) { cout << *this << endl; delete kli; kli = 0; } } }; class Sluzba { Red<Klijent*> ulaz; Red<Klijent*> salteri[3]; Radnik** r; Sluzba(const Sluzba&) {} void operator=(const Sluzba&) {} public: Sluzba() { r = new Radnik* [5]; r[0] = new Portir(&ulaz); r[1] = new Razvodnik(&ulaz, salteri); r[2] = new Sluzbenik(&salteri[0]); r[3] = new Sluzbenik(&salteri[1]); r[4] = new Sluzbenik(&salteri[2]); } ~Sluzba(); void radi(int n); }; Sluzba::~Sluzba() { for (int i=0; i<5; delete r[i++]); } void Sluzba::radi(int n) { for (int i=0; i<n; i++) r[rand()%5]->radi(); } int main() { Sluzba().radi(100); return 0; }(⇒ почетак)
P1[K6(c)] P1[K7(c)] R2[K6(c)] R2[K7(c)] P1[K8(c)] R2[K8(c)] S5[K6(c)] P1[K9(c)] R2[K9(c)] S5[K7(c)] S5[K8(c)] P1[K10(a)] R2[K10(a)] S3[K10(a)] S5[K9(c)] P1[K11(c)] R2[K11(c)] P1[K12(c)] S5[K11(c)] R2[K12(c)] P1[K13(c)] S5[K12(c)] P1[K14(c)] R2[K13(c)] R2[K14(c)] S5[K13(c)] S5[K14(c)] P1[K15(b)] R2[K15(b)] S4[K15(b)] P1[K16(b)] P1[K17(a)] R2[K16(b)] S4[K16(b)] R2[K17(a)] P1[K18(c)]
Copyright © 2012, Laslo Kraus
Последња ревизија: 9.2.2012.