Ласло Краус |
ПЈМП Први парцијални испит 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.