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

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

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

Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене исписивањем поруке):

Написати на језику C++ функцију за читање с главног улаза једног потрошача произвољног типа и главну функцију која читајући податке с главног улаза направи један извор, додаје потрошаче док се не прочита "празан" потрошач или не дође до грешке и испише на главном излазу завршно стање извора.


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


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

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

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