![]() Ласло Краус |
Објектно програмирање 1 - колоквијуми Други колоквијум 15. 6. 2013. |
---|
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене исписивањем поруке):
fun(x)
), да се створи функција која представља њен извод (!fun
– враћа се показивач), да се створи полиморфна копија функције и да се функција упише у излазни ток (it<<fun
).
*x^
b, где су a и b вредности параметара монома.
*exp(
b*
x), где су a и b вредности параметара експоненцијалне функције.
zbir+=fun
). Покушај стављања функције у пун збир је грешка. Вредност збира функција је збир вредности садржаних функција. Извод збира функција је збир извода садржаних функција. Збир функција у излазни ток се уписује у уоблику (
fun)+…+(
fun)
, где је fun резултат уписивања једне садржане функције.
програм
који читајући потребних података направи збир функција, додаје неколико функција, испише добијени збир функција и његов извод и после табелира вредности збира функција и његовог извода за свако xmin≤x≤xmax са кораком Δx. Програм треба да понавља претходне кораке све док за капацитет збира функција не прочита недозвољену вредност.
ispitx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.Z
.// 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
Copyright © 2014, Laslo Kraus
Последња ревизија: 28.4.2014.