![]() Ласло Краус |
Објектно програмирање 1 - колоквијуми Други колоквијум 9. 6. 2010. |
---|
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене исписивањем поруке):
it<<potr
).
(
снага)
.
grupa+=potr
). Снага групе једнака је збиру снага потрошача у групи. У излазни ток се пише у облику [
потрошач,…,
потрошач]
.
it<<izv
). Грешка је ако би се прикључивањем потрошача извор преоптеретио или ако је индекс изван опсега. Ако се потрошач прикључује на заузето место, затечени потрошач на том месту се одвеже од извора. Ако се приликом прикључивања уместо потрошача наводи 0
(NULL
), ослобађа се одабрано прикључно место извора. Приликом уписа у излазни ток у првом реду се пише називна снага и тренутно оптерећење извора, а у наредним редовима се пишу садржани потрошачи, по један ред за свако прикључно место.
Написати на језику C++ функцију за читање с главног улаза једног потрошача произвољног типа и главну функцију која читајући податке с главног улаза направи један извор, додаје потрошаче док се не прочита "празан" потрошач или не дође до грешке и испише на главном излазу завршно стање извора.
ispitx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.Z
.// potrosac.h #ifndef _potrosac_h_ #define _potrosac_h_ #include <iostream> using namespace std; class Potrosac { public: virtual ~Potrosac() {} virtual double snaga() const =0; virtual Potrosac* kopija() const =0; private: virtual void pisi( ostream& it) const =0; friend ostream& operator<<( ostream& it, const Potrosac& p) { p.pisi( it); return it; } }; #endif(садржај)
// uredjaj.h #ifndef _uredjaj_h_ #define _uredjaj_h_ #include "potrosac.h" #include <iostream> #include <cstring> using namespace std; class Uredjaj: public Potrosac { char* naz; double sna; void kopiraj( const char* n, double s) { naz = new char [strlen(n)+1]; strcpy( naz, n); sna = s; } void brisi() { delete [] naz; } void pisi( ostream&it) const { it << naz << '(' << sna << ')'; } public: Uredjaj( const char* n, double s) { kopiraj( n, s); } Uredjaj( const Uredjaj& u) { kopiraj(u.naz,u.sna); } ~Uredjaj() { brisi(); } Uredjaj& operator=( const Uredjaj& u) { if (this != &u) { brisi(); kopiraj(u.naz,u.sna); } return *this; } double snaga () const { return sna; } Uredjaj* kopija() const {return new Uredjaj(*this);} }; #endif
// grupa.h #ifndef _grupa_h_ #define _grupa_h_ #include "potrosac.h" #include <iostream> using namespace std; class Grupa: public Potrosac { struct Elem { Potrosac* potr; Elem* sled; Elem (Potrosac* p) { potr = p; sled = 0; } ~Elem() { delete potr; } }; Elem *prvi, *posl; double sna; void kopiraj( const Grupa& g); void brisi(); void pisi( ostream& it) const; public: Grupa() { prvi = posl = 0; } Grupa( const Grupa& g) { kopiraj( g); } ~Grupa() { brisi(); } Grupa& operator=( const Grupa& g) { if (this != &g) { brisi(); kopiraj( g); } return *this; } Grupa& operator+=( const Potrosac& p) { Elem* novi = new Elem (p.kopija()); posl = (!prvi ? prvi : posl->sled) = novi; sna += p.snaga (); return *this; } double snaga() const { return sna; } Grupa* kopija() const { return new Grupa( *this); } }; #endif
// grupa.cpp #include "grupa.h" void Grupa::kopiraj( const Grupa& g){ prvi = posl = 0; for (Elem* tek=g.prvi; tek; tek=tek->sled) { Elem* novi = new Elem (tek->potr->kopija()); posl = (!prvi ? prvi : posl->sled) = novi; } sna = g.sna; } void Grupa::brisi() { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } posl = 0; } void Grupa::pisi( ostream& it) const { it << '['; for (Elem* tek=prvi; tek; tek=tek->sled) { it << *tek->potr; if (tek->sled) it << ','; } it << ']'; }
// izvor.h #ifndef _izvor_h_ #define _izvor_h_ #include "potrosac.h" #include <iostream> using namespace std; class GIndeks{}; inline ostream& operator<<( ostream& it, const GIndeks&) { return it << "*** Nedozvoljen indeks!"; } class GPreopt {}; inline ostream& operator<<( ostream& it, const GPreopt&) { return it << "*** Preopterecen izvor!"; } class Izvor { Potrosac** niz; int kap; double sna, opt; Izvor( const Izvor&) {} void operator=( const Izvor&) {} public: Izvor( double s, int k); ~Izvor(); double snaga() const { return sna; } double opterecenje() const { return opt; } int brMesta() const { return kap; } Izvor& prikljuci( Potrosac* p, int i); friend ostream& operator<<( ostream& it, const Izvor& izv); }; #endif
// izvor.cpp #include "izvor.h" Izvor::Izvor (double s, int k) { niz = new Potrosac* [kap = k]; for (int i=0; i<kap; niz[i++]=0); sna = s; opt = 0; } Izvor::~Izvor() { for (int i=0; i<kap; delete niz[i++]); delete [] niz; } Izvor& Izvor::prikljuci( Potrosac* p, int i) { if (i<0 || i>= kap) throw GIndeks(); if (niz[i]) { opt -= niz[i]->snaga(); delete niz[i]; niz[i] = 0; } if (p) { double s = p->snaga (); if (opt+s > sna) throw GPreopt(); niz[i] = p; opt += s; } return *this; } ostream& operator<<( ostream& it, const Izvor& izv) { it << izv.opt << '/' << izv.sna << endl; for (int i=0; i<izv.kap; i++) { it << i << ": "; if (izv.niz[i]) it << *izv.niz[i]; else it << "<< prazan >>"; it << endl; } return it; }
// test.cpp #include "uredjaj.h" #include "grupa.h" #include "izvor.h" #include <iostream> using namespace std; Potrosac* citaj () { cout << "Tip (U,G,.)? "; char izb; cin >> izb; switch (izb) { case 'u': case 'U': { cout << "Vrsta? "; char v[20]; cin >> v; cout << "Snaga? "; double s; cin >> s; return new Uredjaj( v, s); } case 'g': case 'G': { Grupa* g = new Grupa (); while (Potrosac* p = citaj()) { *g += *p; delete p; } return g; } default: return 0; } } int main () { cout << "Snaga izvora? "; double s; cin >> s; cout << "Broj prikljucaka? "; int k; cin >> k; Izvor izv(s, k); try { while (true) { Potrosac* p = citaj(); if (!p) break; cout << "Prikljucak? "; int i; cin >> i; izv.prikljuci( p, i); } } catch (const GIndeks& g) { cout << g << endl; } catch (const GPreopt& g) { cout << g << endl; } cout << izv << endl; return 0; }
Snaga izvora? 1000 Broj prikljucaka? 5 Tip (U,G,.)? u Vrsta? sijalica Snaga? 100 Prikljucak? 3 Tip (U,G,.)? g Tip (U,G,.)? u Vrsta? tv Snaga? 300 Tip (U,G,.)? u Vrsta? radio Snaga? 150 Tip (U,G,.)? . Prikljucak? 1 Tip (U,G,.)? u Vrsta? reso Snaga? 1000 Prikljucak? 0 *** Preopterecen izvor! 550/1000 0: << prazan >> 1: [tv(300),radio(150)] 2: << prazan >> 3: sijalica(100) 4: << prazan >>
Copyright © 2011, Laslo Kraus
Последња ревизија: 7.5.2011.