Elektrotehnicki fakultet, Beograd  Ласло Краус ПЈМП
Први парцијални испит
1. 3. 2003.

Аутори: Игор Тартаља (задатак 2) и Ласло Краус (задаци 1 и 3 са решењем)

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

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

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

Саставити на језику C++ главни програм који од целих бројева које прочита преко главног улаза направи један низ. Унос бројева се звршава са 9999. По завршетку читања програм испише садржај низа. На крају, читајући индексе исписује идентификационе бројеве и вредности одабраних елемената низа све док се за индекс не уноси 9999.

Поставка задатка 2 (15 поена) ( почетак)

Одговорити концизно на следећа питња везана за језик C++:

а) Да ли се у статичкој функцији класе може користити показивач this? Образложити.

б) У којим се ситуацијама позива конструктор копије?

в) Зашто је флексибилније користити низове показивача на објекте него низове објеката?

Поставка задатка 3 (15 поена) ( решење | почетак)

Симболи A, B, C и D кодирају се са по два бита 00, 01, 10 и 11. Извршити компресију низа симбола ABCCDABAA применом динамичког Хафмановог поступка.


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


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

#include <iostream.h>

class Predmet {
  static int ukId; int id;
  virtual void pisi(ostream &d) const =0;
public:
  Predmet () { id = ++ ukId; }
  Predmet (const Predmet &) { id = ++ ukId; }
  virtual ~Predmet () {}
  Predmet & operator= (const Predmet &) { return *this);
  int operator! () const { return id; }
  virtual Predmet *kopija () const =0;
  friend ostream & operator<< (ostream &d, const Predmet &p)
    { p.pisi (d); return d; }
};

int Predmet::ukId = 0;

class Celi : public Predmet {
  int vr;
  void pisi (ostream &d) const { d<<vr; }
public:
  Celi (int v=0) { vr = v; }
  int operator+ () const { return vr; }
  Celi *kopija () const { return new Celi (*this); }
};

class GIndeks {};

class Zbirka {
public:
  virtual ~Zbirka () {}
  virtual const char *vrsta () const =0;
  virtual int operator+ () const =0;
  virtual Zbirka & operator+= (const Predmet &p) =0;
  virtual Predmet *& operator[](int i)=0;
  virtual const Predmet * operator[] (int i) const =0;
  virtual Zbirka & operator~ () =0;
  friend ostream & operator<< (ostream &d, const Zbirka &z);
};

ostream & operator<< (ostream &d, const Zbirka &z) {
  d << z.vrsta() << '[';
  for (int i=0; i<+z; i++) { d<<*z[i]; if (i!=+z-1) d<<','; }
  return d << ']';
}

class Niz: public Zbirka {
  Predmet **niz; int duz, kap;
  void kopiraj (const Niz &n);
  void brisi () { ~*this; delete[] niz; }
public:
  Niz (int k=10) { niz = new Predmet* [kap = k]; duz = 0; }
  Niz (const Niz &n) { kopiraj (n); }
  ~Niz () { brisi (); }
  Niz & operator= (const Niz &n) {
    if (this!=&n){ brisi(); kopiraj(n); }
    return *this;
  }
  const char *vrsta () const { return "Niz"; }
  int operator+ () const { return duz; }
  Niz & operator+= (const Predmet &p);
  Predmet *& operator[] (int i) {
    if (i<0 || i>=duz) throw GIndeks ();
    return niz[i];
  }
  const Predmet * operator[] (int i) const {
    if (i<0 || i>=duz) throw GIndeks ();
    return niz[i];
  }
  Niz & operator~ ();
};

void Niz::kopiraj (const Niz &n) {
  niz = new Predmet* [kap=n.kap]; duz = n.duz;
  for (int i=0; i<duz; i++) niz[i] = n.niz[i]->kopija();
}

Niz & Niz::operator+= (const Predmet &p){
  if (duz == kap) {
    Predmet **pom = new Predmet* [kap+=(kap<100?10:0.1*kap)];
    for (int i=0; i<duz; i++) pom[i] = niz[i];
    delete [] niz; niz = pom;
  }
  niz[duz++] = p.kopija();
  return *this;
}

Niz & Niz::operator~ () {
  for (int i=0; i<duz; delete niz[i++]);
  duz = 0; return *this;
}

int main () {
  Niz niz (20); cout << "Niz? ";
  while (1) {
    int k; cin >> k;
  if (k == 9999) break;
    niz += k;
  }
  cout << niz << endl;
  while (1) {
    int i; cout << "Indeks? "; cin >> i;
  if (i == 9999) break;
    try {
      cout << "id=" << !*niz[i] << ", vr=" << *niz[i] << endl;
    } catch (GIndeks) {
      cout << "*** Neispravan indeks!\n";
    }
  }
  return 0;
}

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

0000 1001 0001 0001 1001 0010 101 (27b > 9·2=18b)

( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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