Ласло Краус |
ИР2ОО1 Колоквијум 26. 11. 2011. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Ако постоји декларација типа: enum
Boja
{CRVENA,
ZUTA,
PLAVA};
и дефиниција променљиве: Boja
b=CRVENA;
да ли су исправни изрази:
(1) b++;
(2) b+1;
(3) b=2;
(4) b>=ZUTA;
б) Написати декларацију методе f која не мења стање објеката класе за који је позвана, не мења једини целобројни аргумент који се преноси по референци и чији је резултат показивач на константан цео број.
в) Како се реализује корисничка конверзија: (1) произвољног типа Т
у класни тип К
, (2) класног типа К
у произвољни тип Т
? Написати одговарајуће декларације.
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
it<<putnik
) у облику [
име(
пол)
старост]
. Не може да се направи копија путника на било који начин.
avion(vrs,kol)
; програм се прекида ако је врста или колона изван опсега), да се задати путник смести на било које слободно место (аvion+=&putnik
; повратна вредност је индикатор успеха) и да се упише авион у излазни ток (it<<avion
) у облику [
рб,(
в,
к,
п),…,(
в,
к,
п)]
, где је рб – регистарски број авиона, в, к – врста и колона заузетог места, п – резултат уписивања путника на датом седишту. Не може да се направи копија авиона на било који начин.
it<<let
) у облику {
од,
до,
авион}
. Лет може да се копира.
(5 поена) Написати на језику C++ програм који направи неколико авиона, направи један лет, у авион додељен лету дода неколико путника и испише лет на главном излазу. Користити фиксне параметре (не треба ништа учитавати с главног улаза).
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; class Putnik { char* ime; char pol; int starost; Putnik(const Putnik &) {} void operator=(const Putnik &) {} public: Putnik(char* _ime, char _pol, int _star) : pol(_pol), starost(_star) { ime = new char[ strlen(_ime)+1 ]; strcpy(ime, _ime); } ~Putnik() { delete []ime; } const char* i() const { return ime; } char dohvPol() const { return pol; } int dohvStar() const { return starost; } friend ostream &operator<<(ostream &os, const Putnik &p) { return os << '[' << p.ime << "(" << p.pol << ")" << p.starost << ']'; } }; class Avion { static int posRegBr; int regBr, vrs, kol; Putnik*** sedista; Avion(const Avion &a) {} void operator=(const Avion &a) {} public: Avion(int v, int k); ~Avion(); int brPutnika() const { return vrs * kol; } Putnik*& operator()(int v, int k) { if (v<0 || v>=vrs || k<0 || k>=kol) exit(1); return sedista[v][k]; } const Putnik* operator()(int v, int k) const { if (v<0 || v>=vrs || k<0 || k>=kol) exit(1); return sedista[v][k]; } bool operator+=(Putnik* p); friend ostream &operator<<(ostream &os, const Avion &a); }; int Avion::posRegBr = 0; Avion::Avion(int v, int k) { regBr = ++posRegBr; vrs = v; kol = k; sedista = new Putnik**[v]; for (int i = 0; i < v; i++) { sedista[i] = new Putnik* [k]; for (int j = 0; j < k; j++) sedista[i][j] = 0; } } Avion::~Avion() { for (int i = 0; i<vrs; i++) { for (int j=0; j<kol; delete sedista[i][j++]); delete [] sedista[i]; } delete [] sedista; } bool Avion::operator+=(Putnik* p) { int v = 0, k = 0; for (int v=0 ; v<vrs; v++ ) for (int k = 0; k<kol; k++) if (sedista[v][k] == 0) { sedista[v][k] = p; return true; } return false; } ostream &operator<<(ostream &os, const Avion &a) { os << "[" << a.regBr ; for (int v = 0; v < a.vrs; v++) for( int k = 0; k < a.kol; k++) { if( a.sedista[v][k] != 0 ){ os << ",(" << v << "," << k << ',' << *a.sedista[v][k] << ")"; } } return os << ']'; } class Let { Avion* a; char *pol, *dol; void kopiraj(Avion* _a, char* _pol, char* _dol); void brisi() { delete [] pol; delete [] dol; } public: Let(Avion* _a, char* _pol, char* _dol) { kopiraj(_a, _pol, _dol); } ~Let() { brisi(); } Let(const Let &l) { kopiraj(l.a, l.pol, l.dol); } Let &operator=(const Let &l) { if (this != &l) { brisi(); kopiraj(l.a, l.pol, l.dol); } return *this; } const Avion* avion()const { return a; } const char* polazak()const { return pol; } const char* dolazak()const { return dol; } friend ostream &operator<< (ostream &os, const Let &l){ return os << "{" << l.pol << "," << l.dol << "," << *l.a << "}"; } }; void Let::kopiraj(Avion* _a, char* _pol, char* _dol) { a = _a; pol = new char [strlen(_pol) + 1]; dol = new char [strlen(_dol) + 1]; strcpy(pol, _pol); strcpy(dol, _dol); } int main() { Avion a1(10, 5), a2(12, 8), a3(7, 4); Let let(&a1, "Beograd", "Nis"); Putnik* p1 = new Putnik("Putnik1", 'M', 30); Putnik* p2 = new Putnik("Putnik2", 'Z', 25); a1 += p1; a1 += p2; cout << let << endl; return 0; }(⇒ почетак)
{Beograd,Nis,[1,(0,0,[Putnik1(M)30]),(0,1,[Putnik2(Z)25])]}
Copyright © 2012, Laslo Kraus
Последња ревизија: 18.11.2012.