![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Прва група 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.