Bonjour,
Je suis en train de refaire tous les TP que j'ai fais en cours C++ pour m'entrainer à la dérivation de classe, polymorphisme... Car j'ai du mal avec ces notions.

J'ai une correction de l'exercice mais il y a plusieurs bouts de code que je ne comprends pas. Je mets la consigne en premier :

Nom : Capture.JPG
Affichages : 255
Taille : 86,8 Ko

Je mets le code IntegrTrapezes.cxx :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
*
* @file    IntegrTrapezes.cxx
*
* @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
{
	template <typename T, typename TRes>
	class IUnaryFunction
	{
	public:
		virtual ~IUnaryFunction(void) {}
		virtual TRes operator () (const T &) const throw () = 0;
 
	}; // IUnaryFunction
 
	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()
{
	TestIntegrTrapezes();
 
	return 0;
 
} // main()
Voici la correction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
/**
 *
 * @file     FunctorIntegrTrapezes.cxx
 *
 * @authors  D. Mathieu
 *
 * @date     07/12/2011
 *
 * @version  V1.0
 *
 * @brief    Integration par la methodes des trapezes au moyen de
 *             functor
 
 *
 **/
#include <iostream>
#include <cmath>               // cos(), sin(), M_PI_2
 
using namespace std;
 
#define classdef typedef
 
namespace 
{
    template <typename T, typename TRes>
    class IUnaryFunction
    {
      public :
        virtual ~IUnaryFunction (void) {}
        virtual TRes operator () (const T &) const throw () = 0;
 
    }; // IUnaryFunction
 
    typedef IUnaryFunction <double, double> CUnFctor_dd;
 
    struct CFctor_cos : public CUnFctor_dd
    {
        virtual ~CFctor_cos() {}
        virtual double operator() (const double & x) const throw ()
        {
            return cos (x); 
 
        } // operator()
 
    }; // CFctor_cos
 
    struct CFctor_sin : public CUnFctor_dd
    {
        virtual ~CFctor_sin() {}
        virtual double operator() (const double & x) const throw ()
        {
            return sin (x); 
 
        } // operator()
 
    }; // CFctor_sin
 
    double IntegrTrapezes (const CUnFctor_dd & 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 (CFctor_cos(), 0, M_PI_2,   5) << '\n';
 
        cout << "S (cos (x)) entre 0 et +Pi/2  avec  10 intervalles = " 
             << IntegrTrapezes (CFctor_cos(), 0, M_PI_2,  10) << '\n';
 
        cout << "S (cos (x)) entre 0 et +Pi/2  avec  50 intervalles = " 
             << IntegrTrapezes (CFctor_cos(), 0, M_PI_2,  50) << '\n';
 
        cout << "S (cos (x)) entre 0 et +Pi/2  avec 100 intervalles = " 
             << IntegrTrapezes (CFctor_cos(), 0, M_PI_2, 100) << '\n';
 
        cout << '\n';
 
        cout << "S (sin (x)) entre -Pi/2 et 0  avec   5 intervalles = " 
             << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0,   5) << '\n';
 
        cout << "S (sin (x)) entre -Pi/2 et 0  avec  10 intervalles = " 
             << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0,  10) << '\n';
 
        cout << "S (sin (x)) entre -Pi/2 et 0  avec  50 intervalles = " 
             << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0,  50) << '\n';
 
        cout << "S (sin (x)) entre -Pi/2 et 0  avec 100 intervalles = " 
             << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0, 100) << '\n';
 
    } // TestIntegrTrapezes()
 
} // namespace
 
int main()
{
    TestIntegrTrapezes ();
 
    return 0;
 
} // main()
La première ligne que je ne comprends pas c'est dans le fichier IntegrTrapezes.cxx ligne 23,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 typedef double (*FdeX) (double);
Je ne comprends pas pourquoi faire un pointeur mélangé avec un double... J'ai du mal.

Maintenant dans le fichier FunctorIntegrTrapezes.cxx
Si j'ai bien compris, on dérive la classe IUnaryFunction en deux nouvelles classes cos et sin mais pourquoi faire cela car on utilisait une seule classe avant ? Est-ce pour qu'elle accepte plusieurs types de données ? ça ne m'a pas l'air d'être cela car on définit un typedef juste après (je ne comprends pas non plus ce typedef :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef IUnaryFunction <double, double> CUnFctor_dd;
ligne 35.

Enfin ligne 37, on définit une structure que l'on dérive, pourquoi faire cela ? Quand j'ai essayé de faire l'exercice j'ai crée une classe et non une structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
struct CFctor_cos : public CUnFctor_dd
.
Merci de votre aide !