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