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 :
Je mets le code IntegrTrapezes.cxx :
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 /** * * @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()
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
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()Je ne comprends pas pourquoi faire un pointeur m�lang� avec un double... J'ai du mal.
Code : S�lectionner tout - Visualiser dans une fen�tre � part typedef double (*FdeX) (double);
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 :ligne 35.
Code : S�lectionner tout - Visualiser dans une fen�tre � part typedef IUnaryFunction <double, double> CUnFctor_dd;
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 !![]()
Partager