// integroi.cpp // Integroidaan f(x) valilta [0,pi] // Käytetään metodi-osoitinta. Metodiosoitinta ei voi käyttää ilman // tietoa oliosta. Metodiosoitin on vain siirtymä olion // virtuaalifunktiotaulussa (vtbl). // vl 24.3.2002 #include #include using std::sin; using std::cos; using std::cout; using std::ostream; class cPerusFunktio { public: virtual double f(double x) const = 0; virtual void tulosta(ostream &) const { } virtual double intfun(double x) const { return 0; } virtual double derfun(double x) const { return 0; } virtual double defint(double x1, double x2) const { return intfun(x2)-intfun(x1); } }; ostream &operator<<(ostream &os,const cPerusFunktio &p) { p.tulosta(os); return os; } class cPoly2 : public cPerusFunktio { double a,b,c; public: cPoly2(double ia,double ib,double ic) : a(ia), b(ib), c(ic) {} virtual double f(double x) const { return (a*x+ b)*x + c; } virtual void tulosta(ostream &os) const { if ( a != 0 ) { if ( a != 1 ) os << a << "*"; os << "x^2"; }; if ( a != 0 && b > 0 ) os << " + "; if ( b != 0 ) { if ( b != 1 ) os << b << "*"; os << "x"; } if ( ( a != 0 || b != 0 ) && c > 0 ) os << " + "; if ( c != 0 ) os << c; } virtual double intfun(double x) const { return ((a/3.0*x + b/2.0)*x + c)*x; } virtual double derfun(double x) const { return 2*a*x + b; } }; class cSin : public cPerusFunktio { public: virtual double f(double x) const { return sin(x); } virtual void tulosta(ostream &os) const { os << "sin(x)"; } virtual double intfun(double x) const { return -cos(x); } virtual double derfun(double x) const { return cos(x); } }; typedef double (cPerusFunktio::*pMetodi)(double x) const; double integroi(const cPerusFunktio &p,pMetodi f,double x1, double x2, int tiheys) { double x,dx,summa=0; dx = (x2- x1)/tiheys; for (x=x1+dx/2 ; x