Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1
Колоквијум
26. 11. 2011.

Аутори: Игор Тартаља, Ђорђе Ђурђевић и Ласло Краус

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Ако постоји декларација типа: enum Boja {CRVENA, ZUTA, PLAVA}; и дефиниција променљиве: Boja b=CRVENA; да ли су исправни изрази:
(1) b++;   (2) b+1;   (3) b=2;   (4) b>=ZUTA;

б) Написати декларацију методе f која не мења стање објеката класе за који је позвана, не мења једини целобројни аргумент који се преноси по референци и чији је резултат показивач на константан цео број.

в) Како се реализује корисничка конверзија: (1) произвољног типа Т у класни тип К, (2) класног типа К у произвољни тип Т? Написати одговарајуће декларације.

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):

(5 поена) Написати на језику C++ програм који направи неколико авиона, направи један лет, у авион додељен лету дода неколико путника и испише лет на главном излазу. Користити фиксне параметре (не треба ништа учитавати с главног улаза).


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#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])]}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2012, Laslo Kraus
Последња ревизија: 18.11.2012.