Elektrotehnicki fakultet, Beograd  Ласло Краус ПЈМП
Први парцијални испит
13. 2. 2004.

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

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

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

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

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

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

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

а) Зашто је механизам динамичког везивања за реализацију полиморфизма ефикасан?

б) Која је основна разлика између механизама преклапања имена метода (name оverloading) и редефинисања (overriding) виртуелних метода? Објаснити.

в) Који проблем решава RSA алгоритам, и на ком принципу почива његова јачина заштите (рачунарска безбедност)?

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

Симболи A, B, C ..., H кодирају се са по три бита 000, 001, 010 ..., 111. Извршити компресију низа симбола ABAB CABC DABC DAB применом LZW поступка и резултат проверити применом инверзног поступка.


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


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

#include <iostream.h>
#include <string.h>

class Telo {
  virtual void pisi (ostream& d) const =0;
public:
  virtual ~Telo(){}
  virtual float P() const =0;
  virtual float V() const =0;
  friend ostream& operator<< (ostream& d, const Telo& t) { t.pisi(d); return d; }
};

class Kvadar: public Telo{ float a,b,h;
  void pisi(ostream &d)const { d<<"K("<<a<<","<<b<<","<<h<<")"; }
public:
  Kvadar(float aa, float ab, float ah): a(aa),b(ab),h(ah){}
  float P() const {return a*b;}
  float V() const {return P()*h;}
};

class Piramida: public Telo { float a,b,h;
  void pisi(ostream &d) const { d<<"P("<<a<<","<<b<<","<<h<<")"; }
public:
  Piramida(float aa, float ab, float ah):
  a(aa), b(ab), h(ah) {}
  float P() const {return a*b;}
  float V() const {return P()*h/3.0f;}
};

class PreviseSpratova{};

class Kuca: public Telo{
  Kvadar** spratovi; int spratnost, brSpratova;
  void kopiraj(const Kuca& kuca);
  void razgradi();
  virtual void pisi(ostream &d) const;
public:
  Kuca(int s) { spratovi=new Kvadar*[s]; spratnost=s; brSpratova=0; }
  Kuca(const Kuca& kuca){kopiraj(kuca);}
  ~Kuca(){razgradi();}
  Kuca& operator=(const Kuca& kuca) {
    if (&kuca!=this){razgradi(); kopiraj(kuca);}
    return *this;
  }
  virtual Kuca& operator+=(const Kvadar& sprat){
    if (brSpratova==spratnost) throw PreviseSpratova();
    spratovi[brSpratova++]= new Kvadar(sprat);
    return *this;
  }
  virtual Kuca* klon() const{ return new Kuca(*this); }
  float P() const;
  float V() const;
};

void Kuca::kopiraj(const Kuca& kuca){
  brSpratova=kuca.brSpratova; spratnost=kuca.spratnost;
  spratovi=new Kvadar*[spratnost];
  for(int i=0; i<brSpratova; i++) spratovi[i]= new Kvadar(*kuca.spratovi[i]);
}

void Kuca::razgradi(){
  for(brSpratova--; brSpratova>=0; brSpratova--) delete spratovi[brSpratova];
  delete spratovi; spratovi = 0;
}

void Kuca::pisi(ostream &d) const{ d<<"Kuca: ";
  for (int i=0; i<brSpratova; i++) d<<"["<<*spratovi[i]<<"]"<<((i<brSpratova-1)?", ":"");
}

float Kuca::P() const {  float povrsina=0;
  for (int i=0; i<brSpratova; i++) povrsina+=spratovi[i]->P();
  return povrsina;
};

float Kuca::V() const { float zapremina=0;
  for (int i=0; i<brSpratova; i++) zapremina+=spratovi[i]->V();
  return zapremina;
};

class ViseKrovova{};

class KucaSaKrovom: public Kuca { Piramida* potkrovlje;
  void kopirajKrov(const KucaSaKrovom& kuca){
    if (kuca.potkrovlje) potkrovlje= new Piramida(*kuca.potkrovlje);
      else potkrovlje = 0;
  }
  void razgradiKrov() { delete potkrovlje; potkrovlje=0; }
  void pisi(ostream &d) const { d<<(Kuca)*this<<", <"<<*potkrovlje<<'>'; }
public:
  KucaSaKrovom(int s):Kuca(s),potkrovlje(0){}
  KucaSaKrovom(const KucaSaKrovom& kuca):Kuca(kuca) { kopirajKrov(kuca); }
  ~KucaSaKrovom(){razgradiKrov();}

  KucaSaKrovom& operator=(const KucaSaKrovom& kuca) {
    if (&kuca!=this){razgradiKrov(); Kuca::operator=(kuca); kopirajKrov(kuca);}
    return *this;
  }
  Kuca* klon() const { return new KucaSaKrovom(*this); }
  KucaSaKrovom& dodajKrov(const Piramida& krov){
    if (potkrovlje!=0) throw ViseKrovova();
    potkrovlje = new Piramida(krov);
    return *this;
  }
  float P() const {return Kuca::P()+potkrovlje->P()*0.75f;}
  float V() const {return Kuca::V()+potkrovlje->V();}
};

class PreviseKuca{};

class Ulica{ Kuca** kuce; int kapacitet, brKuca; char *ime;
  Ulica(const Ulica&){}
  void operator=(const Ulica&){}
public:
  Ulica(int k, char* naziv){
    kuce= new Kuca*[k]; kapacitet=k; brKuca=0;
    ime = new char[strlen(naziv)+1]; strcpy(ime,naziv);
  }
  ~Ulica();
  void dodajKucu(const Kuca& kuca, int n);
  float P() const;
  float V() const;
  friend ostream& operator<< (ostream& d, const Ulica& u);
};

Ulica::~Ulica(){
  for (int i=0; i<brKuca; delete kuce[i++]);
  delete kuce; delete ime;
}

void Ulica::dodajKucu(const Kuca& kuca, int n){
  if (brKuca+n>=kapacitet) throw PreviseKuca();
  for (int i=0; i<=n; i++) kuce[brKuca++]=kuca.klon();
}

float Ulica::P() const {
  float povrsina=0;
  for (int i=0; i<brKuca; i++) povrsina+=kuce[i]->P();
  return povrsina;
};

float Ulica::V() const {
  float zapremina=0;
  for (int i=0; i<brKuca; i++) zapremina+=kuce[i]->V();
  return zapremina;
};

ostream& operator<< (ostream& d, const Ulica& u) {
  d<<"Ulica: "<<u.ime<<endl;
  for (int i=0; i<u.brKuca; i++) d<<'\t'<<*u.kuce[i]<<endl;
  return d;
}

void main(){
  try{ Ulica u(3,"Bulevar Kralja Aleksandra");
    Kuca ku(2);          //prva kuca
    ku+=Kvadar(5,5,2.5); // prvi nivo
    ku+=Kvadar(4,4,2.5); // drugi nivo
//  ku+=Kvadar(4,4,2.5); //test izuzetka PreviseSpratova
    u.dodajKucu(ku,1);
    KucaSaKrovom kk(1);  //druga kuca sa krovom
    kk+=Kvadar(6,4,2.5); // prvi nivo
    kk.dodajKrov(Piramida(6,4,2.5)); // krov
//  kk+=Piramida(6,4,2.5); //test izuzetka ViseKrovova
    u.dodajKucu(kk,0);
//  u.dodajKucu(kk,0);   //test izuzetka PreviseKuca
    cout<<u;
    cout<<"P="<<u.P()<<"    V="<<u.V()<<endl;
  } catch (ViseKrovova) {cout<<"Vise krovova!"<<endl;
  } catch (PreviseSpratova) {cout<<"Previse spratova!"<<endl;
  } catch (PreviseKuca) {cout<<"Previse kuca!"<<endl;
  }
}

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

Компресија:
Експанзија:

0000 0001 1000 0010 1010 0011 1100 1000 (32b < 15·3=45b)

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

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