Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - колоквијуми
Други колоквијум
Прва група
15. 6. 2007.

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

I – Написати на језику C++ апстрактну класу за потрошаче електричне енргије. Предвидети:

  1. уништавање потрошача,
  2. одређивање снаге потрошача,
  3. стварање динамичке копије потрошача,
  4. уписивање потрошача у излазни ток (it<<potr).

II – Написати на језику C++ класу за електричне уређаје као изведену класу из класе потрошача. Уређај се у излазни ток пише у облику "врста(снага)". Поред могућности основне класе предвидети:

  1. иницијализацију уређаја задатом називом врсте уређаја и снагом,
  2. иницијализацију уређаја другим уређајем,
  3. додељивање вредности једног уређаја другом (uredjaj1=uredjaj2).

III – Написати на језику C++ класу за групе потрошача као изведену класу из класе потрошача. Група може да садржи произвољан број потрошача. У излазни ток се пише у облику "[потр,,потр]". Поред могућности основне класе предвидети:

  • иницијализацију празне групе потрошача,
  • иницијализацију групе другом групом,
  • додељивање вредности једне групе другој групи (grupa1=grupa2),
  • додавање потрошача групи.

    IV – Написати на језику C++ класу за изворе електричне енергије на које могу да се прикључе потрошачи. Предвидети:

    1. иницијализацију празног извора задатом називном снагом и бројем прикључних места,
    2. спречавање да се направи копија извора на било који начи,
    3. уништавање извора,
    4. дохватање називне снаге, тренутног оптерећења и броја прикључних места извора,
    5. прикључивање потрошача на задати прикључак извора (извор не постаје власник потрошача – грешка је ако је редни број приључка изван опсега или ако би се извор преоптеретио – ако на одабраном месту постоји потрошач, исти се одвезује од извора – навођењем "празног" потрошача постиже се одвезивање потрошача са одабраног прикључка),
    6. уписивање извора у излазни ток (it<<izvor – у првом реду се пише тренутно оптерећење и називна снага извора, а у преосталим редовима потрошачи на појединим прикључцима).

    V – Написати на језику C++ програм који направи један извор, прикључи на њега неколико уређаја и испише извор на главном излазу. Користити константне параметре извора и уређаја (не треба ништа читати с главног улаза).

    Грешке пријављивати изузецима типа једноставних класа које могу да уписују поруке о грешкама у излазни ток.


    Напомене (садржај)


    Решење задатка (поставка | садржај)

    // 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 >>
    (садржај)
             
    Аутор: Ласло Краус
    Е-пошта: kraus@etf.rs

    Copyright © 2010, Laslo Kraus
    Последња ревизија: 4.10.2010.