Ласло Краус |
ПЈМП Први парцијални испит 1. 3. 2003. |
---|
Пројектовати на језику C++ систем класа са следећим описом (све класе опремити потребним конструкторима, деструктором и оператором =
):
!pr
). Предвидети стварањење копије (са новим идентификационим бројем) у динамичкој зони меморије и исписивање (dаt<<pr
).
+zb
), додавање копије предмета (zb+=pr
), дохватање предмета са датим редним бројeм у збирци (~zb
). Апстрактна збирка остварује исписивање свог садржаја (dat<<zb
). Недозвољени индекс се пријављује изузетком помоћу објекта типа специјалне једноставне класе. Испис збирке садржи назив врсте збирке и вредности појединих предмета унутар пара средњих заграда, међусобно раздвојене зарезима.
"Niz"
. Ствара се празан са задатим капацитетом (подразумевано 10). Нови предмети се додају иза последњег попуњеног места. Капацитет низа се, по потреби аутоматски повећава за 10% тренутног капацитета низа, али најмање за 10 места.
Саставити на језику C++ главни програм који од целих бројева које прочита преко главног улаза направи један низ. Унос бројева се звршава са 9999. По завршетку читања програм испише садржај низа. На крају, читајући индексе исписује идентификационе бројеве и вредности одабраних елемената низа све док се за индекс не уноси 9999.
Одговорити концизно на следећа питња везана за језик C++:
а) Да ли се у статичкој функцији класе може користити показивач this
? Образложити.
б) У којим се ситуацијама позива конструктор копије?
в) Зашто је флексибилније користити низове показивача на објекте него низове објеката?
Симболи A, B, C и D кодирају се са по два бита 00, 01, 10 и 11. Извршити компресију низа симбола ABCCDABAA применом динамичког Хафмановог поступка.
#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; }
0000 1001 0001 0001 1001 0010 101 (27b > 9·2=18b)
(⇒ почетак)
Copyright © 2003, Laslo Kraus
Последња ревизија: 10.7.2003.