Ласло Краус |
ПЈМП Први парцијални испит 13. 2. 2004. |
---|
Пројектовати на језику C++ систем класа са следећим описом:
<<
.
+=
). При израчунавању (стамбене) површине и запремине се занемарује дебљина зидова. Кућа се "клонира" тако што се ствaра њена идентична копија. Кућа се исписује на стандардном излазу, тако што се испише "Kuca:", a онда у угластим заградама низ саставних квадара од приземља навише, уз раздвајање зарезима.
<<
) тако што се испише "Ulica: име улице", а онда у сваком реду, уз увлачење у односу на почетак реда, по једна кућа из улице.
Саставити на језику C++ главни програм који треба да демонстрира формирање једне улице са неколико различитих и неколико истих кућа, затим да испише улицу, а на крају израчуна и испише расположиву стамбену површину и запремну стамбеног простора у улици.
Одговорити концизно на следећа питања
а) Зашто је механизам динамичког везивања за реализацију полиморфизма ефикасан?
б) Која је основна разлика између механизама преклапања имена метода (name оverloading) и редефинисања (overriding) виртуелних метода? Објаснити.
в) Који проблем решава RSA алгоритам, и на ком принципу почива његова јачина заштите (рачунарска безбедност)?
Симболи A, B, C ..., H кодирају се са по три бита 000, 001, 010 ..., 111. Извршити компресију низа симбола ABAB CABC DABC DAB применом LZW поступка и резултат проверити применом инверзног поступка.
#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; } }
0000 0001 1000 0010 1010 0011 1100 1000 (32b < 15·3=45b)
(⇒ почетак)
Copyright © 2004, Laslo Kraus
Последња ревизија: 14.3.2004.