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

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

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

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

Написати на језику C++ програм који читајући потребних података направи збир функција, додаје неколико функција, испише добијени збир функција и његов извод и после табелира вредности збира функција и његовог извода за свако xminxxmax са кораком Δx. Програм треба да понавља претходне кораке све док за капацитет збира функција не прочита недозвољену вредност.

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


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

// fun.h

#ifndef _fun_h_
#define _fun_h_
#include <iostream>
using namespace std;

class Fun {
  virtual void pisi(ostream& it) const =0;
public:
  virtual ~Fun() {}
  virtual double operator()(double x) const =0;
  virtual Fun* operator!() const =0;
  virtual Fun* kopija() const =0;
  friend ostream& operator<<(ostream& it, const Fun& f)
    { f.pisi(it); return it; }
};

#endif

// monom.h #ifndef _monom_h_ #define _monom_h_ #include "fun.h" #include <iostream> #include <cmath> using namespace std; class Monom: public Fun { double a, b; void pisi(ostream& it) const { it << a << "*x^" << b; } public: explicit Monom(double aa=1, double bb=1) { a = aa; b = bb; } double operator()(double x) const { return (x || b>=0) ? a * pow(x, b) : 0; } Monom* operator!() const { return new Monom(a*b, b-1); } virtual Monom* kopija() const { return new Monom(*this); } }; #endif
// ekspon.h #ifndef _ekspon_h_ #define _ekspon_h_ #include "fun.h" #include <iostream> #include <cmath> using namespace std; class Ekspon: public Fun { double a, b; void pisi(ostream& it) const { it << a << "*exp(" << b << "*x)"; } public: explicit Ekspon(double aa=1, double bb=1) { a = aa; b = bb; } double operator()(double x) const { return a * exp(b * x); } Ekspon* operator!() const { return new Ekspon(a*b, b); } virtual Ekspon* kopija() const { return new Ekspon(*this); } }; #endif
// gzbirfunpun.h #ifndef _gzbirfunpun_h_ #define _gzbirfunpun_h_ #include <iostream> using namespace std; class GZbirFunPun {}; inline ostream& operator<<(ostream& it, const GZbirFunPun&) { return it << "*** Zbir funkcija je puna!"; } #endif
// zbirfun.h #ifndef _zbirfun_h_ #define _zbirfun_h_ #include "fun.h" #include "gzbirfunpun.h" #include <iostream> using namespace std; class ZbirFun: public Fun { Fun** niz; int kap, duz; void kopiraj(const ZbirFun& zf); void brisi() { delete [] niz; } void pisi(ostream& it) const; public: explicit ZbirFun(int k=3) { niz = new Fun* [kap = k]; duz = 0; } ZbirFun(const ZbirFun& zf) { kopiraj(zf); } ZbirFun& operator=(const ZbirFun& zf) { if (this != &zf) { brisi(); kopiraj(zf); } return *this; } ~ZbirFun() { brisi(); } ZbirFun& operator+=(const Fun& f) { if (duz == kap) throw GZbirFunPun(); niz[duz++] = f.kopija(); return *this; } double operator()(double x) const; ZbirFun* operator!() const; virtual ZbirFun* kopija() const { return new ZbirFun(*this); } }; #endif
// zbirfun.cpp #include "zbirfun.h" void ZbirFun::kopiraj(const ZbirFun& zf) { niz = new Fun* [kap = zf.kap]; duz = zf.duz; for (int i=0; i<duz; i++) niz[i] = zf.niz[i]->kopija(); } void ZbirFun::pisi(ostream& it) const { for (int i=0; i<duz; i++) { if (i > 0) it << '+'; it << '(' << *niz[i] << ')'; } } double ZbirFun::operator()(double x) const { double s = 0; for (int i=0; i<duz; s+=(*niz[i++])(x)); return s; } ZbirFun* ZbirFun::operator!() const { ZbirFun* zi = new ZbirFun(duz); for (int i=0; i<duz; i++) { Fun *iz = !*niz[i]; *zi += *iz; delete iz; } return zi; }
// program.cpp #include "fun.h" #include "monom.h" #include "ekspon.h" #include "gzbirfunpun.h" #include "zbirfun.h" #include <iostream> using namespace std; int main() { while (true) { try { cout << "kapacitet? "; int k; cin >> k; if (k <= 0) break; ZbirFun zbir(k); bool kraj = false; while (!kraj) { try { cout << "Vrsta (M, E, *)? "; char vrs; cin >> vrs; double a, b; switch (vrs) { case 'm': case 'M': cout << "a,b? "; cin >> a >> b; zbir += Monom(a, b); break; case 'e': case 'E': cout << "a,b? "; cin >> a >> b; zbir += Ekspon(a, b); break; case '*': kraj = true; break; default: throw "*** Nedozvoljen izbor"; break; } } catch (const char* g) { cout << g << endl; } } Fun* izvod = !zbir; cout << "Fun= " << zbir << endl; cout << "Izv= " << *izvod << endl; cout << "xmin,xmzx,dx? "; double xmin, xmax, dx; cin >> xmin >> xmax >> dx; for (double x=xmin; x<=xmax; x+=dx) cout << x << '\t' << zbir(x) << '\t' << (*izvod)(x) << endl; } catch (GZbirFunPun g) { cout << g << endl; } cout << endl; } return 0; }
kapacitet? 5 Vrsta (M, E, *)? m a,b? 4 2 Vrsta (M, E, *)? e a,b? .5 -2 Vrsta (M, E, *)? m a,b? 3 4 Vrsta (M, E, *)? * Fun= (4*x^2)+(0.5*exp(-2*x))+(3*x^4) Izv= (8*x^1)+(-1*exp(-2*x))+(12*x^3) xmin,xmzx,dx? -2 2 .5 -2 91.2991 -166.598 -1.5 34.2303 -72.5855 -1 10.6945 -27.3891 -0.5 2.54664 -8.21828 0 0.5 -1 0.5 1.37144 5.13212 1 7.06767 19.8647 1.5 24.2124 52.4502 2 64.0092 111.982 kapacitet? 1 Vrsta (M, E, *)? e a,b? 1 2 Vrsta (M, E, *)? x *** Nedozvoljen izbor Vrsta (M, E, *)? m a,b? 3 4 *** Zbir funkcija je puna! kapacitet? 0
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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