Travail à effectuer
Créez le projet FunctorIntegrTrapezes.
Dans votre fichier main.cpp copier le fichier IntegrTrapezes.cpp Intégration par la méthode des trapèzes d’un ancien TP.
/**
*
* @file IntegrTrapezes.cpp
*
* @authors D. Mathieu
*
* @date 06/11/2007
*
* @version V1.0
*
* @brief Integration par la methodes des trapezes au moyen de
* pointeurs de fonctions
*
**/
#include <iostream>
#include <cmath> // cos(), sin(), M_PI_2
using namespace std;
namespace
{
typedef double (*fdeX) (double);
double integrTrapezes (fdeX f, double a, double b, unsigned n)
{
double s = (f (a) + f (b)) / 2.0;
double delta = (b - a) / double (n);
for ( ; --n; ) s += f (a += delta);
return s * delta;
} // integrTrapezes
void testIntegrTrapezes (void)
{
cout << "IntegrTrapezes : \n\n";
cout << "Methode des trapezes : \n";
cout << "S (cos (x)) entre 0 et +Pi/2 avec 5 intervalles = "
<< integrTrapezes (cos, 0, M_PI_2, 5) << '\n';
cout << "S (cos (x)) entre 0 et +Pi/2 avec 10 intervalles = "
<< integrTrapezes (cos, 0, M_PI_2, 10) << '\n';
cout << "S (cos (x)) entre 0 et +Pi/2 avec 50 intervalles = "
<< integrTrapezes (cos, 0, M_PI_2, 50) << '\n';
cout << "S (cos (x)) entre 0 et +Pi/2 avec 100 intervalles = "
<< integrTrapezes (cos, 0, M_PI_2, 100) << '\n';
cout << '\n';
cout << "S (sin (x)) entre -Pi/2 et 0 avec 5 intervalles = "
<< integrTrapezes (sin, -M_PI_2, 0, 5) << '\n';
cout << "S (sin (x)) entre -Pi/2 et 0 avec 10 intervalles = "
<< integrTrapezes (sin, -M_PI_2, 0, 10) << '\n';
cout << "S (sin (x)) entre -Pi/2 et 0 avec 50 intervalles = "
<< integrTrapezes (sin, -M_PI_2, 0, 50) << '\n';
cout << "S (sin (x)) entre -Pi/2 et 0 avec 100 intervalles = "
<< integrTrapezes (sin, -M_PI_2, 0, 100) << '\n';
} // TestIntegrTrapezes()
} // namespace anonyme
int main (void)
{
testIntegrTrapezes ();
return 0;
} // main()
Dans son espace de noms anonyme, ajoutez la classe générique abstraite IUnaryFunction suivante (écrite dans l’exercice Functors et algorithmes de recherche) :
template <typename T, typename TRes>
class IUnaryFunction
{
public :
virtual ~IUnaryFunction (void) {}
virtual TRes operator () (const T &) const noexcept = 0;
}; // IUnaryFunction
Instanciez-la en déclarant le type UnFctor_dd pour que l’opérateur () puisse remplacer les fonctions sin() et cos().
Dérivez-la en deux classes FctorSin et CFctorCos où tout est public, en surchargeant l’opérateur () qui doit appeler respectivement les fonctions sin() et cos().
Modifiez en conséquence les fonctions integrTrapezes() et testIntegrTrapezes().
Compilez et testez.
Ne pas oublier de sauvegarder les fichiers sources du projet sur github.