![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Прва група 15. 6. 2007. |
---|
I – Написати на језику C++ апстрактну класу за потрошаче електричне енргије. Предвидети:
it<<potr
).
II – Написати на језику C++ класу за електричне уређаје као изведену класу из класе потрошача. Уређај се у излазни ток пише у облику "врста(
снага)
". Поред могућности основне класе предвидети:
uredjaj1=uredjaj2
).
III – Написати на језику C++ класу за групе потрошача као изведену класу из класе потрошача. Група може да садржи произвољан број потрошача. У излазни ток се пише у облику "[
потр,…,
потр]
". Поред могућности основне класе предвидети:
grupa1=grupa2
),
IV – Написати на језику C++ класу за изворе електричне енергије на које могу да се прикључе потрошачи. Предвидети:
it<<izvor
– у првом реду се пише тренутно оптерећење и називна снага извора, а у преосталим редовима потрошачи на појединим прикључцима).
V – Написати на језику C++ програм који направи један извор, прикључи на њега неколико уређаја и испише извор на главном излазу. Користити константне параметре извора и уређаја (не треба ништа читати с главног улаза).
Грешке пријављивати изузецима типа једноставних класа које могу да уписују поруке о грешкама у излазни ток.
ispitx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.N:
(Nastava
on
\\Xs200-2
) у каталогу ObjektnoProg\RSx
(x
је број радне станице за којим се ради).// potrosac.h #ifndef _potrosac_h_ #define _potrosac_h_ #include <iostream> using namespace std; class Potrosac { virtual void pisi (ostream& it) const =0; friend ostream& operator<< (ostream& it, const Potrosac& p) { p.pisi (it); return it; } public: virtual ~Potrosac () {} virtual double snaga () const =0; virtual Potrosac* kopija () const =0; }; #endif(садржај)
// uredjaj.h #ifndef _uredjaj_h_ #define _uredjaj_h_ #include "potrosac.h" #include <cstring> using namespace std; class Uredjaj: public Potrosac { char* vrs; double sna; void kopiraj (const Uredjaj& u) { vrs = strcpy (new char[strlen(u.vrs)+1],u.vrs); sna = u.sna; } void pisi (ostream& it) const { it << vrs << '(' << sna << ')'; } public: Uredjaj (const char* v, double) { vrs = strcpy (new char[strlen(v)+1], v); sna = s; } Uredjaj (const Uredjaj& u) { kopiraj (u); } ~Uredjaj () { delete [] vrs; } Uredjaj& operator= (const Uredjaj& u) { if (this != &u) { delete [] vrs; kopiraj (u); } 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; 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; } double snaga () const; Grupa* kopija () const { return new Grupa (*this); } Grupa& dodaj (const Potrosac& p) { Elem* novi = new Elem (p.kopija()); posl = (!prvi ? prvi : posl->sled) = novi; return *this; } }; #endif
// grupa.cpp #include "grupa.h" void Grupa::kopiraj (const Grupa& g) { prvi=posl=0; for (Elem* tek=prvi; tek; tek=tek->sled) dodaj (*tek->potr); } 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 << ']'; } double Grupa::snaga () const { double s = 0; for (Elem* tek=prvi; tek; tek=tek->sled) s += tek->potr->snaga (); return s; }
// 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 << "*** Indeks izvan opsega!"; } class GOpter {}; inline ostream& operator<< (ostream& it, const GOpter&) { 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 () { delete [] niz; } double snaga () const { return sna; } double opter () 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) { sna = s; opt = 0; niz = new Potrosac* [kap = k]; for (int i=0; i<kap; niz[i++]=0); } Izvor& Izvor::prikljuci (Potrosac* p, int i) { if (i<0 || i>=kap) throw GIndeks (); double op = opt; if (niz[i]) op -= niz[i]->snaga (); if (p) op += p->snaga (); if (op > sna) throw GOpter (); niz[i] = p; opt = op; 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] << endl; else it << "<< prazno >>\n"; } return it; }
// program.cpp #include "uredjaj.h" #include "grupa.h" #include "izvor.h" #include <iostream> using namespace std; int main () { Izvor izv (1000, 5); Uredjaj sij ("sijalica", 100); Grupa gr; gr.dodaj (Uredjaj ("tv", 300)) .dodaj (Uredjaj ("radio", 150)); Uredjaj res ("reso", 1000); try { izv.prikljuci (&sij, 3); izv.prikljuci (&gr, 1); izv.prikljuci (&res, 0); } catch (GIndeks g) { cout << g << endl; } catch (GOpter g) { cout << g << endl; } cout << izv; return 0; }
*** Preopterecen izvor! 550/1000 0: << prazno >> 1: [tv(300),radio(150)] 2: << prazno >> 3: sijalica(100) 4: << prazno >>
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.