Ласло Краус |
ИР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.